我有一个pig脚本,它生成一些输出到hdfs目录。pig脚本还在同一hdfs目录中生成一个成功文件。pig脚本的输出被分成多个部分,因为脚本中要使用的减速机的数量是通过“set default_parallel n;”定义的我现在想使用java将所有文件部分连接/合并到一个文件中。我显然想在连接时忽略成功文件。如何在java中实现这一点?提前谢谢。
dy2hfwbg1#
你可以用 getmerge 通过shell命令将多个文件合并为单个文件。
getmerge
Usage: hdfs dfs -getmerge <srcdir> <destinationdir/file.txt> Example: hdfs dfs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt
以防您不想使用shell命令执行此操作。你可以编写一个java程序,并可以使用 FileUtil.copyMerge 方法将输出文件合并为单个文件。此链接提供了实现详细信息如果您希望hdfs本身的单个输出通过pig,那么您需要通过单个reducer。为此,您需要设置减速器1的数量。你需要在你的剧本开始的下面一行。
FileUtil.copyMerge
--Assigning only one reducer in order to generate only one output file. SET default_parallel 1;
我希望这对你有帮助。
lztngnrs2#
这似乎不容易做到的原因是,通常没有什么目的。如果我有一个非常大的集群,并且我真的在处理一个大数据问题,那么我的输出文件作为一个单独的文件可能不适合任何一台机器。也就是说,我可以看到use metrics collections,其中您可能只想输出有关数据的一些指标,比如计数。在这种情况下,我将首先运行mapreduce程序,然后创建第二个map/reduce作业来读取数据,并通过在reduce函数中使用静态键将所有元素简化为同一个reducer。或者你也可以在你的原始程序中使用一个Map器 Job.setNumberOfReducer(1);
Job.setNumberOfReducer(1);
2条答案
按热度按时间dy2hfwbg1#
你可以用
getmerge
通过shell命令将多个文件合并为单个文件。以防您不想使用shell命令执行此操作。你可以编写一个java程序,并可以使用
FileUtil.copyMerge
方法将输出文件合并为单个文件。此链接提供了实现详细信息如果您希望hdfs本身的单个输出通过pig,那么您需要通过单个reducer。为此,您需要设置减速器1的数量。你需要在你的剧本开始的下面一行。
我希望这对你有帮助。
lztngnrs2#
这似乎不容易做到的原因是,通常没有什么目的。如果我有一个非常大的集群,并且我真的在处理一个大数据问题,那么我的输出文件作为一个单独的文件可能不适合任何一台机器。
也就是说,我可以看到use metrics collections,其中您可能只想输出有关数据的一些指标,比如计数。
在这种情况下,我将首先运行mapreduce程序,然后创建第二个map/reduce作业来读取数据,并通过在reduce函数中使用静态键将所有元素简化为同一个reducer。
或者你也可以在你的原始程序中使用一个Map器
Job.setNumberOfReducer(1);