hadoop将多个部分文件组合成单个文件

tsm1rwdh  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(505)

目前我有 part-00001 part-00002 我知道使用 hdfs -getmerge 是将这些文件合并为单个文件的最佳方式。然而,有没有可能通过编程来实现呢?
我试过使用multipleoutput,但它不起作用。我也试着写我自己的 CustomOutputFormat 但是,由于在并行地将其写入文件的过程中使用了多个reducer,因此 org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException 关闭dataoutputstream时出错。

7gcisfzg

7gcisfzg1#

您不能以编程的方式进行,因为它是由hadoop管理的,并且这些文件的创建取决于配置的reducer的数量。为什么需要以编程方式合并这些文件?如果要将输入作为另一个作业,则始终可以将目录作为输入并使用 CombineInputFormat 如果有很多小零件文件。否则 hdfs -getmerge 是最好的选择,如果你想合并自己的。

goucqfw6

goucqfw62#

您总是可以从java代码中使用filesystem类,可能只需要调用concat方法。
乘法输出的作用几乎相反。而不是 part-xx 文件,它还生成自定义命名的文件,这通常意味着比以前更多的文件。
customouputformat也不是一个好主意,因为在任何情况下,输出文件的数量与reducer的数量一样多。输出格式不会改变这一点。
使用单个减速器( setNumReduceTasks(1) )可能是一个可行的解决方案,但不必要的昂贵,因为它“扼杀”了并行性(所有数据都由单个任务处理)。只有当你的数据很小的时候才考虑使用它,否则就避免使用它。
另一个解决办法是直接打电话 hdfs -getmerge 作为java代码中的shell命令,在mapreduce作业完成之后。

相关问题