Hadoop MapReduce是一個用於處理海量數據的分佈式計算框架,這個框架解決了諸如數據分佈式存儲,做業調度,容錯,機器間通訊等複雜問題,可讓沒有分佈式處理經驗的工程師很是簡單的寫出並行分佈式程序。html
MapReduce採用「分而治之」的思想,將計算任務抽象成Map和Reduce兩個計算過程:python
A.首先把輸入分割成不相關的若干鍵值(key1/value1)集合,這些鍵值會有多個map任務來並行處理。shell
B.MapReduce會對map的輸出(一些中間鍵值對key2/value2集合)按照key2進行排序,排序用memcmp的方式對key在內存中字節數組進行比較後進行排序。編程
C.將屬於同一個key2的全部value2組合分至一個reduce做爲輸入數組
D.由reduce任務計算出最終結果並輸入key3/value3網絡
一般計算任務的輸入和輸出都是存放在HDFS(Hadoop Distributed File System)中,系統會盡可能調度計算任務到數據所在的節點上運行,而不是將數據移動到計算節點,減小大量數據在網絡中的傳輸,儘可能節省帶寬。app
Hadoop MR和HDFS有Java實現,默認提供Java編程接口,另外提供C++編程接口和Streaming框架,Streaming框架容許任何程序語言實現的程序在MR中使用,方便已有程序向Hadoop平臺移植。框架
Streaming的原理是用Java實現一個包裝用戶程序的MR程序,該程序負責調用MR Java接口獲取key/value對輸入,建立一個新的進程啓動包裝過的用戶程序,將數據經過管道傳遞給包裝過的用戶處理程序,而後調用MR Java接口將用戶程序的輸出切分紅key/value對輸入。分佈式
mapper爲一個python程序,reduce直接爲「cat」命令,不作其餘處理:(文件爲一個shell腳本)工具
1: $hadoop streaming \
2: -input "$input_path" \
3: -output "$output_path" \
4: -mapper "mapper.py" \
5: -reduce "cat" \
6: -file "mapper.py" \
7: -jobconf mapred.job.name="Streaming_demo"
A.Mapper程序:對輸入key/value數據進行處理;
B.Reducer程序:對mapper的輸出進行歸併處理;
C.Combiner:在本地對一個計算節點上的mapper輸出進行歸併
D.Partitioner:將mapper的輸出分配到reducer
E.InputFormat/OutputFormat:對輸入數據進行切分,保存輸出數據
A. 一方面用其餘語言(包括腳本語言)編寫的程序能夠方便地移植到Hadoop平臺上,程序只須要按照必定的格式從標準輸入讀取數據、向標準輸出寫數據就能夠在Hadoop平臺上使用,原有的單機程序稍加改動就能夠在Hadoop平臺進行分佈式處理;另外一方面用於Streaming的程序能夠在單機上用下面的方式運行,所以能夠先用小規模數據在單機調試,使用本地的調試方法和調試工具,節省開發測試的時間。
cat input | mapper | sort | reducer > output
B. 可使用性能更好的語言(C/C++)來編寫程序。
C. Streaming框架彙總經過limit等方式能夠靈活的先知應用程序使用的內存等資源
A. Hadoop Streaming默認只能處理文本數據,沒法直接對二進制數據進行處理
B. Streaming中的mapper和reducer默認只能向標準輸出寫數據,不能方便地處理多路輸出