本節書摘來異步社群《hadoop mapreduce性能優化》一書中的第1章,第1.3節,作者: 【法】khaled tannir 譯者: 範歡動 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
hadoop mapreduce性能優化
經過一個或者多個步驟,mapreduce程式設計模型可以用來處理許多大規模資料問題,還可以更高效地實作mapreduce程式設計模型來支援使用大量機器處理大量資料的問題。在大資料的背景下,可以處理的資料規模可以大到無法在單機存儲。
在典型的hadoop mapreduce架構下,資料拆分為資料塊并分發到叢集内的多個節點上。mapreduce架構通過把計算邏輯轉移到資料所在的機器,而不是把資料轉移到其能夠得以處理的機器上,進而充分利用資料的本地性優勢。mapreduce應用的大多數輸入資料塊存放在本地節點,因而能夠迅速加載,而且可以并行讀取在多個節點上的多個資料塊。是以,mapreduce能夠達到很高的綜合i/o帶寬和資料處理速率。
要啟動一項mapreduce作業,hadoop會建立一個mapreduce應用的執行個體并把作業送出給jobtracker。然後,作業被拆分為map任務(也叫作mapper)和reduce任務(也叫作reducer)。
hadoop啟動mapreduce作業時,輸入資料集拆分為大小相等的資料塊,并采用心跳協定(heartbeat protocol)配置設定任務。每個資料塊被排程到一個tasktracker節點上并由一個map任務處理。
每項任務都在一個工作節點的可用插槽上執行,每個節點會配置固定數量的map插槽和固定數量的reduce插槽。如果所有可用插槽都被占用,挂起的任務就需要等待一些插槽被釋放。
tasktracker周期性地向jobtracker發送其狀态。當tasktracker節點空閑時,jobtracker節點會給它配置設定新任務。jobtracker節點在散發資料塊時會考慮資料本地性,總是試圖把本地資料塊配置設定給tasktracker節點。如果嘗試失敗,jobtracker節點會配置設定一個本地機架或者随機資料塊給tasktracker節點。
當所有的map函數都執行結束時,運作時系統會将中間鍵值對分組,并發起一組reduce任務來生成最終結果。接下來執行過程從shuffle階段轉向reduce階段。在這個最終的reduce階段,reduce函數被調用來進行中間資料并寫最終輸出。
使用者經常使用不同的術語來表述hadoop的map和reduce任務、子任務、階段、子階段。map任務包含了兩個子任務(map和merge),而reduce任務僅包含一個任務。然而,shuffle和sort首先發生,并由系統完成。每個子任務又拆分為多個子階段,如read-map、spill、merge、copy-map和reduce-write。