目前我有 part-00001 part-00002
我知道使用 hdfs -getmerge
是将这些文件合并为单个文件的最佳方式。然而,有没有可能通过编程来实现呢?
我试过使用multipleoutput,但它不起作用。我也试着写我自己的 CustomOutputFormat
但是,由于在并行地将其写入文件的过程中使用了多个reducer,因此 org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
关闭dataoutputstream时出错。
2条答案
按热度按时间7gcisfzg1#
您不能以编程的方式进行,因为它是由hadoop管理的,并且这些文件的创建取决于配置的reducer的数量。为什么需要以编程方式合并这些文件?如果要将输入作为另一个作业,则始终可以将目录作为输入并使用
CombineInputFormat
如果有很多小零件文件。否则hdfs -getmerge
是最好的选择,如果你想合并自己的。goucqfw62#
您总是可以从java代码中使用filesystem类,可能只需要调用concat方法。
乘法输出的作用几乎相反。而不是
part-xx
文件,它还生成自定义命名的文件,这通常意味着比以前更多的文件。customouputformat也不是一个好主意,因为在任何情况下,输出文件的数量与reducer的数量一样多。输出格式不会改变这一点。
使用单个减速器(
setNumReduceTasks(1)
)可能是一个可行的解决方案,但不必要的昂贵,因为它“扼杀”了并行性(所有数据都由单个任务处理)。只有当你的数据很小的时候才考虑使用它,否则就避免使用它。另一个解决办法是直接打电话
hdfs -getmerge
作为java代码中的shell命令,在mapreduce作业完成之后。