目前我有
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
,如果您想合并自己的.