firstway
2014-09-12 11:06:43 +08:00
如果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本身开发不少经验,不会有错的。