MapReduce初探

541732025發表於2014-03-22
Map-Reduce處理過程(分析氣象資料的map-reduce過程)

1,呼叫標準的input類(預設TextInputFormat),將輸入資料轉化成標準的樣式,成為map的輸入。
2,map過程,提取出需要的資料,這裡提取出年份、溫度這兩個資料,輸出成key-value對(標準樣式)
3,系統自動進行shuffle過程。把key相同的行聚合在一起,輸出為key-資料集合(或者陣列),成為reduce的輸入
4,reduce過程,對資料集合處理,求得溫度最大值。
5,reduce輸出,呼叫output類(預設TextOutputFormat)寫入HDFS檔案。

一般完成Map-Reduce最基本需要3段程式:Map、Reduce、作業排程器。

Map-Reduce程式設計模型

分片的問題:
1,分片非常接近物理塊邊界
2,通常每個分片對應一個task
3,透過分片實現計算資料本地化,減少資料的網路傳輸
4,分片包含的資料未必都在本地,所以計算任務可能存在少量的資料網路傳輸


Mapper
1,Map-reduce的思想就是“分而治之”
2,Mapper負責“分”,即把複雜的任務分解為若干個“簡單的任務”執行
3,“簡單的任務”有幾個含義:1 資料或計算規模相對於原任務要大大縮小;2 就近計算,即會被分配到存放了所需資料的節點進行計算;3 這些小任務可以平行計算,彼此間幾乎沒有依賴關係

Reducer
1,對map階段的結果進行彙總
2,Reducer的數目由mapred-site.xml配置檔案裡的專案mapred.reduce.tasks決定。預設值為1,使用者可以覆蓋之

效能調優
1,究竟需要多少個reducer?
2,輸入:大檔案優於小檔案
3,減少網路傳輸:壓縮map的輸出。(combiner)
4,最佳化每個節點能執行的任務數:mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum (預設值均為2)

Map-Reduce的工作機制


排程機制
預設為先入先出作業佇列排程
支援公平排程器
支援容量排程器

任務執行最佳化
1,推測式執行:即如果jobtracker發現有拖後腿的任務,會再啟動一個相同的備份任務,然後哪個先執行完就會kill去另外一個。因此在監控網頁上經常能看到正常執行完的作業有被kill掉的任務
2,推測式執行預設開啟,但如果是程式碼問題,並不能解決問題,而且會使叢集更慢,透過在mapred-site.xml配置檔案中設定mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution可為map任務或reduce任務開啟或關閉推測式執行
3,重用JVM,可以省去啟動新的JVM消耗的時間,在mapred-site.xml配置檔案中設定mapred.job.reuse.jvm.num.tasks設定單個JVM上執行的最大任務數(1,>1或-1表示沒有限制)
4,忽略模式,任務在讀取資料失敗2次後,會把資料位置告訴jobtracker,後者重新啟動該任務並且在遇到所記錄的壞資料時直接跳過(預設關閉,用SkipBadRecord方法開啟)

錯誤處理機制:硬體故障
1,硬體故障是指jobtracker故障或tasktracker故障
2,jobtracker是單點,若發生故障目前hadoop還無法處理,唯有選擇最牢靠的硬體作為jobtracker
3,Jobtracker透過心跳(週期1分鐘)訊號瞭解tasktracker是否發生故障或負載過於嚴重
4,Jobtracker將從任務節點列表中移除發生故障的tasktracker
5,如果故障節點在執行map任務並且尚未完成,jobtracker會要求其它節點重新執行此map任務
6,如果故障節點在執行reduce任務並且尚未完成,jobtracker會要求其它節點繼續執行尚未完成的reduce任務

錯誤處理機制:任務失敗
1,由於程式碼缺陷或程式崩潰引起任務失敗
2,Jvm自動退出,向tasktracker父程式傳送方錯誤資訊,錯誤資訊也會寫入到日誌
3,Tasktracker監聽程式會發現程式退出,或程式很久沒有更新資訊送回,將任務標記為失敗
4,標記失敗任務後,任務計數器減去1以便接受新任務,並透過心跳訊號告訴jobtracker任務失敗的資訊
5,Jobtrack獲悉任務失敗後,將把該任務重新放入排程佇列,重新分配出去再執行
6,如果一個任務失敗超過4次(可以設定),將不會再被執行,同時作業也宣佈失敗

一些技巧
1,選擇reducer的個數(權威指南中文版第二版第195頁)
預設為1,可以在程式碼中JobConf.setNumReducerTaks來設定reducer的個數。
reducer的最優個數與叢集中可用的reducer任務槽數相關,總槽數由叢集中節點數與每個節點的任務槽數相乘得到。
假如節點有8個處理器,計劃在每個處理器上跑2個程式,則可將mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum的值分別設定為7(考慮還有datanode和tasktracker這2個程式,這2項值不可以設定為8)

2,Hadoop流中的key, value和分隔符(權威指南中文版第二版第197頁)
3,控制分片的大小(權威指南中文版第二版第202頁)
4,避免切分(權威指南中文版第二版第205頁)
5,原始資料使用分隔符區分key-value時的輸入(權威指南中文版第二版第211頁)
KeyValueTextInputFormat,預設使用製表符來劃分key-value,可以使用job.set("key.value.separator.in.input.line",",")來改變key-value分隔符

6,XML檔案的輸入(權威指南中文版第二版第213頁) 
7, 二進位制資料輸入(權威指南中文版第二版第213頁)
8, Mapper輸出多種不同型別的value
9,統計作業執行資訊——計數器使用(權威指南中文版第二版第225頁)

Map-Reduce開發場景
1,資料去重(Hadoop實戰104頁)
利用系統自身的shuffle過程,自動對key合併,在reduce中只需把key提取出來即可。

2,排序(Hadoop實戰107頁
同上,key已經就是排過序的

3,單表關聯(自連線)(Hadoop實戰109頁
利用連線列作為key,實現連線列相等匹配的目的,每個Map產生2行輸出,這2行中有連線條件,用數字1標識左表,數字2標識右表,經過shuffle過程,key成為連線條件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1127423/,如需轉載,請註明出處,否則將追究法律責任。