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. 浙大博士整理的计算机视觉学习路线(含时间建议分配)
  2. 完美的优化目标,人工智能的盲点
  3. 为什么我们都要等到失去后才知道珍惜呢(转载)
  4. PrintWriter用法简析
  5. 一加账号app_资讯知名种草App突然被大规模下架!官方回应
  6. java两个很大的数相加_两个超大数的相加
  7. Hibernate入门(二)
  8. Apache Dubbo 被曝出“高危”远程代码执行漏洞
  9. Python | 程序从列表中删除范围内的所有元素
  10. 论文浅尝 | 知识图谱推理中表示学习和规则挖掘的迭代学习方法
  11. 设备巡检app android开发,富士康移动巡检app安卓,富士康移动巡检app安卓手机软件预约 v1.0-手游汇...
  12. 《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》一一1.2 MySQL的安装...
  13. php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
  14. 服务器中tomcat内存溢出配置文件修改
  15. 详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
  16. Python人脸识别库的安装
  17. CwRsync实现文件同步(windows或linux服务器通用)
  18. java中System类详解
  19. 上传服务器文件代码,文件上传服务器代码
  20. 如何清理和优化你的Mac:14个小技巧推荐给你!

热门文章

  1. R count函数_R分析之前的数据准备
  2. 用Python输出各点两两连接的正17边形
  3. 网易视频云余利华:以用户体验为核心,深耕PaaS云生态
  4. 端口被占用,如何处理
  5. 【P28】Enjoy The jFET 超简分立耳放
  6. OmniPlan 3 破解 中文
  7. 在vue项目中使用gsap,实现极佳的2d动画效果
  8. 爱码物联SaaS一物一码_化妆品二维码防伪溯源系统
  9. 理论计算机科学杂志,理论计算机科学中的若干下界结果
  10. MacBook M1用虚拟机安装ubuntu,用ssh本地连接虚拟机ubuntu