『壹』 maprece為什麼不適合處理小文件
1. 不適合事務/單一請求處理
MapRece絕對是一個離線批處理系統,對於批處理數據應用得很好:MapRece(不論是Google的還是Hadoop的)是用於處理不適合傳統資料庫的海量數據的理想技術。但它又不適合事務/單一請求處理。(HBase使用了來自Hadoop核心的HDFS,在其常用操作中並沒有使用MapRece。)
2. 不能隨即讀取
3. 以蠻力代替索引
在索引是更好的存取機制時,MapRece將劣勢盡顯。
4. low-level語言和操作
「直接開始你想要的 -- 而不是展示一個演算法,解釋如何工作的。」 (關系型資料庫的觀點) -- High level(DBMS)
「展示數據存取的演算法。」 (Codasyl 的觀點) -- Low level(MapRece)
5. 性能問題
想想N個map實例產生M個輸出文件-每個最後由不同的rece 實例處理, 這些文件寫到運行map實例機器的本地硬碟. 如果N是1,000, M是500, map階段產生500,000個本地文件. 當rece階段開始, 500個rece實例每個需要讀入1,000文件,並用類似FTP協議把它要的輸入文件從map實例運行的節點上pull取過來. 假如同時有數量級為100的rece實例運行, 那麼2個或2個以上的rece實例同時訪問同一個map節點來獲取輸入文件是不可避免的-導致大量的硬碟查找, 有效的硬碟運轉速度至少降低20%. 這就是為什麼並行資料庫系統不實現split文件, 採用push(推到socket套接字)而不是pull. 由於MapRece的出色容錯依賴於如何實現split文件, MapRece框架是否成功地轉向使用push範式, 不是很清楚.
6. 僅提供了現代DBMS功能的一小部分
作為用於分布式處理的演算法技術,MapRece不是資料庫,不支持索引、數據更新、事務及完整性約束等,且與多數DBMS工具不兼容。
7. 不適合一般web應用
大部分web應用,只是對數據進行簡單的訪問,每次請求處理所耗費的資源其實非常小,它的問題是高並發,所以要採用負載均衡技術來分擔負載。只有當特殊情況下,比如建索引,進行數據分析等,才可能用MR。
『貳』 maprece如何保證結果文件中key的唯一性
MapRece極大地方便了編程人員在不會分布式並行編程的情況下,將自己的程序運行在分布式系統上。MapRece保證結果文件中key的唯一性的方法為:
1、打開Hadoop集群,打開主機master的終端,輸入【ifconfig】命令查看主機IP地址。
注意事項:
MapRece藉助於函數式程序設計語言Lisp的設計思想,提供了一種簡便的並行程序設計方法,用Map和Rece兩個函數編程實現基本的並行計算任務,提供了抽象的操作和並行編程介面,以簡單方便地完成大規模數據的編程和計算處理。
『叄』 請簡述maprece計算的主要流程
1. 輸入階段:數據被劃分為鍵/值對形式,並在集群的各個節點上進行處理。
2. 映射階段:輸入數據中的每個鍵/值對都會通過用戶定義的映射函數處理,生成一組中間鍵/值對。
3. 排序與分發(Shuffle階段):中間鍵/值對根據鍵進行分組,並發送到對應的節點上。
4. 縮減階段:具有相同鍵的中間值被傳遞給rece函數,進行聚合處理。
5. 輸出階段:最終的鍵/值對被輸出到指定的輸出文件中。
1) 輸入數據介面:InputFormat
- 默認實現類:TextInputFormat
- TextInputFormat的作用:逐行讀取文本數據,以行的起始偏移量為鍵,行內容為值。
- CombineTextInputFormat:合並多個小文件為一個大文件,以提高處理效率。
2) 邏輯處理介面:Mapper
- 用戶需實現的方法:map()、setup()、cleanup()。
3) 分區器(Partitioner)
- HashPartitioner:默認實現,根據key的哈希值和numReces的數量進行分區。
- 自定義分區:如有特殊需求,可以實現自己的分區邏輯。
4) 排序(Sorting)
- 內部排序:對於自定義對象作為鍵的情況,需實現WritableComparable介面,並重寫compareTo()方法。
- 部分排序:每個最終輸出文件內部進行排序。
- 全排序:對所有數據進行全局排序,通常只進行一次rece。
- 二次排序:排序依據兩個條件進行。
5) 合並器(Combiner)
- 合並的作用:提高程序執行效率,減少IO傳輸。
- 使用合並器時不得改變原業務處理結果。
6) 邏輯處理介面:Recer
- 用戶需實現的方法:rece()、setup()、cleanup()。
7) 輸出數據介面:OutputFormat
- 默認實現類:TextOutputFormat
- 功能邏輯:每對鍵值輸出為文件的一行。
- 用戶可自定義輸出格式。
『肆』 如何使用Hadoop的MultipleOutputs進行多文件輸出
有時候,我們使用Hadoop處理數據時,在Rece階段,我們可能想對每一個輸出的key進行單獨輸出一個目錄或文件,這樣方便數據分析,比如根據某個時間段對日誌文件進行時間段歸類等等。這時候我們就可以使用MultipleOutputs類,來搞定這件事,
下面,先來看下散仙的測試數據:
Java代碼
/**
*.
*
*@
*@.
*/
(StringnamedOutput){
if(namedOutput==null||namedOutput.length()==0){
(
"NamecannotbeNULLoremtpy");
}