新API中的MultipleTextOutputFormat替代方案

时间:2013-02-26 22:26:42

标签: hadoop mapreduce

因为它突出了MultiTextOutputFormat尚未迁移到新的API。因此,如果我们需要根据动态写入的键值选择输出目录并输出fiename,那么我们使用新的mapreduce API有什么替代方案?

3 个答案:

答案 0 :(得分:4)

我正在使用AWS EMR Hadoop 1.0.3,可以根据k / v对指定不同的目录和文件。使用MultipleOutputs类中的以下任一功能:

public void write(KEYOUT key, VALUEOUT value, String baseOutputPath)

public <K,V> void write(String namedOutput, K key, V value,
                        String baseOutputPath)

以前的write方法要求键与地图输出键的类型相同(如果您在映射器中使用它)或者与reduce输出键相同的类型(如果您使用的话)这在减速机中)。该值也必须以类似的方式输入。

后一种write方法要求键/值类型与使用addNamedOutput函数设置MultipleObjects静态属性时指定的类型相匹配:

public static void addNamedOutput(Job job,
                              String namedOutput,
                              Class<? extends OutputFormat> outputFormatClass,
                              Class<?> keyClass,
                              Class<?> valueClass)

因此,如果您需要的输出类型与Context使用的输出类型不同,则必须使用后一种write方法。

获取不同输出目录的技巧是传递包含目录分隔符的baseOutputPath,如下所示:

multipleOutputs.write("output1", key, value, "dir1/part");

在我的例子中,这创建了名为“dir1 / part-r-00000”的文件。

我没有成功使用包含baseOutputPath目录的..,因此所有baseOutputPath都严格包含在传递给-output参数的路径中。< / p>

有关如何设置和正确使用MultipleOutputs的更多详细信息,请参阅我找到的此代码(不是我的,但我发现它非常有用;不使用不同的输出目录)。 https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java

答案 1 :(得分:0)

类似于:Hadoop Reducer: How can I output to multiple directories using speculative execution?

基本上你可以直接从你的reducer写入HDFS - 你只需要警惕推测性执行并单独命名你的文件,然后你需要实现自己的OutputCommitter来清理中止的尝试(这是如果您拥有真正动态的输出文件夹,那么最困难的部分是 - 您需要逐步浏览每个文件夹并删除与中止/失败任务相关的尝试。一个简单的解决方案就是关闭推测性执行

答案 2 :(得分:-1)

要获得最佳答案,请转到Hadoop - 权威指南3rd Ed。(从第253页开始。)

摘自HDG书 -

&#34;在旧的MapReduce API中,有两个用于生成多个输出的类:MultipleOutputFormat和MultipleOutputs。简而言之,MultipleOutputs功能更全面,但MultipleOutputFormat可以更好地控制输出目录结构和文件命名。新API中的MultipleOutput结合了旧API中两个多输出类的最佳功能。&#34;

它有一个关于如何使用MultipleOutputs API控制目录结构,文件命名和输出格式的示例。

HTH。