Hadoop實踐之Python(一)

Barnett8023發表於2018-09-14

關於hadoop,建議大家在自己的linux上面跟著網上的教程搭建一次單節點和多節點的hadoop平臺,亦可參考Hadoop安裝教程_單機/偽分散式配置。關於mapreduce,我是新手,只能從“分而治之”的角度來考慮,首先“map”也就是”分”——資料分割,然後“reduce”對"map"處理後的結果進一步的運算,這裡給出的例子是一般的hadoop入門程式“WordCount”,就是首先寫一個map程式用來將輸入的字串分割成單個的單詞,然後reduce這些單個的單詞,相同的單詞就對其進行計數,不同的單詞分別輸出,結果輸出每一個單詞出現的頻數。

注意:關於資料的輸入輸出是通過sys.stdin(系統標準輸入)和sys.stdout(系統標準輸出)來控制資料的讀入與輸出。所有的指令碼執行之前都需要修改許可權,否則沒有執行許可權,例如下面的指令碼建立之前使用“chmod +x mapper.py

mapper.py

#!/usr/bin/env python
# ($HADOOP_HOME/mapper.py)
import sys

for line in sys.stdin:  # 遍歷讀入資料的每一行
    
    line = line.strip()  # 將行尾行首的空格去除
    words = line.split()  #按空格將句子分割成單個單詞
    for word in words:
        print '%s\t%s' %(word, 1)
複製程式碼

reducer.py

#!/usr/bin/env python
# ($HADOOP_HOME/reducer.py)
from operator import itemgetter
import sys

current_word = None  # 為當前單詞
current_count = 0  # 當前單詞頻數
word = None

for line in sys.stdin:
    words = line.strip()  # 去除字串首尾的空白字元
    word, count = words.split('\t')  # 按照製表符分隔單詞和數量
    
    try:
        count = int(count)  # 將字串型別的‘1’轉換為整型1
    except ValueError:
        continue

    if current_word == word:  # 如果當前的單詞等於讀入的單詞
        current_count += count  # 單詞頻數加1
    else:
        if current_word:  # 如果當前的單詞不為空則列印其單詞和頻數
            print '%s\t%s' %(current_word, current_count)  
        current_count = count  # 否則將讀入的單詞賦值給當前單詞,且更新頻數
        current_word = word

if current_word == word:
    print '%s\t%s' %(current_word, current_count)
複製程式碼

檢視輸出結果

  cd $HADOOP_HOME
  echo "foo foo quux labs foo bar zoo zoo hying" | ./mapper.py | sort -k 1,1 | ./reducer.py
  # echo是將後面“foo ****”字串輸出,並利用管道符“|”將輸出資料作為mapper.py這個指令碼的輸入資料,並將mapper.py的資料輸入到reducer.py中,其中引數sort -k 1,1是將reducer的輸出內容按照第一列的第一個字母的ASCII碼值進行升序排序
複製程式碼

下面看一些指令碼的輸出結果:

Hadoop實踐之Python(一)

讓Python程式碼在hadoop上跑起來!

一、準備輸入資料

  • 接下來,先下載三本書:

     mkdir -p tmp/gutenberg
     cd tmp/gutenberg
     wget http://www.gutenberg.org/ebooks/20417.txt.utf-8
     wget http://www.gutenberg.org/files/5000/5000-8.txt
     wget http://www.gutenberg.org/ebooks/4300.txt.utf-8
    複製程式碼
  • 然後把這三本書上傳到hdfs檔案系統上:

    hdfs dfs -mkdir ./input # 在hdfs上的該使用者目錄下建立一個輸入檔案的資料夾
    hdfs dfs -put ./tmp/gutenberg/*.txt ./input # 上傳文件到hdfs上的輸入資料夾中
    複製程式碼
  • 尋找你的streaming的jar檔案存放地址,注意2.6的版本放到share目錄下了,可以進入hadoop安裝目錄尋找該檔案:

    cd $HADOOP_HOME
    find ./ -name "*streaming*"
    複製程式碼
  • 由於這個檔案的路徑比較長,因此我們可以將它寫入到環境變數:

    vi ~/.bashrc  # 開啟環境變數配置檔案
    # 在裡面寫入streaming路徑
    export STREAM=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar
    source ~/.bashrc 
    複製程式碼
  • 通過streaming介面執行指令碼

    hadoop jar $STREAM  -files ./mapper.py,./reducer.py -mapper ./mapper.py -reducer ./reducer.py -input ./input/gutenberg*.txt -output ./output
    複製程式碼
    • 就會complete啦,你就可以通過如下方式檢視計數結果
      Hadoop實踐之Python(一)

再次,感謝以下文件的支援: 讓python在hadoop上跑起來 streaming介紹

相關文章