1. 程式人生 > >hadoop2.7第一個python例項(超詳細)

hadoop2.7第一個python例項(超詳細)

沒有任何基礎,第一次跑hadoop例項,遇到不少問題,記錄下來以便自查和幫助同樣情況的hadoop學習者。

叢集組成:VMwawre14.1+CentOS6.5+hadoop2.7,  3個虛擬機器節點

hadoop安裝目錄:/opt/hadoop

例子:模仿 WordCount 並使用Python來實現,例子通過讀取文字檔案來統計出單詞的出現次數。結果也以文字形式輸出,每一行包含一個單詞和單詞出現的次數,兩者中間使用製表符來想間隔。

本文章主要講跑通例子的操作,原理看上面的參考部落格。

一、下載文字檔案

   從以上三個網址中複製三本書出來,貼上到windows上新建的txt中,另存為Science.txt、Notebooks.txt、Ulysses.txt,記得在另      存為的視窗中,右下角選擇utf-8編碼,最後將此三本書複製到叢集中的master虛擬機器中,臨時儲存目錄為:/tmp/gutenberg

   [[email protected] ~]$ ls -l /tmp/gutenberg    total 3524    -rwxrw-rw- 1 CAI CAI 1396148 Sep 16 11:42 Notebooks.txt    -rwxrw-rw- 1 CAI CAI  661810 Sep 16 11:42 Science.txt    -rwxrw-rw- 1 CAI CAI 1548179 Sep 16 11:42 Ulysses.txt

二、windows檔案轉linux檔案

       從windows中直接拷貝檔案到linux,由於兩個系統的換行符表示不一樣,所以會有識別問題。比如從windows中編寫一個demo.py檔案,雖然加了在檔案首行輸入#!/usr/bin/env python,以便在linux上跑,但是執行時會出現No such file or directory,也就是說找不到python命令檔案,原因是:

windows檔案格式是DOS,而非UNIX格式。Windows格式下,換行符是CRLT,使得demo.py第一行變成了#!/usr/bin/env python\015(CR的ascaii 15)

使用Linux VIM檢查檔案格式:":set ff 或者:set fileformate"

使用Linux VIM轉換檔案格式:“:set ff=unix或者:set fileformate=unix”

使用Windows UltraEdit做檔案格式轉換:“file->Conversions->DOS->UNIX”

也就是說從windows中拷貝到linux的檔案,用vim開啟該檔案,在命令列模式下面輸入‘:set ff’則可以檢視到格式為dos, 用命令“:set ff=unix”就可以改為unix。 

用以上方法將Science.txt、Notebooks.txt、Ulysses.txt三本書的格式改為unix。以後拷貝進來的windows檔案都可進行此操作。

三、編寫python檔案

由於不太熟悉linux的vim編輯,所以在windows上編寫mapper.py、reducer.py可執行檔案.

mapper.py:

#!/usr/bin/env python
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
from operator import itemgetter
import sys
word2count = {}
for line in sys.stdin:
    line = line.strip()
    word, count = line.split('\\t', 1)
    try:
        count = int(count)
        word2count[word] = word2count.get(word, 0) + count
    except ValueError:
        pass
sorted_word2count = sorted(word2count.items(), key=itemgetter(0))
for word, count in sorted_word2count:
    print '%s\\t%s'% (word, count)

將此兩個檔案複製黏貼到叢集master虛擬機器上,目錄為/home/CAI/Downloads/

對此兩檔案進行上面的第二步操作,將windows檔案轉為linux檔案

給以上兩個檔案賦予可執行許可權:

chmod +x /home/CAI/Downloads/mapper.py

chmod +x /home/CAI/Downloads/reducer.py

四、測試程式碼

在執行MapReduce job測試前嘗試手工測試mapper.py 和 reducer.py指令碼,以免得不到任何返回結果

[[email protected] ~]$ echo "foo foo quux labs foo bar quux" | /home/CAI/Downloads/mapper.py foo    1 foo    1 quux    1 labs    1 foo    1 bar    1 quux    1 [[email protected] ~]$ echo "foo foo quux labs foo bar quux" | /home/CAI/Downloads/mapper.py | /home/CAI/Downloads/reducer.py bar    1 foo    3 labs    1 quux    2

五、複製文字資料到HDFS

1、首先建立hdfs目錄,可以在master虛擬機器上任何地方。注意建立目錄和檢視目錄都需要用hadoop自有的命令,而非linux的      命令;另外在執行/opt/hadoop/bin/hadoop fs -mkdir /new_dir建立new_dir目錄時,出錯了。從報錯中發現是版本的原因,        2.x以前的版本這個命令,2.x之後的版本命令改成了:/opt/hadoop/bin/hdfs dfs -mkdir -p   /new_dir。

     本人建立hdfs目錄的命令如下:

      [[email protected] ~]$ /opt/hadoop/bin/hdfs dfs -mkdir -p /usr/hadoop

    注意:[[email protected] hadoop]$ /opt/hadoop/bin/hdfs dfs -rm -r -f /usr/hadoop   可以刪除目錄

     檢視剛剛建立的目錄,此處用ls /usr是檢視不到hadoop目錄的,必須要用hadoop自己的命令檢視:

     [[email protected] ~]$ /opt/hadoop/bin/hdfs dfs -ls /usr/hadoop     18/09/16 15:00:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java      classes where applicable      Found 1 items      drwxr-xr-x   - CAI supergroup          0 2018-09-16 14:58 /usr/hadoop

查詢結果如上藍色字型部分,上面紅色字型部分為警告,解決上述警告的參考部落格為:

     注意解決上述警告問題需要在所有節點都操作一遍,別隻給master糾正,slave1和slave2也要糾正(叢集配置更改要時刻記得        所有節點)。

2、將含三本書的/tmp/gutenberg目錄複製到剛剛建立的hdfs目錄中:

     [[email protected] ~]$ /opt/hadoop/bin/hdfs dfs -copyFromLocal /tmp/gutenberg /usr/hadoop/gutenberg

     檢視複製效果:

     [[email protected] ~]$ /opt/hadoop/bin/hdfs dfs -ls /usr/hadoop/gutenberg      Found 3 items      -rw-r--r--   2 CAI supergroup    1396148 2018-09-16 15:07 /usr/hadoop/gutenberg/Notebooks.txt      -rw-r--r--   2 CAI supergroup     661810 2018-09-16 15:07 /usr/hadoop/gutenberg/Science.txt      -rw-r--r--   2 CAI supergroup    1548179 2018-09-16 15:07 /usr/hadoop/gutenberg/Ulysses.txt

六、執行MapReduce job

1、在hadoop安裝目錄下(省的寫絕對路徑),執行命令:  

  注意:以上命令中最後的輸出目錄gutenberg-output不能已存在(上一次執行若出錯,這個資料夾就會已存在),若存在了會報錯,得先刪除該存在的目錄:[[email protected] hadoop]$ ./bin/hdfs dfs -rm -r -f /usr/hadoop/gutenberg-output

即便沒碰到上面問題,還是有錯誤,可看到其中一條日誌如下:

java.io.IOException: Cannot run program "/home/CAI/Downloads/mapper.py": error=2, No such file or directory

因為mapper.py經過第四大步測試,是可以成功執行的,經過命令java --version可以看到正常輸出java版本,暫時沒考慮java問題。後來再度看上面的錯誤,是找不到檔案mapper.py,突然想到經過上面第三大步驟,雖然master上有檔案mapper.py和reducer.py,但是兩個資料節點卻沒有,於是將此兩檔案拷貝到兩資料節點的/home/CAI/Downloads/目錄中,再次執行,成功!

記住:可執行檔案一定要拷貝到所有節點上去!

執行過程中的部分日誌如下圖所示:

 

在master節點,開啟火狐瀏覽器,登入http://192.168.137.130:8088/,可以看到如下圖: