根據網上相關帖子以及檢視部分源**,把作業提交流程畫了個流程圖,並對某些步驟做詳細說明,現整理如下:
詳細說明:
一 關於分片
1).分片的原則是:盡量保證乙個片的資料不要跨資料節點,因此,最佳實踐為片的大小與資料塊的大小一致,這也是預設的策略
2).分片演算法由
fileinput
介面定義,所有輸入格式指定類都必須實現此介面;分片的資訊寫入檔案
job.split中,此檔案的內容格式如下:
split檔案頭,split檔案版本號,split的個數
//以下是每個分片的資訊
split型別名(預設filesplit),split的大小,split的內容(對於filesplit,寫入檔名,此split 在檔案中的起始位置),split的location資訊(即在那些datanode上)
二.
作業初始化
作業的初始化,主要工作就是初始化任務;
map任務:1)
通過jobclient的readsplitfile()獲取分片資訊
2)初始化佇列***eagertaskinitializationlistener把作業(jobinprogress)加入初始化佇列
public void jobadded(jobinprogress job) }3)
根據分片的數目建立同樣多的
map任務管理物件taskinprogress
4)根據分片資料所在的資料節點位置,繫結任務,即把任務分配給資料所在的節點。但是,只是乙個關係對映,並沒有真正的傳輸任務
5)第四步中的這種對映關係儲存在名叫nonrunningmapcache的
map結構中,
map的定義為
:map>
6.當某個節點有空閒的任務槽的時候,會通過心跳向
jobtracker
要任務,此時就可以根據自己的節點位置從nonrunningmapcache中獲取任務
reduce
任務:其它跟
map相似,只有一下幾點不一樣
1)reduce
任務數由jobconf配置指定,通過方法setnumreducetasks(
int num
)指定2)reduce
也有乙個快取集合儲存
reduce
任務管理物件,但是它並不需要對節點進行分配,因為
reduce
任務的輸入是
map的輸出,會有多個節點輸出,所以不用刻意
補充說明:當作業準備好後,接下來就是作業的分配,作業的分配本質是作業任務的分配,其次,任務分配的過程是針對整個集群中處於執行狀態的所有作業的分配,根據當前tasktracker節點在機架組織結構中的位置從近到遠獲取任務;
作業分配步驟:
1.tasktracker
通過心跳向jobtracker獲取任務
2.jobtracker
檢查上乙個心跳響應是否完成
3.檢查要啟動的任務數是否超出心跳節點還剩餘的任務槽,超出則不分配
4.檢查即將啟動的任務數和已經啟動的任務數是否超過集群總的負載能力,如果超出則不分配,不超出則往下執行
5.獲取任務時,是從當前集群中所有正在執行的作業的所有任務中挑選乙個適合自己的任務
6.如果當前節點或者當前節點所在的機架上有任務,則獲取乙個
7.如果當前節點或者當前節點所在的機架上沒有可獲取的任務,則從其它機架上獲取任務
hadoop map reduce 階段筆記
shuffle and sort mr 框架保證 每個 reducer 的輸入都是按照 key 鍵排過序的。shuffle 將map輸出結果送到reducer和排序的功能。1 map 每個map task將結果輸出到環形記憶體緩衝區,當到達一定閾值,則啟動乙個後台程序將快取中的資料 1 按照 red...
Hadoop MapReduce 效能優化
我們時常談論說到mapreduce時,我們都會說它是離線計算框架,磁碟io開銷大,job執行比較慢等等。這一篇部落格,南國系統回顧下mr程式執行慢的原因,以及如何優化mr程式。我們都知道mapreduce是離線計算框架,不同於spark記憶體計算框架模型。乙個標準的mr程式由map方法和reduce...
九 hadoop mapreduce分割槽
一 什麼時候分割槽?1 分割槽的實現 通過繼承partitioner類,實現getpartition方法。public int getpartition key key,value value,int reducetasknumber map結束後得到的每個key value都呼叫該方法,並把key...