1. 程式人生 > >hadoop之failed task和killed task

hadoop之failed task和killed task

failed task可理解為自殺,也就是task本身出了問題而自殺;killed task可理解為是他殺,也就是jobtracker認為這個任務的執行是多餘的,所以把任務直接殺掉。起初用hadoop的時候經常在一個complete的job中看到幾個failed 或者是 killed task,還經常好奇為什麼有的時候task的失敗不會影響到整個job的失敗,而有的時候就會使整個job的失敗,到底failed和killed task對整個job的影響是什麼?

failed task

failed task出現的原因可分為以下幾種情況:
1 child task失敗,比如map/reduce任務中丟擲了異常,child JVM會將這個error彙報給tasktracker,tasktracker再回將這個error彙報給jobtracker
2 child JVM失敗,比如啟動child task的JVM本身出現了bug,導致程序直接死掉,此時tasktracker會知道child JVM已經退出,並彙報給jobtracker此次task attempt失敗
3 任務超時,如果某個任務很長時間都沒有更新狀態,則認為任務超時。有的任務雖然執行時間非常長,但它不停的在更新自己的狀態,所以系統也不會認為這是個超時任務
4 tasktracker由於軟體或硬體的原因直接掛掉了。對於這種情況,tasktracker會停止向jobtracker傳送心跳,jobtracker會認為這是個dead node並把該節點加入黑名單,從此不再給這個節點分配任務,直到問題被修復後tasktracker重新彙報心跳。我遇到最囧的情況就是當各節點hosts不一致的時候,會出現tasktracker向jobtasker傳送心跳,但jobtracker不能正確向tasktracker,形成了半死不活的節點~。
hadoop本身的一個設計理念就是在普通的pc硬體上構建高可靠性的系統,任何failed task都不會引起整個job的失敗,因為所有失敗的任務都會被重新執行(reschedule execution),只有當重新執行的次數超過4次,才會把這任務標記為失敗,導致整個job的失敗。

killed task

在介紹killed task之前,先介紹一下speculative execution。舉個簡單的例子,如果某個job有2000個map task,已經完成了1999個,只剩下一個task由於硬體比較慢而成為拖尾任務,為了減少拖尾任務對整個job執行時間的影響,jobtracker會重新啟動一個一模一樣的duplicate task和原有的task並行的執行,這樣有一個task執行成功,整個map過程就會結束。speculative execution只有個處理拖尾任務的優化策略,並不能提高系統的可靠性。
介紹完speculative execution後我們來看看killed task的情況。killed task可能在兩種情況下發生,一個是speculative execution中兩個並行duplicate task中如果有一個執行成功,另一個將被kill掉;第二種情況是如果某個tasktracker掛了,那麼正在該節點上面跑的任務都將被標記為killed。

===================================================================================================================================

首先說說Task容錯機制
Task的執行情況由對應的一個TaskInProgress物件來跟蹤,它允許一個Task嘗試執行多次,每次成為一個Task Attempt
Hadoop提供了兩個可配置的引數:
     mapred.map.max.attempts 
     mapred.reduce.max.attempts
hadoop提交作業時可通過設定這兩個引數來設定Map Task和Reduce Task嘗試執行最大次數。


預設情況下,這兩個值均為4。
如果嘗試4次之後仍舊為執行成功,則TaskInProgress物件將該任務執行狀態標註成FAILED。
未成功執行的Task Attempt分為兩種,killed task 和failed task,他們分別對應的狀態為KILLED,FAILED其中killed task 是MapReduce框架主動殺死的Task Attempt,一般產生於一下3中場景。

1.認為殺死Task Attempt:使用者使用命令bin/hadoop job -kill-task task_id將一個Task Attempt殺死
2.磁碟空間或者記憶體不夠:任務執行過程中,出現磁碟或者記憶體磁碟不足的情況,MapReduce框架需要採用一定策略殺次若干個Task已釋放資源,其選擇殺死Task的策略是優先選擇Reduce Task,其實是進度最慢的Map Task。
3.TaskTracker丟失:如果TaskTracker在一定時間內未想JobTracker回報心跳,則JobTracker認為該TaskTracker已經死掉,它上面的任務將被殺掉。

Failed Task是自身執行失敗的Task Attempt,通常產生一下幾種場景:
1.人為使Task Attempt失敗:使用者使用命令bin/hadoop job -fail-task task_id 是一個Task Attempt殺死。
2.本地檔案讀寫錯誤:Task 執行過程中,由於磁碟壞道等原因,導致檔案讀寫錯誤。
3.Shuffle階段錯誤:Reduce Task從Map Task端遠端讀取資料過程中出錯。
4.Counter數目過多:使用者自定義的Counter或者Counter Group資料木超過系統要求的上線。
5.一定時間內未彙報進度:由於程式Bug或者資料格式問題,任務在一定時間間隔內未彙報進度。
6.使用記憶體量超過期望值:使用者提交作業時可指定每個Task預期使用的記憶體量,如果在執行過程中超過該值,則會執行失敗。
7.任務執行過程中的其他錯誤:如初始化錯誤,其他可能的致命錯誤。

Failed Task 和killed Task除了產生場景不同以外,還有以下兩個重要區別:
排程策略:一個Task Attempt在某個節點執行失敗之後,排程器變不會將同一個Task的Task Attempt分配給該節點。而Task Attempt 被殺死後,仍可能被排程到同一個節點上執行。
嘗試次數:Task容錯機制是針對faile task的。也就是說,任何一個Task允許的失敗次數是有限的。而對於killed task,由於他們是被框架主動殺死的,他們自身並不存在問題,因此會不斷嘗試執行,直到執行成功。

相關推薦

hadoopfailed taskkilled task

failed task可理解為自殺,也就是task本身出了問題而自殺;killed task可理解為是他殺,也就是jobtracker認為這個任務的執行是多餘的,所以把任務直接殺掉。起初用hadoop的時候經常在一個complete的job中看到幾個failed 或者是

hadoop 分片與分塊,map taskreduce task的理解

 分塊:Block   HDFS儲存系統中,引入了檔案系統的分塊概念(block),塊是儲存的最小單位,HDFS定義其大小為64MB。與單磁碟檔案系統相似,儲存在 HDFS上的檔案均儲存為多個塊,不同的是,如果某檔案大小沒有到達64MB,該檔案也不會佔據整個塊空間。在分

Android關於Task的一些實踐SingleTask, SingleInstanceTaskAffinity

conda tag 我們 創建 真理 enter 設置 com lms 上一篇文章粗略地介紹了一下關於Android中Task的基本知識。只是實踐才是檢驗真理的唯一標準,所以。今天就來試驗一下Task中的launchMode是否真的實現了文檔所說的那樣。 首先。定義三個

認識TaskTask的基本使用(轉)

title src demo 手動 點擊 strong esp started mage 對於多線程,我們經常使用的是Thread。在我們了解Task之前,如果我們要使用多核的功能可能就會自己來開線程,然而這種線程模型在.net 4.0之後被一種稱為基於“任務的編程模型”所

Hadoop學習路(四)Hadoop集群搭建簡單應用

get allocated reduce plugins caching handle ces -h per 概念了解 主從結構:在一個集群中,會有部分節點充當主服務器的角色,其他服務器都是從服務器的角色,當前這種架構模式叫做主從結構。 主從結構分類: 1、一主多從

Taskcontinuewith的返回值問題

單元 很多 edt lang been 參數 TP AR pan 最近研究多線程,感覺Task的返回值很要,特別是ContinueWith或者是使用task.WhenAll或者task.WhenAny的時候,需要確定到底會出現什麽樣的結果。在網上看了很多人寫的文章,感覺參雜

RTL基本知識:taskfunction

設計 全局變量 bubuko .com gin 變量 輸入 更多 center 在使用Verilog進行設計的過程中,使用task和function在同一個module中多次調用,充分提高了代碼的復用性,有效增強設計的可維護性和復用性,可以避免不同模塊間代碼復制導致的不必要

vivado對taskfunction的可綜合支持

esc 語法 ica NPU exce value alt mes efault 手冊UG901,對vivado可綜合的語句支持進行了描述,HDL包括:verilog-2001,system-verilog,VHDL; verilog-2001擴展了對task和fun

Java中的TimerTimer Task詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring:任務排程task:scheduler與task:executor配置的詳解

其實就是Spring定時器中配置檔案中一些配置資訊,由於筆者自己是頭一次使用,有些配置詳細不太明白,隨即研究了一番,於是想記錄一下,有需要的小夥伴可以參考,也方便日後自己查閱。 首先,建立一個僅僅包含定時器配置的Spring配置檔案:spring-timer.xml。以下均為配置資訊:1、在配置檔案

自定義 gradle plugin,教你如何 hook 系統 task 位元組碼

一、開源背景 大家在自己寫 library 的時候估計也遇到過這種困惑:一個 library 中的某個類中有些方法或類只想給該 library 中的類使用,並不想暴露出去,但是由於專案的包的層級關係,不得不把方法寫為 public ,導致暴露給了外界!!! 當時這個問題確實困惑了我一段時間,總不

大資料開發Hadoop篇----配置yarnmapreduce

上一篇部落格中我們已經完成了hdfs的部署,現在我們開始部署yarn了。 我們先使用jps命令來檢視下現在與java相關的程序: 這裡NameNode以後簡稱為NN,DataNode簡稱為DN,而SecondaryNameNodel簡稱為SNN。 我們先切換到had

asyncawait、Task執行緒池執行緒的關係

計算機進入多核時代,開發人員想要充分利用計算機核心,需要編寫多執行緒程式。執行緒屬於程序,理想狀態下,在4核的計算機上最好有4個執行緒。 早期的執行緒建立是利用 Thread類,執行緒的建立需要花費很多時間,基於此,微軟公司為開發人員建立了執行緒池,執行緒池具有智慧爬山演算法,可以 根據執行

Spring Quartz Spring Task使用比較

Spring Quartz 和 Spring Task執行時間對比: 1. Quartz設定同步模式時:一個任務的兩次執行的時間間隔是:“執行時間”和“trigger的設定間隔”的最大值 2. Task默認同步模式:一個任務的兩次執行的時間間隔是:“

hadoop傳統的行儲存(HBase)列儲存的區別

轉自:https://blog.csdn.net/youzhouliu/article/details/676328821 為什麼要按列儲存列式儲存(Columnar or column-based)是相對於傳統關係型資料庫的行式儲存(Row-basedstorage)來說的。簡單來說兩者的區別就是如何組織表

hadoopeditlogsfsimage

一、概述 hadoop的namenode和secondarynamenode:    1.   namenode負責         負責客戶端請求的響應   &

Yarn原始碼分析MapReduce作業中任務Task排程整體流程(一)

        v2版本的MapReduce作業中,作業JOB_SETUP_COMPLETED事件的發生,即作業SETUP階段完成事件,會觸發作業由SETUP狀態轉換到RUNNING狀態,而作業狀態轉換中涉及作業資訊的處理,是由SetupCompletedTransition

Gradle for Android-建立taskplugin

迄今為止,我們已經為gradle build手動編輯了屬性和學習瞭如何執行task。本章節中,我們將會對這些屬性進行深度理解,並開始建立我們自己的task。一旦我們知道如何書寫自己的task,便可更進一步,瞭解如何製作我們自己的可以在幾個專案中重用的plugin

hadoop安裝步驟:windowslinux下的hosts檔案的使用

1,linux下hosts檔案在:/etc/hosts,切換到root使用者下新增節點。 如配置hadoop叢集時,將主機ip和主機名的對應關係寫到hosts檔案末尾後,就可以在配置檔案中方便的用主機名來代替繁瑣的ip地址了。 內容形式如下: 192.168.188.16

關於Spring 任務排程task:scheduler與task:executor配置的詳解

其實就是Spring定時器中配置檔案中一些配置資訊,由於筆者自己是頭一次使用,有些配置詳細不太明白,隨即研究了一番,於是想記錄一下,有需要的小夥伴可以參考,也方便日後自己查閱。首先,建立一個僅僅包含定時器配置的Spring配置檔案:spring-timer.xml。以下均為配