Hadoop 将多个部件文件合并为单个文件



目前我有

part-00001 part-00002

我知道使用 hdfs -getmerge 是将这些文件合并为一个文件的最佳方式。但是,是否可以以编程方式执行此操作?

我尝试使用多输出,但它不起作用。我也尝试编写自己的CustomOutputFormat但是由于在将其并行写入文件的过程中有多个化简器,因此在关闭 Dataoutputstream 时org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException错误。

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

MultipleOutput几乎相反。它没有part-xxxxx文件,而是生成自定义命名的文件,这通常意味着比以前更多的文件。

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

使用单个化简器(setNumReduceTasks(1))可能是一个可行的解决方案,但不必要的昂贵,因为它"杀死"并行性(所有数据都由单个任务处理)。仅当数据相当小时,才考虑使用它,否则请避免使用它。

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

您不能以编程方式执行此操作,因为它由Hadoop管理,并且这些文件的创建取决于配置的化简器的数量。 为什么需要以编程方式合并这些文件?如果输入作为另一个作业,您可以随时提及目录作为输入并使用CombineInputFormat如果有很多小零件文件。否则hdfs -getmerge,如果您想合并自己的.

相关内容

  • 没有找到相关文章

最新更新