新API中的MultipleTextOutputFormat替代方案

Ama*_*mar 8 hadoop mapreduce

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

Edd*_*ied 4

我使用的是 AWS EMR Hadoop 1.0.3,可以根据 k/v 对指定不同的目录和文件。使用类中的以下函数之一MultipleOutputs

public void write(KEYOUT key, VALUEOUT value, String baseOutputPath)
Run Code Online (Sandbox Code Playgroud)

或者

public <K,V> void write(String namedOutput, K key, V value,
                        String baseOutputPath)
Run Code Online (Sandbox Code Playgroud)

前一种write方法要求键与映射输出键的类型相同(如果您在映射器中使用它)或与化简输出键相同的类型(如果您在减速器中使用它)。该值也必须以类似的方式键入。

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

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

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

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

multipleOutputs.write("output1", key, value, "dir1/part");
Run Code Online (Sandbox Code Playgroud)

就我而言,这创建了名为“dir1/part-r-00000”的文件。

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

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