關於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碼值進行升序排序
複製程式碼
下面看一些指令碼的輸出結果:
讓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啦,你就可以通過如下方式檢視計數結果
再次,感謝以下文件的支援: 讓python在hadoop上跑起來 streaming介紹