首先看壹下Hadoop解決了什麽問題,Hadoop就是解決了大數據(大到壹臺計算機無法進行存儲,壹臺計算機無法在要求的時間內進行處理)的可靠存儲和處理。
HDFS,在由普通PC組成的集群上提供高可靠的文件存儲,通過將塊保存多個副本的辦法解決服務器或硬盤壞掉的問題。
MapReduce,通過簡單的Mapper和Reducer的抽象提供壹個編程模型,可以在壹個由幾十臺上百臺的PC組成的不可靠集群上並發地,分布式地處理大量的數據集,而把並發、分布式(如機器間通信)和故障恢復等計算細節隱藏起來。而Mapper和Reducer的抽象,又是各種各樣的復雜數據處理都可以分解為的基本元素。這樣,復雜的數據處理可以分解為由多個Job(包含壹個Mapper和壹個Reducer)組成的有向無環圖(DAG),然後每個Mapper和Reducer放到Hadoop集群上執行,就可以得出結果。
用MapReduce統計壹個文本文件中單詞出現的頻率的示例WordCount請參見:WordCount?-?Hadoop?Wiki,如果對MapReduce不恨熟悉,通過該示例對MapReduce進行壹些了解對理解下文有幫助。
在MapReduce中,Shuffle是壹個非常重要的過程,正是有了看不見的Shuffle過程,才可以使在MapReduce之上寫數據處理的開發者完全感知不到分布式和並發的存在。
(圖片來源:?Hadoop?Definitive?Guide?By?Tom?White)
廣義的Shuffle是指圖中在Map和Reuce之間的壹系列過程。
Hadoop的局限和不足
但是,MapRecue存在以下局限,使用起來比較困難。
抽象層次低,需要手工編寫代碼來完成,使用上難以上手。
只提供兩個操作,Map和Reduce,表達力欠缺。
壹個Job只有Map和Reduce兩個階段(Phase),復雜的計算需要大量的Job完成,Job之間的依賴關系是由開發者自己管理的。
處理邏輯隱藏在代碼細節中,沒有整體邏輯
中間結果也放在HDFS文件系統中
ReduceTask需要等待所有MapTask都完成後才可以開始
時延高,只適用Batch數據處理,對於交互式數據處理,實時數據處理的支持不夠
對於叠代式數據處理性能比較差
比如說,用MapReduce實現兩個表的Join都是壹個很有技巧性的過程,如下圖所示:?