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

[html] view plaincopyprint?
  1. #!/bin/sh
  2. while read line
  3. do
  4. echo "$line"
  5. done

#!/bin/sh while read linedo echo "$line"done

2. reducer程序reducer.sh

[html] view plaincopyprint?
  1. #!/bin/sh
  2. while read line
  3. do
  4. tag=`expr substr $line 1 1`
  5. if [ $tag == "1" ]
  6. then
  7. echo -e "$line\t#A"
  8. elif [ $tag == "2" ]
  9. then
  10. echo -e "$line\t#B"
  11. else
  12. echo -e "$line\t#C"
  13. fi
  14. 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 实战: 多路输出相关推荐

  1. Hadoop Streaming 实战: 实用Partitioner类KeyFieldBasedPartitioner

    我们知道,一个典型的Map-Reduce过程包括:Input->Map->Patition->Reduce->Output.Pation负责把Map任务输出的中间结果按key分 ...

  2. hadoop中带后缀的多路输出part文件

    [导读] hadoop源代码中org.apache.hadoop.mapred.lib.MultipleTextOutputFormat类实现了多路输出的框架.在此基础上,可以实现自定义的多路输出方案 ...

  3. MapReduce工作笔记——Streaming多路输出

    文章目录 多路输出 实现 MapReduce工作笔记 系列目录:MapReduce工作笔记--目录 多路输出 加入如下命令: -outputformat org.apache.hadoop.mapre ...

  4. Hadoop Streaming框架使用(一)

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

  5. flink-cdc,clickhouse写入,多路输出

    1.场景 kafka日志数据从kafka读取 1.关联字典表:完善日志数据 2.判断日志内容级别:多路输出 低级:入clickhouse 高级:入clickhouse的同时推送到kafka供2次数据流 ...

  6. Hadoop streaming 排序、分桶参数设置

    编写hadoop任务经常需要用到partition和排序.这里记录一下几个参数. 1. 概念 Partition:分桶过程,用户输出的key经过partition分发到不同的reduce里,因而par ...

  7. Hadoop Streaming框架使用(三)

    前两篇文章介绍了Hadoop Streaming框架的使用方法.由于篇幅所限,并没有介绍其中的高级使用方法,但是有一些用法还是相当常见的.今天对一些高级用法进行一个简单的说明,希望能给大家一些启发. ...

  8. Hadoop Streaming 编程

    1.概述 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如: 采用shell脚本语言中的一些命令作为ma ...

  9. Hadoop Streaming编程实例

    Hadoop Streaming是Hadoop提供的多语言编程工具,通过该工具,用户可采用任何语言编写MapReduce程序,本文将介绍几个Hadoop Streaming编程实例,大家可重点从以下几 ...

最新文章

  1. Java对存储过程的调用方法
  2. tsp遗传算法 c语言,【分享】遗传算法解决TSP问题的源程序
  3. Gradle标准project属性
  4. (王道408考研操作系统)第二章进程管理-第四节3:死锁处理策略之检测和解除
  5. 《css设计彻底研究》读书笔记之 盒子模型
  6. 支付361万元“家庭抚养费”后,贾跃亭向法院申请与甘薇离婚?
  7. established 太多_ss -s closed过多,NON_ESTABLISHED告警
  8. Essential SQLAlchemy2th学习笔记之反射Reflection
  9. 北上广深杭程序员买房姿势图鉴
  10. 关联规则算法Apriori的学习与实现
  11. 11月3日 迅雷白金会员vip账号分享 91freevip 23:00更新
  12. 【冈萨雷斯的数字图像处理1~6章复习考试知识整理】
  13. innerHTML、innerText和outerHTML的区别
  14. MMORPG开发入门[转]
  15. 单片机程序跑飞死机的几种原因
  16. 《结对-爬取大麦网演唱会信息-设计文档》
  17. 消费提示:2012春运火车票 网上订票攻略
  18. 【Android Gradle 插件】PackagingOptions 配置 ③ ( merges 属性配置 | excludes 属性配置 )
  19. 直播系统源码开发:关于安卓开发工具和obs直播推流
  20. mac hdmi 不能调整音量_Sound Control for Mac(mac应用音量控制软件)

热门文章

  1. Windows10 使用 Sony PHA-1 耳放
  2. 兄弟姐妹们,有没有啥开源的项目能加一下我吗?
  3. 深度学习工作站搭建全过程
  4. Virgin Voyages将提供按需香槟配送服务“Shake for Champagne™”
  5. 【C++】C++标准库之iomanip库(格式输入输出)
  6. python 通过上传excel对数据分割分组导出
  7. Linux(ubuntu)安装JLink 驱动
  8. SDUTOJ(2109)找女朋友
  9. SKYCC组合营销软件的特色
  10. 4年外包终上岸,我只能说这类公司能不去就不去