1.Hadoop&Streaming簡介
1.1 Hadoop簡介
Hadoop MapReduce是一個用於處理海量數據的分布式計算框架,這個框架解決了諸如數據分布式存儲,作業調度,容錯,機器間通信等復雜問題,可以讓沒有分布式處理經驗的工程師非常簡單的寫出並行分布式程序。
MapReduce采用“分而治之”的思想,將計算任務抽象成Map和Reduce兩個計算過程:
A.首先把輸入分割成不相關的若干鍵值(key1/value1)集合,這些鍵值會有多個map任務來並行處理。
B.MapReduce會對map的輸出(一些中間鍵值對key2/value2集合)按照key2進行排序,排序用memcmp的方式對key在內存中字節數組進行比較后進行排序。
C.將屬於同一個key2的所有value2組合分至一個reduce作為輸入
D.由reduce任務計算出最終結果並輸入key3/value3
通常計算任務的輸入和輸出都是存放在HDFS(Hadoop Distributed File System)中,系統會盡量調度計算任務到數據所在的節點上運行,而不是將數據移動到計算節點,減少大量數據在網絡中的傳輸,盡量節省帶寬。
1.2 Streaming簡介
Hadoop MR和HDFS有Java實現,默認提供Java編程接口,另外提供C++編程接口和Streaming框架,Streaming框架允許任何程序語言實現的程序在MR中使用,方便已有程序向Hadoop平台移植。
Streaming的原理是用Java實現一個包裝用戶程序的MR程序,該程序負責調用MR Java接口獲取key/value對輸入,創建一個新的進程啟動包裝過的用戶程序,將數據通過管道傳遞給包裝過的用戶處理程序,然后調用MR Java接口將用戶程序的輸出切分成key/value對輸入。
1.3 Demo示例
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"
1.4 Streaming開發過程中需要注意的幾個方面:
A.Mapper程序:對輸入key/value數據進行處理;
B.Reducer程序:對mapper的輸出進行歸並處理;
C.Combiner:在本地對一個計算節點上的mapper輸出進行歸並
D.Partitioner:將mapper的輸出分配到reducer
E.InputFormat/OutputFormat:對輸入數據進行切分,保存輸出數據
2.Streaming優缺點分析
2.1 Streaming優點
A. 一方面用其他語言(包括腳本語言)編寫的程序可以方便地移植到Hadoop平台上,程序只需要按照一定的格式從標准輸入讀取數據、向標准輸出寫數據就可以在Hadoop平台上使用,原有的單機程序稍加改動就可以在Hadoop平台進行分布式處理;另一方面用於Streaming的程序可以在單機上用下面的方式運行,因此可以先用小規模數據在單機調試,使用本地的調試方法和調試工具,節省開發測試的時間。
cat input | mapper | sort | reducer > output
B. 可以使用性能更好的語言(C/C++)來編寫程序。
C. Streaming框架匯總通過limit等方式可以靈活的先知應用程序使用的內存等資源
2.2 Streaming缺點
A. Hadoop Streaming默認只能處理文本數據,無法直接對二進制數據進行處理
B. Streaming中的mapper和reducer默認只能向標准輸出寫數據,不能方便地處理多路輸出