Hadoop 对于大文件是如何切分的?是按照行进行切分吗?

2014-09-11 07:39:35 +08:00
 RangerWolf
有一个文件,虽然每行一条记录,但是上下几行之间都是有相关关系的,相当于一个Session。session之间通过空行分隔。

刚用上Hadoop,不太了解内部机制。看书说大文件会被切分成64MB一个block。我想会不会一个session被分到不同的block? 如果希望按照空行进行切分,当然block的size还是尽量大,有什么参考资料吗?

多谢啦!
9991 次点击
所在节点    Hadoop
13 条回复
forest520
2014-09-11 08:34:17 +08:00
默认情况下,可能会一行分到不同的block。
如果希望按自己的方式切分块,需要自定义相关的类。
bbx
2014-09-11 09:32:47 +08:00
这个问题最简单的解决方法就是,你把你有关联的行,都放在一行,用分隔符分割,读到mapper里面再分割。
harrychuh
2014-09-11 09:39:19 +08:00
hdfs对于客户端是透明的,文件是以什么形式分块存储的,是64MB还是其他大小,从哪里开始分割,客户端无需关心,一次全部读入内存或者逐行读取,你都不需要关心文件是否半截在另外一个block中,关注自己程式的逻辑即可
RangerWolf
2014-09-11 10:16:14 +08:00
@forest520
@bbx
@harrychuh 汗啊~ 楼上几位讲的好像都不太一样
flynnX
2014-09-11 11:45:41 +08:00
可以参考下这个,hadoop如何处理跨block的行, http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-records-split-across-block-boundaries 按照@bbx的方法比较简单些,一行就是一个session
bbx
2014-09-11 12:39:13 +08:00
@RangerWolf 如果你是随便玩儿玩儿,那就随便搞,无所谓。如果你明天deadline,就按照我说的搞就行了。。。工作中,肯定是怎么方便正确怎么来
YORYOR
2014-09-11 15:07:03 +08:00
自定义一个writable类包含这写相关联的行的信息即可
RangerWolf
2014-09-11 17:28:19 +08:00
@flynnX 这个我之前也搜到了~ 我看上面的描述是Hadoop默认会针对行进行处理 但是不同的行,类似这样的一个session,简单的还会按照@bbx来好了~ 只是首先还要将全文处理一边。
20150517
2014-09-11 18:00:09 +08:00
我用hive的,感觉block是透明的,数据是以partiton为单位的
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本身开发不少经验,不会有错的。
RangerWolf
2014-09-12 12:41:26 +08:00
@firstway 赞! 那如果在业务层面要处理的是session或者说是几行字符串为一个单位,那是不是要自己实现一个Reader? 比如默认的是LineReader,我这边的情况就需要自己搞定一个SessionReader ? 问题比较多~ 经验不足,见谅~
firstway
2014-09-13 05:59:20 +08:00
@RangerWolf
是的,如果你们有自己分割逻辑,需要自己定义SessionReader,不过很简单,读懂LineReader,仿照写,花不了多少功夫,写完后对这些认识会更进一步。
RangerWolf
2014-09-13 08:01:49 +08:00
@firstway 非常非常感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/132811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX