1. 继承MultipleTextOutputFormat实现自己的输出类。
2. 重写generateFileNameForKeyValue方法,返回输出的名字,可通过"/"分割表示目录路径。
3. 重写generateActualValue方法,返回真实的value。
4. 将类编译打包成jar,在运行streaming作业时设置-libjars YourJar.jar -outputformat YourPackage.YourOutputClass选项
示例:
package joco; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat; public class multiout extends MultipleTextOutputFormat<Text, Text> { @Override protected String generateFileNameForKeyValue(Text key, Text value, String name) { String v_f = value.toString(); int pos = v_f.lastIndexOf(‘\t‘); return v_f.substring(pos+1, v_f.length())+"/"+name; } @Override protected Text generateActualValue(Text key, Text value) { String v_f = value.toString(); int pos = v_f.lastIndexOf(‘\t‘); return new Text(v_f.substring(0, pos)); } }
mapreduce运行脚本:
#!/usr/bash $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming.jar -libjars multiout.jar -outputformat joco.multiout -mapper map.py -reducer reduce.py -file map.py reduce.py -input /data/input -output /data/output
说明:将"\t"分割的reduce输出的最后一列作为输出文件名,其余部分作为key,value。
例如在reduce.py脚本中:
print "key1" + "\t" + "value1" + "\t" + "dir1" print "key2" + "\t" + "value2" + "\t" + "dir2"
则输出路径为:
/data/output/dir1/part-00000,内容为key1 \t value1
/data/output/dir2/part-00000,内容为key2 \t value2
老版mapreduce跑streaming作业多路输出的方法
原文:http://www.cnblogs.com/birikin/p/5292294.html