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 错误。

您不能以编程方式执行此操作,因为它由 Hadoop 管理,并且创建这些文件取决于配置的 reducer 数量。 为什么需要以编程方式合并这些文件? 如果作为另一项工作进行输入,如果有很多小零件文件,您总是可以将目录作为输入并使用 CombineInputFormat。 否则,如果您想合并自己的 .

您可以随时使用 FileSystem class from your java code, and probably calling the concat 方法。

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

CustomOuputFormat 也不是一个好主意,因为无论如何,您将拥有与 reducer 数量一样多的输出文件。输出格式不会改变这一点。

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

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