繁体   English   中英

Hadoop将多个零件文件合并为一个文件

[英]Hadoop Combine Multiple part files into single file

目前我有

part-00001 part-00002

我知道使用hdfs -getmerge是将这些文件合并为一个文件的最佳方法。 但是,是否可以通过编程方式进行

我尝试使用MultipleOutput ,但是它不起作用。 我还尝试编写自己的CustomOutputFormat但是由于在并行将其并行写入文件时使用了多个reducer,因此在关闭Dataoutputstream时会出现org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException错误。

您始终可以从Java代码中使用FileSystem类 ,可能只需要调用concat方法即可。

MultipleOutput几乎相反。 除了生成part-xxxxx文件之外,它还会生成自定义名称的文件,这通常意味着比以前更多的文件。

CustomOuputFormat也不是一个好主意,因为在任何情况下,您的输出文件都将与减速器数量一样多。 输出格式不会改变它。

使用单个reducer( setNumReduceTasks(1) )可能是一个setNumReduceTasks(1)解决方案,但是不必要地昂贵,因为它“杀死”了并行性(所有数据都由单个任务处理)。 仅在您的数据很小时才考虑使用它,否则请避免使用它。

另一种解决方案是在MapReduce作业完成后,从Java代码中简单地将hdfs -getmerge作为shell命令调用。

您无法通过Hadoop对其进行编程编程,并且这些文件的创建取决于所配置的reducer数量。 为什么需要以编程方式合并这些文件? 如果要作为另一项工作输入,则始终可以将目录提及为输入,如果有很多小CombineInputFormat文件,则可以使用CombineInputFormat 否则,如果要合并自己的hdfs -getmerge是最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM