Hadoop - 使用Java

时间:2015-04-22 19:41:55

标签: java hadoop mapreduce apache-pig hdfs

我有一个pig脚本,可以为HDFS目录生成一些输出。 pig脚本还在同一HDFS目录中生成SUCCESS文件。 pig脚本的输出分为多个部分,因为脚本中使用的reducer数量是通过' SET default_parallel n;'

定义的。

我现在想用Java将所有文件部分连接/合并到一个文件中。我显然想在连接时忽略SUCCESS文件。我怎么能用Java做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以使用getmerge通过shell命令将多个文件合并到单个文件中。

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方法将输出文件合并到单个文件中。此link

中提供了实施详细信息

如果你想通过pig在hdfs上输出一个输出,那么你需要通过单个reducer传递它。您需要设置减速器1的数量才能这样做。你需要在脚本的开头放下一行。

--Assigning only one reducer in order to generate only one output file.
SET default_parallel 1;

我希望这会对你有所帮助。

答案 1 :(得分:0)

这似乎不容易做到的原因通常是没有什么目的。如果我有一个非常大的集群,并且我真的处理大数据问题,我的输出文件作为单个文件可能不适合任何一台机器。

话虽如此,我可以看到使用指标集合,您可能只想输出一些有关数据的指标,例如计数。

在这种情况下,我会首先运行你的MapReduce程序, 然后创建一个读取数据的第二个map / reduce作业,并通过使用reduce函数的静态键将所有元素减少到单个相同的reducer。

或者您也可以使用原始程序中的单个映射器 Job.setNumberOfReducer(1);