【问题标题】:Hadoop - Merge reducer outputs to a single file using JavaHadoop - 使用 Java 将 reducer 输出合并到单个文件
【发布时间】:2015-06-30 16:28:39
【问题描述】:

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

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

提前致谢。

【问题讨论】:

标签: java hadoop mapreduce apache-pig hdfs


【解决方案1】:

你可以通过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 方法将输出文件合并为单个文件。实现细节在这个link

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

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

希望对你有帮助。

【讨论】:

  • +1 用于 getmerge。但我认为它只适用于纯文本文件?因此,一旦您使用压缩输出或 avro 或 parquet 文件,这很可能不起作用。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 2014-10-01
    • 2013-01-27
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多