1
forest520 2014-09-11 08:34:17 +08:00
默认情况下,可能会一行分到不同的block。
如果希望按自己的方式切分块,需要自定义相关的类。 |
2
bbx 2014-09-11 09:32:47 +08:00
这个问题最简单的解决方法就是,你把你有关联的行,都放在一行,用分隔符分割,读到mapper里面再分割。
|
3
harrychuh 2014-09-11 09:39:19 +08:00 via Android
hdfs对于客户端是透明的,文件是以什么形式分块存储的,是64MB还是其他大小,从哪里开始分割,客户端无需关心,一次全部读入内存或者逐行读取,你都不需要关心文件是否半截在另外一个block中,关注自己程式的逻辑即可
|
4
RangerWolf OP |
5
flynnX 2014-09-11 11:45:41 +08:00 1
可以参考下这个,hadoop如何处理跨block的行, http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-records-split-across-block-boundaries 按照@bbx的方法比较简单些,一行就是一个session
|
6
bbx 2014-09-11 12:39:13 +08:00 1
@RangerWolf 如果你是随便玩儿玩儿,那就随便搞,无所谓。如果你明天deadline,就按照我说的搞就行了。。。工作中,肯定是怎么方便正确怎么来
|
7
YORYOR 2014-09-11 15:07:03 +08:00 1
自定义一个writable类包含这写相关联的行的信息即可
|
8
RangerWolf OP |
9
20150517 2014-09-11 18:00:09 +08:00 via Android
我用hive的,感觉block是透明的,数据是以partiton为单位的
|
10
firstway 2014-09-12 11:06:43 +08:00 2
如果block设置为64M,那么每个block就是64M,除了最后一个block可能不满64M,
block是不会考虑一行几行的,行或session概念是业务层面,hdfs是不会涉及的。 那么怎么在map阶段怎么处理行或session的边界问题,实际上由reader来处理的。 代码参考: org.apache.hadoop.mapred.LineRecordReader.LineReader 简要来说,如果一行跨越了block,比如一行10个字节,前4个字节在第N个block,后6个在N+1个block里面,reader来处理,怎么处理? 因为reader是per block,就是一个block一个(准确的说是一个split一个), 第N个reader会留下最后4个字节不读,第N+1个reader会网络读取第N个block末尾一部分数据,足以包含那4个字节就行了。 到底是前面不读后面读, 还是前面读,后面不读,其实都行,在reader里面实现一种就行了。 本人有hadoop应用和hadoop本身开发不少经验,不会有错的。 |
11
RangerWolf OP @firstway 赞! 那如果在业务层面要处理的是session或者说是几行字符串为一个单位,那是不是要自己实现一个Reader? 比如默认的是LineReader,我这边的情况就需要自己搞定一个SessionReader ? 问题比较多~ 经验不足,见谅~
|
12
firstway 2014-09-13 05:59:20 +08:00
@RangerWolf
是的,如果你们有自己分割逻辑,需要自己定义SessionReader,不过很简单,读懂LineReader,仿照写,花不了多少功夫,写完后对这些认识会更进一步。 |
13
RangerWolf OP @firstway 非常非常感谢!
|