標籤:

Hadoop map-reduce的 speculative execution(推測執行)

作業(job)提交時,會被map-reduce 框架的JobTracker 拆成一系列的map任務、reduce任務在整個hadoop 集群的機器上執行。

由於一些原因,比如硬體老化,軟體層面的不恰當配置等。某些機器上的任務實例 執行很慢,拖累了整個作業(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會分配該任務的其他實例在其他節點上運行?

查看代碼如下:

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

我們得知,當一個任務正在運行的實例個數小於或等於MAX_TASK_EXECS(1) ,且其進度與所有任務實例的平均進度之差大於SPECULATIVE_GAP(20%)和其開始時間與當前JobTracker的時間之差大於1分鐘(60 * 1000ms)時,就會有該任務的其他實例在集群內的其他節點上執行。

參考文檔:

[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 |