执行mapreduce有两种方式,一种是原生Java写的mr,一种是直接使用Streaming方式,这种方式是在Java上面做了一个封装,可以通过其它语言调用Java原生的mr接口。
第一个文件test.dat:
0067011990999991950051507004...9999999N9+00001+99999999999... 0043011990999991950051512004...9999999N9+00221+99999999999... 0043011990999991950051518004...9999999N9-00111+99999999999... 0043012650999991949032412004...0500001N9+01111+99999999999... 0043012650999991949032418004...0500001N9+01121+99999999999... 0043012650999991949032418004...0500001N9+01221+99999999999...
第二个文件:map.py
#!usr/bin/python
import re
import sys
for line in sys.stdin:
val=line.strip()
(year,temp)=(val[15:19],val[40:45])
print "%s\t%s" % (year,temp)
第三个文件:red.py
#!usr/bin/python
import sys
(last_key,max_val)=(None,0)
for line in sys.stdin:
(key,val)=line.strip().split('\t')
if last_key and last_key!=key:
print '%s\t%s' % (last_key, max_val)
(last_key, max_val)=(key,int(val))
else:
(last_key, max_val)=(key,max(max_val,int(val)))
if last_key:
print '%s\t%s' % (last_key, max_val)执行的mr命令:
hadoop jar /opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/jars/hadoop-streaming-2.5.0-cdh5.3.2.jar -mapper 'python map.py' -file /usr/local/tables/map.py -reducer 'python red.py' -file /usr/local/tables/red.py -input /tmp/logs/test.dat -output /tmp/test/
为了让Hadoop将程序分发给其他机器,需要再加一个-file参数用于指明要分发的程序放在哪里。
原文地址:http://blog.csdn.net/y0908105023/article/details/45074531