hadoop設計的初衷就是容錯計算任務(MapReduce task)能夠在節點宕機或其它隨機錯誤下自行恢復
但是hadoop並不完美在實際運營中我發現MapReduce Job仍然經常會因為一些偶發性錯誤而
運行失敗所以我決定深入探究一下各種不同因素是如何導致job失敗的
如果一個hadoop job的某個給定task在失敗預定次(默認是)後整個job就會失敗
這可以通過mapredmapmaxattempts和mapredreducemaxattempts屬性來設置
一個task可能由於各種偶發原因而失敗 比如我發現的情況就有磁盤滿hadoop本身的bug或者硬件失效(eg: 磁盤只讀)
下面是針對job失敗的概率總結的一個大致公式:
P[個別task失敗的最大次數] = P[task失敗] ^ (task總失敗次數)
P[task成功] = P[個別task失敗的最大次數]
P[job成功] = P[task成功] ^ (task數量)
P[job失敗] = P[job成功]
P[job失敗] = ( P[task失敗] ^ (task總失敗次數) ) ^ (task數量)
task失敗的最大次數通過mapredmaxmaxtrackerfailures設置(默認為)
我們來分析一個負載為個map task的job:
task數量 最大失敗數 P[task失敗] P[job失敗]
如果task失敗概率低於%的話job失敗概率幾乎可以不計 重點就是保證集群穩定保持較小失敗概率
我們同樣可以看到mapredmaxtrackerfailures參數的重要性 如果其取值小於時job失敗的概率明顯上升就算task失敗概率降低到%
相較mapper而言 reducer運行的時間更長這意味著其更容易遭受意外事故也就是說我們可以肯定reducer的失敗概率比mapper要大很多但是從另一方面來說通常reducer task的數量要小於mapper數量這個又作了一定補償
下面我們來看看一組基於reducer的失效概率分析:
task數量 最大失敗數 P[task失敗] P[job失敗]
從上述數據中可以發現 只有當reducer失敗的概率超過%時才會導致一定的job失敗幾率(同樣可發現 task最大失敗數低於時job失敗率顯著上升)
壞節點(有故障的機器節點)
在整個失效模型中還有一個很重要的因子需要考慮那就是失效節點通常若出現整個節點失效那麼在此節點上運行的所有task都會失敗失效原因可能是因為磁盤損壞(通常的症狀是出現 磁盤只讀 或 盤符丟失 ) 磁盤寫滿等一旦出現壞節點你會發現在此節點被列入黑名單之前(被job列入黑名單的節點不會被job再次分配其任務)會有一大堆 map/reduce task失敗為了簡化我們的分析我假設給定壞節點會導致固定數量的task失敗另外我假設給定task只會在給定壞節點上中招一次 因為節點會在不久後被列入黑名單我們用btasks來標記在壞節點上失敗過的task 其它task標記為ntasksbtask會在壞節點上遭受一次失敗 所以後續如果job再出現最大task失敗數 次失敗task就會導致job失敗在我們的集群中我曾發現一個壞節點引發個task失敗 那麼我就以此為據 給出reduce階段失效概率的公式:
btasks數量 = 壞節點數量 *
P[所有btask都成功] = ( P[task失敗概率] ^ (最大task失敗數 )) ^ (btasks數量)
P[所有ntask都成功] = ( P[task失敗] ^ (最大task失敗數)) ^ (task數量 btask數量)
P[job成功] = P[所有btask成功] * P[所有ntask成功]
P[job成功] = (P[task失敗]^(最大task失敗數 ))^(btask數量) * (P[task失敗]^(最大task失敗數))^(最大task數 btask數)
P[job失敗] = P[job成功]
因為mapper數量通常較多所以少數壞節點對於以上公式計算的結果並沒有太大的出入但對reducer而言其數量較少所以以上公式計算出
的結果就有比較明顯的變化:
task數量 最大失敗數 P[task失敗] 壞節點數量 P[job失敗]
值得慶幸的是結果並沒有發生戲劇性的變化 在個壞節點的情況下只導致失敗率提高到了排除壞節點條件下的~倍
最後的結論就是 hadoop在task失效概率保持較低的情況下容錯性還是很好的基於前面的一些數據分析我們發現最大task失敗數 最好設置為 當task失敗率達到%時你需要開始考慮集群的穩定性了當然你可以通過增大最大task失敗數來提高穩定性但是如果有太多task失敗 那麼job執行的性能也會降低所以再強調一次 重點還是 保持集群穩定
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25960.html