一个简单示例:
hadoop jar ${hdstreaming} \
-D mapreduce.job.queuename=mapreduce.normal \ #Hadoop 2.0一定要指定队列名
-D mapreduce.job.name='UserFeature::Predict' \
-D stream.num.map.output.key.fields=2 \
-D num.key.fields.for.partition=2 \
-D mapreduce.reduce.tasks=90 \
-D mapreduce.min.split.size=1073741824 \ #此参数对数据量小但分区很多的输入有用,很好地提升效率
-mapper "getPredictMap.py" \
-reducer "getPredictReduce.py" \
-file getPredictMap.py \
-file getPredictReduce.py \
-file file_used_in_program \
-input "${inputdir}" \
-output "${outputdir}" \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
Hadoop streaming默认以'/t’作为分隔符,将每行第一个'/t’之前的部分作为key,其余内容作为value,如果没有'/t’分隔符,则整行作为key;比如说map阶段输出的key/value pair, 排序后又作为reduce的输入。
这块有两个常用的参数-D stream.num.map.output.key.fields和-D num.key.fields.for.partition。
二者的区别在于前者指定排序的key(map的输出),后者指定分区的字段(可能仅为key的一部分)。