最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python + hadoop streaming 分布式編程(一) -- 原理介紹,樣例程序與本地調(diào)試

 更新時間:2014年07月14日 11:39:29   投稿:hebedich  
Hadoop 是一個實現(xiàn)了 MapReduce 計算模型的開源分布式并行編程框架,借助于 Hadoop, 程序員可以輕松地編寫分布式并行程序,將其運行于計算機集群上,完成海量數(shù)據(jù)的計算。

MapReduce與HDFS簡介
什么是Hadoop?

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

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

圖片來自Hadoop: The Definitive Guide

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

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

圖片來自Hadoop: The Definitive Guide

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

Hadoop Streaming的優(yōu)缺點

優(yōu)點

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

缺點

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

用python編寫簡單的Hadoop Streaming程序

這里提供兩個例子:

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

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

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

從stdin得到的每一行數(shù)據(jù)末尾似乎會有\(zhòng)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()里調(diào)整。

本地調(diào)試

本地調(diào)試用于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執(zhí)行時可以通過命令行參數(shù)調(diào),本地調(diào)試也可以進行相應的調(diào)整,主要是調(diào)整sort的參數(shù)。因此為了能夠熟練進行本地調(diào)試,建議先掌握sort命令的用法。

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

./mapper.py

來代替

python mapper.py

相關文章

  • 深入學習python多線程與GIL

    深入學習python多線程與GIL

    這篇文章主要介紹了深入學習python多線程與GIL,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 解決pycharm中opencv-python導入cv2后無法自動補全的問題(不用作任何文件上的修改)

    解決pycharm中opencv-python導入cv2后無法自動補全的問題(不用作任何文件上的修改)

    這篇文章主要介紹了解決pycharm中opencv-python導入cv2后無法自動補全的問題(不用作任何文件上的修改),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • maven沖突問題解決

    maven沖突問題解決

    這篇文章主要介紹了maven沖突問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python打印9宮格、25宮格等奇數(shù)格 滿足橫豎斜相加和相等

    python打印9宮格、25宮格等奇數(shù)格 滿足橫豎斜相加和相等

    這篇文章主要為大家詳細介紹了python打印9宮格、25宮格等奇數(shù)格,滿足橫豎斜相加和相等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • python正則表達式 匹配反斜杠的操作方法

    python正則表達式 匹配反斜杠的操作方法

    這篇文章主要介紹了python正則表達式 匹配反斜杠的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • python用700行代碼實現(xiàn)http客戶端

    python用700行代碼實現(xiàn)http客戶端

    這篇文章主要介紹了python用700行代碼實現(xiàn)http客戶端的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python中常見的三種字符串格式化輸出方法小結

    Python中常見的三種字符串格式化輸出方法小結

    字符串格式化是編程中一個常見的需求,它可以們將不同類型的數(shù)據(jù)插入到字符串中,在?Python?中,有多種方法可以執(zhí)行字符串格式化,本文為大家介紹了常見的三種方法,希望對大家有所幫助
    2024-02-02
  • python3+PyQt5+Qt Designer實現(xiàn)堆疊窗口部件

    python3+PyQt5+Qt Designer實現(xiàn)堆疊窗口部件

    這篇文章主要為大家詳細介紹了python3+PyQt5+Qt Designer實現(xiàn)堆疊窗口部件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Django中使用Celery的教程詳解

    Django中使用Celery的教程詳解

    Django是一個開放源代碼的Web應用框架,由Python寫成,Celery是一個基于python開發(fā)的分布式任務隊列。這篇文章主要介紹了Django中使用Celery教程,需要的朋友可以參考下
    2018-08-08
  • Python操作MySQL模擬銀行轉(zhuǎn)賬

    Python操作MySQL模擬銀行轉(zhuǎn)賬

    這篇文章主要為大家詳細介紹了Python操作MySQL模擬銀行轉(zhuǎn)賬,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

福清市| 正镶白旗| 黎城县| 蕲春县| 吉木萨尔县| 灌云县| 新沂市| 五寨县| 拉萨市| 黄冈市| 永靖县| 双城市| 双城市| 寿光市| 东乡| 固阳县| 宜昌市| 大厂| 临颍县| 砚山县| 太仆寺旗| 新邵县| 勐海县| 开阳县| 汉阴县| 穆棱市| 宁蒗| 利津县| 泗水县| 利川市| 五常市| 方山县| 伽师县| 岳阳市| 体育| 旌德县| 大理市| 徐州市| 栾川县| 汽车| 泗水县|