Hadoop - 使用 Java 将 reducer 输出合并到单个文件
Hadoop - Merge reducer outputs to a single file using Java
我有一个生成一些输出到 HDFS 目录的 pig 脚本。 pig 脚本还在同一个 HDFS 目录中生成一个 SUCCESS 文件。 pig 脚本的输出被分成多个部分,因为脚本中使用的 reducer 数量是通过 'SET default_parallel n;'
定义的
我现在想使用 Java 将所有文件部分 concatenate/merge 合并到一个文件中。我显然想在连接时忽略 SUCCESS 文件。我如何在 Java 中执行此操作?
提前致谢。
这似乎不容易做到的原因通常是没有什么目的。如果我有一个非常大的集群,并且我确实在处理大数据问题,那么我的输出文件作为单个文件可能不适合任何一台机器。
也就是说,我可以看到使用指标集合,您可能只想输出一些关于数据的指标,例如计数。
在那种情况下,我会先 运行 你的 MapReduce 程序,
然后创建第二个 map/reduce 作业来读取数据,并通过将静态键与 reduce 函数一起使用将所有元素缩减为单个相同的 reducer。
或者您也可以只在原始程序中使用一个映射器
Job.setNumberOfReducer(1);
您可以使用 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 传递它。您需要设置 reducer 1 的数量才能这样做。你需要在你的脚本的开头写下一行。
--Assigning only one reducer in order to generate only one output file.
SET default_parallel 1;
希望对您有所帮助。
我有一个生成一些输出到 HDFS 目录的 pig 脚本。 pig 脚本还在同一个 HDFS 目录中生成一个 SUCCESS 文件。 pig 脚本的输出被分成多个部分,因为脚本中使用的 reducer 数量是通过 'SET default_parallel n;'
定义的我现在想使用 Java 将所有文件部分 concatenate/merge 合并到一个文件中。我显然想在连接时忽略 SUCCESS 文件。我如何在 Java 中执行此操作?
提前致谢。
这似乎不容易做到的原因通常是没有什么目的。如果我有一个非常大的集群,并且我确实在处理大数据问题,那么我的输出文件作为单个文件可能不适合任何一台机器。
也就是说,我可以看到使用指标集合,您可能只想输出一些关于数据的指标,例如计数。
在那种情况下,我会先 运行 你的 MapReduce 程序, 然后创建第二个 map/reduce 作业来读取数据,并通过将静态键与 reduce 函数一起使用将所有元素缩减为单个相同的 reducer。
或者您也可以只在原始程序中使用一个映射器
Job.setNumberOfReducer(1);
您可以使用 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 传递它。您需要设置 reducer 1 的数量才能这样做。你需要在你的脚本的开头写下一行。
--Assigning only one reducer in order to generate only one output file.
SET default_parallel 1;
希望对您有所帮助。