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 命令简单地调用。
目前我有
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 命令简单地调用。