Hadoop Streaming 实战: 多路输出
streaming把reduce的输出作为一个任务的最终输出,输出文件形如:
part-00000、part-00001……
文件个数为reduce任务个数
但是,有的时候,我们有多路输出的需求,eg:一部分数据作为下一个mapreduce任务的输入,另一部分数据直接供下游任务抓取,此时,我们就需要使用reduce的多路输出。
在hadoop-v2-u7中,streaming引入了reduce多路输出的功能,允许一个reduce输出到多个文件中,规则如下:
使用-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat或者-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleSequenceFileOutputFormat指定使用带多输出的OutputFormat(前者对应于文本输入,后者于二进制输入)
reduce输出文件可以为part-xxxxx-X文件,其中X是A-Z的字母之一,使用方式是在输出key,value对的时候,在value的后面追加"#X"两个字节后缀,后缀不同的key,value输出到不同的part-xxxxx-X文件,value的后缀"#X"自动删除。
此时,需要特别注意的是,由于value之后#X才会识别为输出文件标示,而reduce的输出默认以"\t"分割key和value,因此,如果reduce的输出是一行中间没有"/t",我们就需要在#X后缀前面添加"\t"使它变成value的一部分而不是key的一部分,也可以通过“-D stream.reduce.output.field.separator”指定reduce输出分割符的类型。
示例:
对输入的数据做处理,以字符'1’开头的输入part-xxxxx-A文件中,以字符'2’开头的输入part-xxxxx-B文件中,其余输入part-xxxxx-C文件中
1. mapper程序mapper.sh
- #!/bin/sh
- while read line
- do
- echo "$line"
- done
#!/bin/sh while read linedo echo "$line"done
2. reducer程序reducer.sh
- #!/bin/sh
- while read line
- do
- tag=`expr substr $line 1 1`
- if [ $tag == "1" ]
- then
- echo -e "$line\t#A"
- elif [ $tag == "2" ]
- then
- echo -e "$line\t#B"
- else
- echo -e "$line\t#C"
- fi
- done
#!/bin/sh while read linedo tag=`expr substr $line 1 1` if [ $tag == "1" ] then echo -e "$line\t#A" elif [ $tag == "2" ] then echo -e "$line\t#B" else echo -e "$line\t#C" fidone
3. 输入数据:test.txt
1,2,1,1,12,2,2,1,13,3,1,1,11,3,2,1,12,3,3,1,13,2,3,1,11,3,1,1,12,3,2,1,13,3,3,1,14,3,3,1,1
4. 输入文本放入hdfs,集群运行:
$ hadoop fs -put test.txt /usr/test.txt
$ hadoop streaming -input /usr test.txt /
-output /usr/test_1234 /
-mapper ./mapper.sh -reducer ./reducer.sh /
-file mapper.sh -file reducer.sh /
-inputformat org.apache.hadoop.mapred.TextInputFormat /
-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat /
-jobconf -jobconf mapred.reduce.tasks=3 /
-jobconf mapre.job.name="mul_output_test"
查看输出:
$ hadoop fs -ls /usr/test_1234
Found 7 items
-rw-r--r-- 3 test test 11 2011-05-20 09:56 /usr/test_1234/part-00000-C
-rw-r--r-- 3 test test 11 2011-05-20 09:56 /usr/test_1234/part-00001-A
-rw-r--r-- 3 test test 11 2011-05-20 09:56 /usr/test_1234/part-00001-B
-rw-r--r-- 3 test test 11 2011-05-20 09:56 /usr/test_1234/part-00001-C
-rw-r--r-- 3 test test 22 2011-05-20 09:56 /usr/test_1234/part-00002-A
-rw-r--r-- 3 test test 22 2011-05-20 09:56 /usr/test_1234/part-00002-B
-rw-r--r-- 3 test test 22 2011-05-20 09:56 /usr/test_1234/part-00002-C
Hadoop Streaming 实战: 多路输出相关推荐
- Hadoop Streaming 实战: 实用Partitioner类KeyFieldBasedPartitioner
我们知道,一个典型的Map-Reduce过程包括:Input->Map->Patition->Reduce->Output.Pation负责把Map任务输出的中间结果按key分 ...
- hadoop中带后缀的多路输出part文件
[导读] hadoop源代码中org.apache.hadoop.mapred.lib.MultipleTextOutputFormat类实现了多路输出的框架.在此基础上,可以实现自定义的多路输出方案 ...
- MapReduce工作笔记——Streaming多路输出
文章目录 多路输出 实现 MapReduce工作笔记 系列目录:MapReduce工作笔记--目录 多路输出 加入如下命令: -outputformat org.apache.hadoop.mapre ...
- Hadoop Streaming框架使用(一)
Streaming简介 link:http://www.cnblogs.com/luchen927/archive/2012/01/16/2323448.html Streaming框架允许任何程 ...
- flink-cdc,clickhouse写入,多路输出
1.场景 kafka日志数据从kafka读取 1.关联字典表:完善日志数据 2.判断日志内容级别:多路输出 低级:入clickhouse 高级:入clickhouse的同时推送到kafka供2次数据流 ...
- Hadoop streaming 排序、分桶参数设置
编写hadoop任务经常需要用到partition和排序.这里记录一下几个参数. 1. 概念 Partition:分桶过程,用户输出的key经过partition分发到不同的reduce里,因而par ...
- Hadoop Streaming框架使用(三)
前两篇文章介绍了Hadoop Streaming框架的使用方法.由于篇幅所限,并没有介绍其中的高级使用方法,但是有一些用法还是相当常见的.今天对一些高级用法进行一个简单的说明,希望能给大家一些启发. ...
- Hadoop Streaming 编程
1.概述 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如: 采用shell脚本语言中的一些命令作为ma ...
- Hadoop Streaming编程实例
Hadoop Streaming是Hadoop提供的多语言编程工具,通过该工具,用户可采用任何语言编写MapReduce程序,本文将介绍几个Hadoop Streaming编程实例,大家可重点从以下几 ...
最新文章
- 浙大博士整理的计算机视觉学习路线(含时间建议分配)
- 完美的优化目标,人工智能的盲点
- 为什么我们都要等到失去后才知道珍惜呢(转载)
- PrintWriter用法简析
- 一加账号app_资讯知名种草App突然被大规模下架!官方回应
- java两个很大的数相加_两个超大数的相加
- Hibernate入门(二)
- Apache Dubbo 被曝出“高危”远程代码执行漏洞
- Python | 程序从列表中删除范围内的所有元素
- 论文浅尝 | 知识图谱推理中表示学习和规则挖掘的迭代学习方法
- 设备巡检app android开发,富士康移动巡检app安卓,富士康移动巡检app安卓手机软件预约 v1.0-手游汇...
- 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一1.2 MySQL的安装...
- php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
- 服务器中tomcat内存溢出配置文件修改
- 详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
- Python人脸识别库的安装
- CwRsync实现文件同步(windows或linux服务器通用)
- java中System类详解
- 上传服务器文件代码,文件上传服务器代码
- 如何清理和优化你的Mac:14个小技巧推荐给你!