Map-Reduce編程模型

jopen 9年前發布 | 40K 次閱讀 Map-Reduce

環境:Hadoop1.2.1

Map-Reduce編程模型
Map-Reduce編程模型

沒有reduce的簡單編程模型
Map-Reduce編程模型

復雜的編程模型
Map-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
    通過分片實現計算數據本地化
    分片包含的數據未必都在本地
Map-Reduce編程模型

Combiner
    工作于Map輸出端。簡化輸出,減少網絡數據傳送量。Combiner實際上就是在Map端先作一次Reducer,使用Combiner的前提是不能影響最終結果并能提高執行效率。

性能調優
    究竟需要多少個reducer?
    輸入:大文件優于小文件
    減少網絡傳輸:壓縮map的輸出
    優化每個節點能運行的任務數:mapred.tasktracker.map.tasks.maximum 和 mapred.tasktracker.reduce.tasks.maximum (缺省值均為2)

Map-Reduce工作機制剖析
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次(可以設置),將不會再被執行,同時作業也宣布失敗

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!