转载 http://www.cnblogs.com/shapherd/archive/2012/12/21/2827860.html

hadoop 支持reduce多路输出的功能,一个reduce可以输出到多个part-xxxxx-X文件中,其中X是A-Z的字母之一,程序在输出<key,value>对的时候,在value的后面追加"#X"后缀,比如#A,输出的文件就是part-00000-A,不同的后缀可以把key,value输出到不同的文件中,方便做输出类型分类, #X仅仅用做指定输出文件后缀, 不会体现到输出的内容中

使用方法

启动脚本中需要指定-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat或者-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleSequenceFileOutputFormat, 输出就会按照多路输出的方式进行分文件输出

所有标准输出的value中都要加上 #X后缀,X代表A-Z, 不然会报invalid suffix错误

$HADOOP_HOME_PATH/bin/hadoop streaming \
-Dhadoop.job.ugi="$HADOOP_JOB_UGI" \
-file ./map.sh \
-file ./red.sh \
-file ./config.sh \
-mapper "sh -x map.sh" \
-reducer "sh -x red.sh" \
-input $NEW_INPUT_PATH \
-input $OLD_INPUT_PATH \
-output $OUTPUT_PATH \
-jobconf stream.num.map.output.key.fields= \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat \
-jobconf mapred.job.name="test-shapherd-dist-diff" \
-jobconf mapred.job.priority=HIGH \
-jobconf mapred.job.map.capacity= \
-jobconf mapred.job.reduce.capacity= \
-jobconf mapred.reduce.tasks=

在red脚本中可以所以的输出都加上后缀, 这样输出就是分part的了,比如大数据diff对比的脚本

map.sh如下:

source ./config.sh

awk 'BEGIN{
}
{
if(match("'${map_input_file}'","'$OLD_INPUT_PATH'"))
{
print $"\t"
next
}
if(match("'${map_input_file}'","'$NEW_INPUT_PATH'"))
print $"\t"
}' exit

red.sh如下

awk  -F"\t" 'BEGIN{
key=""
flag=
num=
old_num=
new_num=
diff_num=
}
{
if($NF == "")
old_num++
else
new_num++
if($ != key)
{
if(key != "")
{
if(num <= )
{
diff_num++
if(flag == "")
print $"#A"
else
print $"#B"
}
}
key=$
flag=$NF
num=
next
} if(key == $)
{
num++
next
} }
END{
if(num == )
{
if(flag == "")
print $"#A"
else
print $"#B"
} print old_num"\tshapherd#C"
print new_num"\tshapherd#D"
print diff_num"\tshapherd#E"
}' exit

我的两个大数据没有diff, 所以输出就是:

part-00000-C
part-00000-D
part-00000-E
part-00001-C
part-00001-D
part-00001-E
part-00002-C
part-00002-D
part-00002-E

没有A和B结尾的

注意事项

    • 多路输出最多支持26路, 也就是字母只能是A-Z范围。
    • reduce的输入key和value的分隔符默认是\t, 如果输出中没有\t,reduce脚本会把整行当作key, value就是空的,这时如果加了#X,会报invalid suffix错误,因为#X作为了key的一部分,这种问题一种是保证你的key和value是按照\t分隔的, 一种是指定自己想要的分隔符。

hadoop streaming 多路输出 [转载]的更多相关文章

  1. Hadoop Streaming框架使用(一)

      Streaming简介 link:http://www.cnblogs.com/luchen927/archive/2012/01/16/2323448.html Streaming框架允许任何程 ...

  2. hadoop streaming 编程

    概况 Hadoop Streaming 是一个工具, 代替编写Java的实现类,而利用可执行程序来完成map-reduce过程.一个最简单的程序 $HADOOP_HOME/bin/hadoop jar ...

  3. mapreduce 多路输出

    Streaming支持多路输出(SuffixMultipleTextOutputFormat) 如下示例: hadoop streaming \ -input /home/mr/data/test_t ...

  4. Hadoop Streaming框架学习(一)

    Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...

  5. hadoop streaming 文档

    Hadoop Streaming框架使用(一) Streaming简介 Streaming框架允许任何程序语言实现的程序在Hadoop MapReduce中使用,方便已有程序向Hadoop平台移植.因 ...

  6. Hadoop Streaming 得到mapreduce_map_input_file中遇到的问题的版本号

    1.Hadoop Streaming,您可以在任务获得hadoop设置环境变量, 例如,使用awk书面map从而能获得:filename = ENVIRON["mapreduce_map_i ...

  7. Hadoop Streaming框架学习2

    Hadoop Streaming框架学习(二) 1.常用Streaming命令介绍 使用下面的命令运行Streaming MapReduce程序: 1: $HADOOP_HOME/bin/hadoop ...

  8. hadoop streaming编程小demo(python版)

    大数据团队搞数据质量评测.自动化质检和监控平台是用django,MR也是通过python实现的.(后来发现有orc压缩问题,python不知道怎么解决,正在改成java版本) 这里展示一个python ...

  9. Hadoop Streaming详解

    一: Hadoop Streaming详解 1.Streaming的作用 Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行:m ...

随机推荐

  1. 在linux使用make编译ArduPilot for Pixhawk/PX4 ArduPilot 编译环境搭建

    Building ArduPilot for Pixhawk/PX4 on Linux with Make 使用Make编译 ArduPilot for Pixhawk 2, Pixhawk and ...

  2. TransactionScope 使用记录

    最近使用TransactionScope来进行处理不同数据库的操作问题,当看到这里的时候肯都是在使用或者要使用的吧,关于他的使用网络上一大堆,我在使用的时候遇到了一下的问题,作为记录,可能会对以后使用 ...

  3. java语法基础

    Java的基本符号(token) Java的单词符号有五种:关键字.标识符.常量.分隔符和操作符. Java的字符集 Java 采用一种称为unicode的字符集,该字符集合是一种新的编码标准,与常见 ...

  4. SqlServer类库(自定义)

    1,引用System.Configuration; 2,新建应用程序配置文件 读取SqlDataReader中的数据用where (read.Read()){//DoSomeThings()}

  5. 1st贝塞尔函数的使用

    x=-100:0.1:100; y1=besselj(7,x);y2=besselj(10,x);y3=besselj(20,x);y4=besselj(40,x);y5=besselj(60,x); ...

  6. Orchard中的命令行工具

    在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...

  7. JSP弹出窗口和模式对话框

    本文转载于其它blog,在此向本文原创者,致意!    JSP 弹出窗口  一.window.open() 基础知识      1.window.open()支持环境:  JavaScript1.0+ ...

  8. MySQL设置字符集为UTF8(Windows版)

    Windows版MySQL设置字符集全部为utf8的方式 MySQL安装目录下的my.ini文件 [client]节点 default-character-set=utf8    (增加) [mysq ...

  9. 【LeetCode】Add Digits

    Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  10. 字符串数组转为PHP级数组

    先要把字符串处理一下,成为php定义数组的形式,再用eval执行: $str="Array([15] => Array([id] => 2304[fromtype] => ...