Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop将多个部件文件合并到单个文件中_Java_Hadoop_Mapreduce_Hdfs - Fatal编程技术网

Java Hadoop将多个部件文件合并到单个文件中

Java Hadoop将多个部件文件合并到单个文件中,java,hadoop,mapreduce,hdfs,Java,Hadoop,Mapreduce,Hdfs,目前我有 part-00001 第00002部分 我知道使用hdfs-getmerge是将这些文件合并成单个文件的最佳方法。但是,是否可以通过编程方式执行此操作 我试过使用,但不起作用。我也尝试过编写自己的CustomOutputFormat,但是由于在将其并行写入文件的过程中使用了多个简化程序,因此在关闭Dataoutputstream时会出现org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException错误。您无法以编程方式执行此操

目前我有

part-00001
第00002部分

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


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

您无法以编程方式执行此操作,因为它是由hadoop管理的,并且这些文件是创建的减速器取决于配置的减速器数量。 为什么需要以编程方式合并这些文件? 如果要将输入作为另一个作业,则始终可以将目录作为输入,如果存在大量小部件文件,则可以使用
CombineInputFormat
。 否则
hdfs-getmerge
是最好的选择,如果你想合并你自己的

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

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

CustomOutFormat也不是一个好主意,因为在任何情况下,输出文件的数量都与还原器的数量相同。输出格式不会改变这一点

使用单个reducer(
setNumReduceTasks(1)
)可能是一个可行的解决方案,但不必要的昂贵,因为它“杀死”了并行性(所有数据都由单个任务处理)。只在数据很小的情况下使用它,否则就避免使用。
另一个解决方案是在MapReduce作业完成后,从java代码中以shell命令的形式调用
hdfs-getmerge

下面列出了最完整的解决方案。谢谢@意思是我很高兴这有帮助:)