RED_NUM=47 mapper_file="wordcount.py" mapper_cmd="$mapper_file" reducer_cmd="cat" Hadoop="/usr/bin/hadoop" Streaming="/usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u1.jar" hadoop fs -rmr $OUTPUT ${Hadoop} jar ${Streaming} -D mapred.job.name="$JOBNAME" -D mapred.job.queue.name=$queuename -D mapred.map.tasks=500 -D mapred.min.split.size=1073741824 -D mapred.reduce.tasks="$RED_NUM" -D stream.num.map.output.key.fields=3 -D num.key.fields.for.partition=3 -input "$INPUT" -output "$OUTPUT" -mapper "$mapper_cmd" -reducer "$reducer_cmd" -file "$mapper_file" -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner有几个重要参数解释下
(1)-input:输入文件路径
(2)-output:输出文件路径
(3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本
(4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本
(5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。
(6)-partitioner:用户自定义的partitioner程序
(7)-D:作业的一些属性(以前用的是-jonconf),具体有:
1)mapred.map.tasks:map task数目
2)mapred.reduce.tasks:reduce task数目
3)num.key.fields.for.partition=N:shuffle阶段将数据集的前N列作为Key;所以对于wordcount程序,map输出为“word 1”,shuffle是以word作为Key,因此这里N=1
之前我以为是的,于是一碰到数据量大的就尝试使用MapReduce。但是最近的工作中发现有种情况并不适用于MapReduce,就是涉及到整个数据集的一些运算!
举个例子,在Wordcount中,如果要计算每个单词出现的词频占整个文档中单词词频的百分比,这时候写MapReduce程序就要注意,在每个reducer中“整个文档中单词词频”必须是真正的“整个文档中单词词频”;这个例子还比较特殊,涉及到整个数据集的仅仅是总词频,可以通过传入多个输入来解决。但是如果涉及到的一些运算必须要整个数据集,那么就没法解决了。或许你可以在每个mapper中输出为“flag word 1”,然后num.key.fields.for.partition=1 这样看似可以解决,其实这样就将所有数据都reduce到一台机器上,成了单机计算,而数据集过大的话,单机是无法完成任务的。
需要注意到底谁是cat,如果只是纯粹的过滤数据或打印,两种情况都行;但如果涉及到聚合操作,这里面就有区别了。
关于Hadoop-Streaming中碰到的问题,布布扣,bubuko.com
原文地址:http://blog.csdn.net/lming_08/article/details/38235693