hadoop streaming怎么设置key

充分利用hadoop的map输出自动排序功能,可以有效提升计算效率。
Hadoop streaming框架默认状况下会以'/t’做为分隔符,将每行第一个'/t’以前的部分做为key,其他内容做为value,若是没有'/t’分隔符,则整行做为key;这个key/tvalue对又做为该map对应的reduce的输入。
实际上,经过设置参数,能够根据须要将约定知足要求的数据分布到同一个reducer,又能够经过设置map执行参数将数据内容进行必定的排序,从而提升在reducer中的计算效率。

hadoop 中能够提供配置供用户自主设置的分隔符:
-D stream.map.output.field.separator :设置map输出中key和value的分隔符
-D stream.num.map.output.key.fields : 设置map程序分隔符的位置,该位置以前的部分做为key,以后的部分做为value
-D map.output.key.field.separator : 设置map输出中key内部的分割符——备注:基于该分隔符,shuffle对key数值进行排序
-D num.key.fields.for.partition : 指定分桶时,key按照分隔符切割后,其中用于分桶key所占的列数(配合-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 使用)
-D stream.reduce.output.field.separator:设置reduce输出中key和value的分隔符
-D stream.num.reduce.output.key.fields:设置reduce程序分隔符的位置

好比下面的输入数据例子,想要基于前两个数值进行hash分桶,将数据分布到同一个reducer,另外一方面又想将前四个数字进行排序。须要这样设置:
-D stream.map.output.field.separator=,
-D stream.num.map.output.key.fields=4
-D map.output.key.field.separator=,
-D num.key.fields.for.partition=2apache

1 1,2,1,1,1  
2 1,2,2,1,1  
3 1,3,1,1,1  
4 1,3,2,1,1  
5 1,3,3,1,1  
6 1,2,3,1,1  
7 1,3,1,1,1  
8 1,3,2,1,1  
9 1,3,3,1,1