首先有三個文件 red_new.py map_new.py run.sh
代碼如下
map_new.py
import sys
for line in sys.stdin: // //系統模塊
ss = line.strip().split(' ') ////我們讀的每一句話都按空格分開,strip()避免輸入的 字符串有回車,制表符等隱含字符
for word in ss:
print '\t'.join([word.strip(), '1'])//這個單詞就是key,當這個單詞被我觀察到一次,就加一個1
red_new.py
import sys
cur_word = None
sum = 0
for line in sys.stdin: //標準輸入
ss = line.strip().split('\t') // 按照輸出重新變成一個數字
if len(ss) != 2: //把ss當作一個數組進行遍歷,if判斷這個數組是不是有兩列,這兩列分別存儲 word和count,避免一些臟數據
continue
word, cnt = ss
if cur_word == None:
cur_word = word
if cur_word != word:
print '\t'.join([cur_word, str(sum)])
cur_word = word
sum = 0
sum += int(cnt)
print '\t'.join([cur_word, str(sum)])
run.sh
HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"
#INPUT_FILE_PATH_1="/The_Man_of_Property.txt"
INPUT_FILE_PATH_1="/1.data"
OUTPUT_PATH="/output"
$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH
# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH_1 \
-output $OUTPUT_PATH \
-mapper "python map_new.py" \
-reducer "python red_new.py" \
-file ./map_new.py \
-file ./red_new.py
~
mapreduce的核心思想是分而治之,先用map函數對數據進行拆分成一個個單詞,然后用reduce對這些單個的單詞進行匯總。
先用 python的方式來檢查一下
安裝好hadoop之后,用集群的方式搭建,啟動 hadoop ,進入到hadoop安裝目錄
如果是第一次啟動需要進行格式化./hadoop namenode -format (就像你買的電腦磁盤也需要進行格式化成fat32格式才能用,格式化主要是針對HDFS)
命令: ./bin/start-all.sh
命令 :jps 查看主節點和從節點的狀態
主節點看到job tracker
1779 JobTracker
1940 Jps
1699 SecondaryNameNode
1556 NameNode
從節點上看到tasktracke
1018 -- process information unavailable
1446 Jps
1263 DataNode
1334 TaskTracke
1.png
首先提交文件
命令:/usr/local/src/hadoop-1.2.1/bin/hadoop fs -put ./map_new.py /
共3個文件 red_new.py map_new.py 文章
用hadoop方式
訪問:http://192.168.95.128:50030/jobdetails.jsp?jobid=job_201801071700_0003
/usr/local/src/hadoop-1.2.1/bin/hadoop fs -text /output/part-00000
2.png
刪除文件
/usr/local/src/hadoop-1.2.1/bin/hadoop fs -rmr /The_Man_of_Property.txt