用hadoop streaming写map-reduce程序,可使用python,shell等脚本语言

xiaoxiao2021-02-28  130

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

转载请注明原文地址: https://www.6miu.com/read-65024.html

最新回复(0)