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