首页 > 其他 > 详细

老版mapreduce跑streaming作业多路输出的方法

时间:2016-03-18 16:06:21      阅读:169      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!