我一般都是用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就可以了。