亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

用python + hadoop streaming 分布式編程(一

系統 1680 0

MapReduce與HDFS簡介
什么是Hadoop?

Google為自己的業務需要提出了編程模型MapReduce和分布式文件系統Google File System,并發布了相關論文(可在Google Research的網站上獲得: GFS 、 MapReduce)。 Doug Cutting和Mike Cafarella在開發搜索引擎Nutch時對這兩篇論文做了自己的實現,即同名的MapReduce和HDFS,合起來就是Hadoop。

MapReduce的Data flow如下圖,原始數據經過mapper處理,再進行partition和sort,到達reducer,輸出最后結果。

用python + hadoop streaming 分布式編程(一) -- 原理介紹,樣例程序與本地調試_第1張圖片

圖片來自Hadoop: The Definitive Guide

Hadoop Streaming原理
Hadoop本身是用Java開發的,程序也需要用Java編寫,但是通過Hadoop Streaming,我們可以使用任意語言來編寫程序,讓Hadoop運行。

Hadoop Streaming的相關源代碼可以在Hadoop的Github repo 查看。簡單來說,就是通過將用其他語言編寫的mapper和reducer通過參數傳給一個事先寫好的Java程序(Hadoop自帶的*-streaming.jar),這個Java程序會負責創建MR作業,另開一個進程來運行mapper,將得到的輸入通過stdin傳給它,再將mapper處理后輸出到stdout的數據交給Hadoop,partition和sort之后,再另開進程運行reducer,同樣地通過stdin/stdout得到最終結果。因此,我們只需要在其他語言編寫的程序里,通過stdin接收數據,再將處理過的數據輸出到stdout,Hadoop streaming就能通過這個Java的wrapper幫我們解決中間繁瑣的步驟,運行分布式程序。

用python + hadoop streaming 分布式編程(一) -- 原理介紹,樣例程序與本地調試_第2張圖片

圖片來自Hadoop: The Definitive Guide

原理上只要是能夠處理stdio的語言都能用來寫mapper和reducer,也可以指定mapper或reducer為Linux下的程序(如awk、grep、cat)或者按照一定格式寫好的java class。因此,mapper和reducer也不必是同一類的程序。

Hadoop Streaming的優缺點

優點

可以使用自己喜歡的語言來編寫MapReduce程序(換句話說,不必寫Java XD)
不需要像寫Java的MR程序那樣import一大堆庫,在代碼里做一大堆配置,很多東西都抽象到了stdio上,代碼量顯著減少
因為沒有庫的依賴,調試方便,并且可以脫離Hadoop先在本地用管道模擬調試

缺點

只能通過命令行參數來控制MapReduce框架,不像Java的程序那樣可以在代碼里使用API,控制力比較弱,有些東西鞭長莫及
因為中間隔著一層處理,效率會比較慢
所以Hadoop Streaming比較適合做一些簡單的任務,比如用python寫只有一兩百行的腳本。如果項目比較復雜,或者需要進行比較細致的優化,使用Streaming就容易出現一些束手束腳的地方。

用python編寫簡單的Hadoop Streaming程序

這里提供兩個例子:

Michael Noll的word count程序
Hadoop: The Definitive Guide里的例程
使用python編寫Hadoop Streaming程序有幾點需要注意:

在能使用iterator的情況下,盡量使用iterator,避免將stdin的輸入大量儲存在內存里,否則會嚴重降低性能

streaming不會幫你分割key和value傳進來,傳進來的只是一個個字符串而已,需要你自己在代碼里手動調用split()

從stdin得到的每一行數據末尾似乎會有\n,保險起見一般都需要使用rstrip()來去掉

在想獲得K-V list而不是一個個處理key-value pair時,可以使用groupby配合itemgetter將key相同的k-v pair組成一個個group,得到類似Java編寫的reduce可以直接獲取一個Text類型的key和一個iterable作為value的效果。注意itemgetter的效率比lambda表達式要高,所以如果需求不是很復雜的話,盡量用itemgetter比較好。

我在編寫Hadoop Streaming程序時的基本模版是

            
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Some description here...
"""

import sys
from operator import itemgetter
from itertools import groupby

def read_input(file):
 """Read input and split."""
 for line in file:
  yield line.rstrip().split('\t')

def main():
 data = read_input(sys.stdin)
 for key, kviter in groupby(data, itemgetter(0)):
  # some code here..

if __name__ == "__main__":
 main()


          

如果對輸入輸出格式有不同于默認的控制,主要會在read_input()里調整。

本地調試

本地調試用于Hadoop Streaming的python程序的基本模式是:

            
$ cat 
            
             | python 
            
               | sort -t $'\t' -k1,1 | python 
              
                 > 
                
                
              
            
          

或者如果不想用多余的cat,也可以用<定向

            
$ python 
            
               < 
              
               | sort -t $'\t' -k1,1 | python 
              
                 > 
                
                
              
            
          

這里有幾點需要注意:

Hadoop默認按照tab來分割key和value,以第一個分割出的部分為key,按key進行排序,因此這里使用

sort -t $'\t' -k1,1
來模擬。如果你有其他需求,在交給Hadoop Streaming執行時可以通過命令行參數調,本地調試也可以進行相應的調整,主要是調整sort的參數。因此為了能夠熟練進行本地調試,建議先掌握sort命令的用法。

如果你在python腳本里加上了shebang,并且為它們添加了執行權限,也可以用類似于

            
./mapper.py

          

來代替

            
python mapper.py

          


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黄 色 免费网 站 成 人 | 久久久久国产一级毛片高清版 | 欧美在线视频7777kkkk | 国产精品亚洲一区在线播放 | 97视频在线观看免费视频 | 欧美成人高清视频 | 天天干天天夜 | 日本在线网址 | 九九99久麻豆精品视传媒 | 国产欧美日韩免费一区二区 | 免费看成人国产一区二区三区 | 色资源在线 | 久久―日本道色综合久久 | 国产成人精品日本亚洲麻豆 | 337p亚洲精品色噜噜狠狠 | 国产成人啪午夜精品网站男同 | 日本四虎影视 | 欧美中文在线观看 | 嫩模一区 | 日韩成人精品在线 | www.4虎影院 www.777奇米 | 俄罗斯一级成人毛片 | 天天综合干| 成人国产一区二区 | 亚洲精品久久久成人 | 在线欧美视频免费观看国产 | 成人日批视频 | 国产做国产爱免费视频 | 夜夜夜夜夜夜夜工噜噜噜 | 5x性区m免费毛片视频看看 | 日韩爱爱网站 | 性夜影院爽黄a爽免费看网站 | 中文字幕在线视频免费观看 | 91网址在线播放 | 久久天天躁狠狠躁夜夜中文字幕 | 日韩欧美精品一区二区 | 亚洲伊人色一综合网 | 毛片黄| 亚1洲二区三区四区免费 | 免费看欧美一级特黄a毛片 免费看欧美一级特黄α大片 | 波多野结衣视频一区二区 |