Map-Reduce編程模型
環境:Hadoop1.2.1
Map-Reduce編程模型
沒有reduce的簡單編程模型
復雜的編程模型
Mapper
Map-reduce的思想就是“分而治之”
Mapper負責“分”,即把復雜的任務分解為若干個“簡單的任務”執行
“簡單的任務”有幾個含義:1 數據戒計算規模相對于原任務要大大縮小;2 就近計算,即會被分配到存放了所需數據的節點迚行計算;3 這些小任務可以幵行計算,彼此間幾乎沒有依賴關系
Reducer
對map階段的結果進行匯總
Reducer的數目由mapred-site.xml配置文件里的項目mapred.reduce.tasks決定。缺省值為1,用戶可以覆蓋之
Shuffle
目前對Shuffle理解不是很深,Shuffle應該是描述著數據從map task輸出到reduce task輸入的這段過程,主要就是對map task輸出的內容做Merge操作,然后輸送到reduce task
分片的問題
分片非常接近物理塊邊界
通常每個分片對應一個task
通過分片實現計算數據本地化
分片包含的數據未必都在本地
Combiner
工作于Map輸出端。簡化輸出,減少網絡數據傳送量。Combiner實際上就是在Map端先作一次Reducer,使用Combiner的前提是不能影響最終結果并能提高執行效率。
性能調優
究竟需要多少個reducer?
輸入:大文件優于小文件
減少網絡傳輸:壓縮map的輸出
優化每個節點能運行的任務數:mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum (缺省值均為2)
Map-Reduce工作機制剖析
1.運行Job
2.請求作業號
3.復制作業資源文件
4.提交作業
5.初始化,創建作業對象
6.獲得輸入劃分
7.保持心跳
8.獲得作業資源文件
9.登陸子JVM
10.啟動任務
MapReduce的執行流程簡單概括如下:
用戶作業執行JobClient.runJob(conf)代碼會在Hadoop集群上將其啟動。
啟動之后JobClient實例會向JobTracker獲取JobId,而且客戶端會將作業執行需要的作業資源復制到HDFS上,然后將作業提交給JobTracker。
JobTracker在本地初始化作業,再從HDFS作業資源中獲取作業輸入的分割信息,根據這些信息JobTracker將作業分割成多個任務,然后分配給在與JobTracker心跳通信中請求任務的TaskTracker。
TaskTracker接收到新的任務之后會首先從HDFS上獲取作業資源,包括作業配置信息和本作業分片的輸入,然后在本地啟動一個JVM并執行任務。
任務結束后將結果寫回HDFS。
調度機制
缺省為先入先出作業隊列調度
支持公平調度器
支持容量調度器
任務執行優化
推測式執行:即如果jobtracker發現有拖后腿的任務,會再啟動一個相同的備份任務,然后哪個先執行完就會kill去另外一個。因此在監控網頁上經常能看到正常執行完的作業有被kill掉的任務
推測式執行缺省打開,但如果是代碼問題,并不能解決問題,而且會使集群更慢,通過在mapred-site.xml配置文件中設置 mapred.map.tasks.speculative.execution和 mapred.reduce.tasks.speculative.execution可為map任務或reduce任務開啟或關閉推測式執行
重用JVM,可以省去啟動新的JVM消耗的時間,在mapred-site.xml配置文件中設置mapred.job.reuse.jvm.num.tasks設置單個JVM上運行的最大任務數(1,>1戒-1表示沒有限制)
忽略模式,任務在讀取數據失敗2次后,會把數據位置告訴jobtracker,后者重新啟動該任務并且在遇到所記錄的壞數據時直接跳過(缺省關閉,用SkipBadRecord方法打開)
錯誤處理機制:硬件故障
硬件故障是指jobtracker故障或tasktracker故障
jobtracker是單點,若發生敀障目前hadoop還無法處理,唯有選擇最牢靠的硬件作為jobtracker
Jobtracker通過心跳(周期1分鐘)信號了解tasktracker是否發生故障或負載過于嚴重
Jobtracker將從任務節點列表中移除發生故障的tasktracker
如果故障節點在執行map任務并且尚未完成,jobtracker 會要求其它節點重新執行此map任務
如果故障節點在執行reduce 任務并且尚未完成,jobtracker 會要求其它節點繼續執行尚未完成的reduce任務
錯誤處理機制:仸務失敗
由于代碼缺陷或進程崩潰引起任務失敗
Jvm自動退出,向tasktracker父進程發送錯誤信息,錯誤信息也會寫入到日志
Tasktracker監聽程序會發現進程退出或進程很久沒有更新信息送回,將任務標記為失敗
標記失敗任務后,任務計數器減去1以便接受新任務,并通過心跳信號告訴jobtracker任務失敗的信息
Jobtrack獲悉任務失敗后,將把該任務重新放入調度隊列,重新分配出去再執行
如果一個任務失敗超過4次(可以設置),將不會再被執行,同時作業也宣布失敗