【发布时间】:2017-09-08 06:19:57
【问题描述】:
在 Hadoop 中,我有一个 3GB 大小的序列文件。我想并行处理它。因此,我将创建 8 个 maptasks 和 8 个 FileSplits。
FileSplit 类的构造函数需要:
Path of the file
Start position
Length
例如,第一次拆分可以从 0 开始,长度为 3GB/8,下一次从 3GB/8 开始,长度为 3GB/8,依此类推。
现在 SequenceFile.Reader 有一个使用相同的构造函数:
Path of the file
Start position
Length
对于第一次拆分(从 0 开始,长度为 3Gb/8),序列文件能够读取它,因为它包含文件头、压缩类型以及有关键和值类的信息。
但是,对于其他拆分,SequenceFile.Reader 无法读取拆分,因为我认为文件的该部分不包含序列文件的标头(因为文件拆分不是从 0 ),因此当我尝试使用序列文件时它会抛出 NullPointerException。
那么有没有办法从序列文件中拆分文件?
【问题讨论】:
-
你需要知道文件的块位置吗? (如果是这样,您可以使用“hdfs fsck
-files -blocks -locations”来获取位置并发送到 8 个不同的地图,以便它们可以并行处理。 -
@DeepanRam 块与拆分不同。我想从序列文件中拆分文件以用于 map reduce 编程。
-
现在我得到了您的要求,您可以使用 hadoop 的 SequenceFileInputFormat 并让它自己完成所有计算。我共享的命令将显示文件的总拆分(仅供参考),对于每个拆分,将生成一个地图任务。这也有助于我们计算将针对此输入文件生成多少地图。
-
@DeepanRam 感谢您提供信息,但我之前尝试过 SequenceFileInputFormat,我认为您无法使用它设置映射或拆分的数量。无论如何,我在下面发布了答案。请接受它作为答案,以帮助其他人看到解决方案。
标签: hadoop hadoop2 sequencefile filesplitting recordreader