日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试

發布時間:2023/12/10 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


原文地址:http://www.cnblogs.com/joyeecheung/p/3757915.html

相關隨筆: ?點擊打開鏈接

  • Hadoop-1.0.4集群搭建筆記
  • 用python + hadoop streaming 編寫分布式程序(二) -- 在集群上運行與監控
  • 用python + hadoop streaming 編寫分布式程序(三) -- 自定義功能

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,輸出最后結果。

圖片來自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幫我們解決中間繁瑣的步驟,運行分布式程序。

圖片來自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 groupbydef 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 <input path> | python <path to mapper script> | sort -t $'\t' -k1,1 | python <path to reducer script> > <output path>

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

    $ python <path to mapper script> < <input path> | sort -t $'\t' -k1,1 | python <path to reducer script> > <output path>

    這里有幾點需要注意:

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

    sort -t $'\t' -k1,1

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

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

    ./mapper.py

    來代替

    python mapper.py
  • 推薦閱讀


    Hadoop Streaming的官方文檔,建議通讀
    Recommendations with hadoop streaming and python

    總結

    以上是生活随笔為你收集整理的用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。