我一般都是用python,shell这些脚本语言来编写程序,由于工作原因,要写mr程序,但是在网上找了找,全部都只有wordcount的代码,不是特别容易理解,就想写一篇文章来讲讲使用时的注意事项。
submit.sh:
. ./conf/hadoop.conf function impression_hadoop(){ ${HADOOP} jar ${HADOOP_STREAMING_JAR} \ -D mapred.map.tasks=100 \ -D mapred.reduce.tasks=100 \ -D mapred.job.priority=HIGH \ -D mapreduce.job.name="brand_like: statistic" \ -D mapred.output.compress=false \ -inputformat org.apache.hadoop.mapred.SequenceFileAsTextInputFormat \ -outputformat org.apache.hadoop.mapred.TextOutputFormat \ -input $1 \ -output $2 \ -mapper "sh mapper.sh" \ -reducer “sh reducer.sh” \ -file "./basic/map.py" \ -file "./basic/mapper.sh" \ -file "./basic/reducer.sh" \ -file "./basic/reduce.py" } impression_hadoop $input $output
conf下放的是hadoop的一些配置文件,比如hadoop streaming是放在哪里的。
basic是conf的同级类目,这个文件是submit.sh,是放在basic的里面的。
后面跟的是一些参数,
mapred.map.tasks=100 mapper的个数,当系统判定map数少于这个设定时,这个参数才有效。 mapred.reduce.tasks=100 reducer的个数,就是最后输出文件的个数
mapred.job.priority=HIGH 任务执行的优先级 mapreduce.job.name="brand_like: statistic" job的名称 -inputformat org.apache.hadoop.mapred.SequenceFileAsTextInputFormat 输入,是二进制输入,此外还有文本输入inputformat org.apache.hadoop.mapred.SequenceFileAsTextInputFormat -outputformat org.apache.hadoop.mapred.TextOutputFormat 输出,文本输出,还有二进制输出org.apache.hadoop.mapred.SequenceFileOutputFormat
这个可以根据你们自己的需求来设定。
input是你要处理的输入,hdfs上的,output是输出的地址,也是放在hdfs上的。
mapper和reducer是用来指定的你要用的mapper和reducer程序,当reducer指定为NONE的时候,就直接将map后的结果输出,这个时候可以将mapred.reduce.tasks设为0。
-file是用来将你所需要用到的本地文件上传到hadoop上,注意,无论之前的路径位置是如何的,上传到hadoop上后都在同一目录下。
mapper.sh:
awk 'BEGIN{ FS="[^A, ]"; OFS="\t"; } { print $2,$3,$4,$5,$6,$7,$8,$9,$10 }'
mapper.sh可以像我这里一样,直接用shell脚本,把你需要的字段拿出来,也可以进行简单的过滤,比如判定第二个字段>5才可以输出这样子。mapper.sh里也可以写python map.py,这里可以用shell脚本在外面包一层也可以不包。
reducer.sh
python reduce.py
reduce做的事情就是统计、计算。
map.py和reduce.py大家可以直接找网上的wordcount就可以了。