Hadoop map-reduce的 speculative execution(推測執行)
由於一些原因,比如硬體老化,軟體層面的不恰當配置等。某些機器上的任務實例 執行很慢,拖累了整個作業(job)的進度;hadoop不會嘗試去診斷或者修復這些慢任務,相反,它會在集群的其他節點上去啟動這些慢任務的多個實例作為備份,這就是hadoop的推測執行(speculative execution)。
比如,hadoop集群中的有一台機器M,有一塊很慢的磁碟。當一個作業(job)分配在其他機器上的任務都已完成,機器M上的任務進度還不到20%,這樣會明顯拖累整個job的執行時間。
因此在hadoop集群剛建立不久,每台機器的性能差異不太確定;或者hadoop集群中的機器硬體配置差異較大的情況下,開啟speculative execution 是很有必要的。
若要開啟hadoop的 speculative execution,需在mapred-site.xml配置設置以下兩個配置項:
hadoop1.x
- mapred.map.tasks.speculative.execution=true
- mapred.reduce.tasks.speculative.execution=true
hadoop2.x
- mapreduce.map.speculative=true
- mapreduce.reduce.speculative=true
另外,具體任務實例滿足什麼條件,JobTracker會分配該任務的其他實例在其他節點上運行?
查看代碼如下:
我們得知,當一個任務正在運行的實例個數小於或等於MAX_TASK_EXECS(1) ,且其進度與所有任務實例的平均進度之差大於SPECULATIVE_GAP(20%)和其開始時間與當前JobTracker的時間之差大於1分鐘(60 * 1000ms)時,就會有該任務的其他實例在集群內的其他節點上執行。
boolean hasSpeculativeTask(long currentTime, double averageProgress) {n //n // REMIND - mjc - these constants should be examinedn // in more depth eventually...n //n n if (!skipping && activeTasks.size() <= MAX_TASK_EXECS &&n (averageProgress - progress >= SPECULATIVE_GAP) &&n (currentTime - startTime >= SPECULATIVE_LAG) n && completes == 0 && !isOnlyCommitPending()) {n return true;n }n return false;n }n
參考文檔:
[1].https://www.quora.com/What-is-the-speculative-execution-in-hadoop
推薦閱讀:
※怎麼看hadoop Summit 2015 and Spark summit 2015?
※大數據那些事(28):卡夫卡們的故事
※Spark編程有哪些有用技巧?
※做好機器學習,數學要學到什麼程度?
※未來想成為一名大數據架構師,可是不知如何在hadoop spark Storm中糾結?
TAG:Hadoop |