這裡以統計單詞為例
mkdir /usr/local/hadoop-python
cd /usr/local/hadoop-python
#!/usr/bin/env python
import sys
# input comes from stdin (standard input) 輸入來自stdin(標準輸入)
for line in sys.stdin:
# remove leading and trailing whitespace 刪除前導和尾隨空格
line = line.strip(
)# split the line into words 把線分成單詞
words = line.split(
)# increase counters 增加櫃檯
for word in words:
# write the results to stdout (standard output);
# 將結果寫入stdout(標準輸出);
# what we output here will be the input for the
# reduce step, i.e. the input for reducer.py
# tab-delimited; the trivial word count is 1
# 我們在此處輸出的內容將是reduce步驟的輸入,即reducer.py製表符分隔的輸入; # 平凡的字數是1
print
'%s\t%s'
%(word,
1)
檔案儲存後,請注意將其許可權作出相應修改:
vim reducer.py
#!/usr/bin/env python
from operator import itemgetter
import sys
current_word =
none
current_count =
0word =
none
# input comes from stdin 輸入來自stdin
for line in sys.stdin:
# remove leading and trailing whitespace
# 刪除前導和尾隨空格
line = line.strip(
) word, count = line.split(
'\t',1
)# convert count (currently a string) to int
# 將count(當前為字串)轉換為int
try:
count =
int(count)
except valueerror:
# count was not a number, so silently
# ignore/discard this line
# count不是數字,因此請忽略/丟棄此行
continue
# this if-switch only works because hadoop sorts map output
# by key (here: word) before it is passed to the reducer
# 該if開關僅起作用是因為hadoop在將對映輸出傳遞給reducer之前按鍵(此處為word)對 # 對映輸出進行排序
if current_word == word:
current_count += count
else
:if current_word:
# write result to stdout
# 將結果寫入stdout
print
'%s\t%s'
%(current_word, current_count)
current_count = count
current_word = word
# do not forget to output the last word if needed!
# 如果需要,不要忘記輸出最後乙個單詞!
if current_word == word:
print
'%s\t%s'
%(current_word, current_count)
檔案儲存後,請注意將其許可權作出相應修改:
chmod a+x /usr/local/hadoop-python/reducer.py
首先可以在本機上測試以上**,這樣如果有問題可以及時發現:
輸出:
foo 1
foo 1
quux 1
labs 1
foo 1
bar 1
quux 1
再執行以下包含reduce.py的**:
輸出:
/www.gutenberg.org/cache/epub/20417/pg20417.txt
然後把這二本書上傳到hdfs檔案系統上:
# 在hdfs上的該使用者目錄下建立乙個輸入檔案的資料夾
hdfs dfs -mkdir /input
# 上傳文件到hdfs上的輸入資料夾中
hdfs dfs -put /usr/local/hadoop-python/input/pg20417.txt /input
cd $hadoop_home
find .
/-name "*streaming*.jar"
然後就會找到我們的share資料夾中的hadoop-straming*.jar檔案:
.
/share/hadoop/tools/lib/hadoop-streaming-2.8.4.jar
./share/hadoop/tools/sources/hadoop-streaming-2.8.4-test-sources.jar
./share/hadoop/tools/sources/hadoop-streaming-2.8.4-sources.jar
/usr/local/hadoop-2.8.4/share/hadoop/tools/lib
由於這個檔案的路徑比較長,因此我們可以將它寫入到環境變數:
vim /etc/profile
export stream=/usr/local/hadoop-2.8.4/share/hadoop/tools/lib/hadoop-streaming-2.8.4.jar
由於通過streaming介面執行的指令碼太長了,因此直接建立乙個shell名稱為run.sh來執行:
vim run.sh
hadoop jar /usr/local/hadoop-2.8.4/share/hadoop/tools/lib/hadoop-streaming-2.8.4.jar \
/usr/local/hadoop-python/reducer.py \
-reducer /usr/local/hadoop-python/reducer.py \
-input /input/pg20417.txt \
-output /output1
Eclipse開發Hadoop程式
如鏈結 所示,如果想通過eclipse開發hadoop程式,需要以下步驟 3 通過window preferens,配置hadoop map reduce選項。指定hadoop安裝位址。4 配置map reduce locations。在window show view中開啟map reduce l...
Hadoop之MapReduce程式開發流程
對於乙個資料處理問題,若需要mapreduce,那麼如何設計和實現?mapreduce程式基礎模板,包含兩個部分,乙個是map,乙個是reduce。map和reduce的設計取決解決問題的演算法思路 而map和reduce的執行需要作業的排程。因此,mapreduce程式開發可以遵循以下流程。第一步...
hadoop 開發基礎
目錄 rz的使用 vi 快捷鍵 檔案許可權的操作 配置免密碼登陸 後台服務管理 iptable 防火牆 linux 中的軟體安裝 本地yum安裝倉庫配置 檔案上傳到linux 是上傳到當前目錄所在的資料夾 yum list grep lrzsz sudo yum y install lrzsz.x8...