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/,可以看到如下圖: