Hadoop Streaming 是Hadoop提供的一个编程工具,Streamining框架允许任何可执行文件或者脚本文件作为Mapper和Reducer在Hadoop MapReduce中使用,方便已有程序向Hadoop平台移植。因此可以说对于hadoop的扩展性意义重大。
Streamining的原理:mapper和reducer会从标准输入中读取数据,一行一行处理后发送给标准输出,Streming 工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。
如果一个文件(可执行文件或脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入,同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出,默认情况下,一行中第一个tab之前的部分作为key,之后的作为value。如果没有tab,整行作为key,value值为null。
下面参数中-files,-archives,-libjars为hadoop命令
一般用 -jobconf | -D NAME=VALUE 指定作业参数,指定 mapper or reducer 的 task 官方上说要用 -jobconf 但是这个参数已经过时,不可以用了,官方说要用 -D, 注意这个-D是要作为最开始的配置出现的,因为是在maper 和 reducer 执行之前,就需要硬性指定好的,所以要出现在参数的最前面 ./bin/hadoop jar hadoop-0.19.2-streaming.jar -D ………-input …….. 类似这样
其中sort和partition的参数用的比较多
map.output.key.field.separator: map中key内部的分隔符
num.key.fields.for.partition: 分桶时,key按前面指定的分隔符分隔之后,用于分桶的key占的列数。通俗地讲,就是partition时候按照key中的前几列进行划分,相同的key会被打到同一个reduce里。
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 前两个参数,要配合partitioner选项使用!
stream.map.output.field.separator: map中的key与value分隔符
stream.num.map.output.key.fields: map中分隔符的位置
stream.reduce.output.field.separator: reduce中key与value的分隔符
stream.num.reduce.output.key.fields: reduce中分隔符的位置
另外还有压缩参数
Job输出结果是否压缩
mapred.output.compress
是否压缩,默认值false。
mapred.output.compression.type
压缩类型,有NONE, RECORD和BLOCK,默认值RECORD。
mapred.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec。
map task输出是否压缩
mapred.compress.map.output
是否压缩,默认值false
mapred.map.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec
另外,Hadoop本身还自带一些好用的Mapper和Reducer:
1、Hadoop聚集功能:Aggregate提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(例如:sum、max、min等)用于聚合一组value的序列。可以使用Aggredate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。combiner/reducer利用适当的聚合器聚合这些可聚合项。要使用Aggregate,只需指定”-reducer aggregate”。
2、字段的选取(类似于Unix中的’cut’):Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduc帮助用户高效处理文本数据,就像unix中的“cut”工具。工具类中的map函数把输入的key/value对看作字段的列表。 用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。 同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。
4.默认情况
在hadoop streaming的默认情况下,是以”\t”作为分隔符的。对于标准输入来说,每行的第一个”\t” 以前的部分为key,其他部分为对应的value。如果一个”\t”字符没有,则整行都被当做key。这个
5.map阶段的sort与partition
map阶段很重要的阶段包括sort与partition。排序是按照key来进行的。咱们之前讲了默认的key是由”\t”分隔得到的。我们能不能自己控制相关的sort与partition呢?答案是可以的。
先看以下几个参数:
map.output.key.field.separator: map中key内部的分隔符
num.key.fields.for.partition: 分桶时,key按前面指定的分隔符分隔之后,用于分桶的key占的列数。通俗地讲,就是partition时候按照key中的前几列进行划分,相同的key会被打到同一个reduce里。
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 前两个参数,要配合partitioner选项使用!
stream.map.output.field.separator: map中的key与value分隔符
stream.num.map.output.key.fields: map中分隔符的位置
stream.reduce.output.field.separator: reduce中key与value的分隔符
stream.num.reduce.output.key.fields: reduce中分隔符的位置