標籤:python mapreduce hadoop
執行mapreduce有兩種方式,一種是原生Java寫的mr,一種是直接使用Streaming方式,這種方式是在Java上面做了一個封裝,可以通過其它語言調用Java原生的mr介面。
- 優點
- 可以使用自己喜歡的語言來編寫MapReduce程式(換句話說,不必寫Java XD)
- 不需要像寫Java的MR程式那樣import一大堆庫,在代碼裡做一大堆配置,很多東西都抽象到了stdio上,代碼量顯著減少
- 因為沒有庫的依賴,調試方便,並且可以脫離Hadoop先在本地用管道類比調試
- 缺點
- 只能通過命令列參數來控制MapReduce架構,不像Java的程式那樣可以在代碼裡使用API,控制力比較弱,有些東西鞭長莫及
- 因為中間隔著一層處理,效率會比較慢
下面是一個例子:
第一個檔案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/pythonimport reimport sysfor 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/pythonimport 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參數用於指明要分發的程式放在哪裡。
python執行mapreduce