1. 程式人生 > >PAI FrameworkLauncher(4) -- retry policy 了解一下

PAI FrameworkLauncher(4) -- retry policy 了解一下

拋出異常 max 接下來 異常處理 erro ros complete nco hub

retry policy 作用是規定當任務失敗的時候要不要重試。適用於framework 和 task兩類任務。

1、兩種retry policy:FancyRetry Policy + NormalRetry Policy

結合退出原因分類處理: FancyRetry: 暫時失敗(transient failure)-- retry 非暫時失敗(non - transient failure)-- not retry 成功/ 未知失敗(unknow failure)-- 交由NormalRetry Policy判斷 NormalRetry Policy: 滿足下面三個條件之一時retry且retry count++: 1)maxRetryCount 設置值為 -2;意味著在這個設置下,就算是成功退出也會繼續retry。 2)maxRetryCount 設置值為 -1 且 狀態為failure;意味著在這個設置下,如果失敗退出則會無限制次數地retry直至成功。 3)retry count < max retry count 且狀態為failure;意味著在這個設置下,失敗退出時會retry有限次。 下面鏈接給出了不同的framework中設置值,以及他們對應的retry策略。 https://github.com/Microsoft/pai/blob/master/frameworklauncher/doc/USERMANUAL.md#RetryPolicy

2、ApplicationCompletionPolicy

決定一個任務(taskRole)retry的參數:minFailedTaskCount + minSuccessTaskCount, 具體分為以下幾種情況: 1、如果minFailedTask != null,且實際失敗task數量 > minFailedTask設置值,結束AM,標記為失敗。ExitStatus為failed,由最後一個失敗的task決定。 2、如果minSuccessTask != null,且實際成功數量 >= minSuccessTask設置值,結束AM,標記為成功。ExitStatus為succeed,由最後一個成功的task決定。 3、如果滿足1、2中任一種情況,那麽根據實際情況決定,可能會是其中的任意一種。 4、如果1、2兩種情況都需要在所有taskRole的task都完成時才能滿足,結束AM,標記為成功。ExitStatus為succeed,不由任何一個task生成。 一些具體的例子: https://github.com/Microsoft/pai/blob/master/frameworklauncher/doc/USERMANUAL.md#ApplicationCompletionPolicy

3、framework的retry

launchApplication() 提交了AM之後,在異常處理部分調用了retrieveApplicationExitDiagnostics()。 YarnException --> non-transient error IOException --> transient error 其他Exception --> unknown error 處理異常的步驟如下: 1、調用killApplication(),結束掉這個AM。 2、由statusManager將這個AM負責的Framework狀態改為APPLICATION_RETRIEVING_DIAGNOSTICS, 3、交由diagnosticsRetrieveHandler另起一個線程處理。 4、上面的線程把retrieveApplicationExitCode(applicationId, finalDiagnostics)這個任務扔進線程池中。這個任務一是獲取AM中對應的ApplicationId,二是調用completeApplication()嘗試結束framework。 5、completeApplication()中將framework的狀態標記為APPLICATION_COMPLETED,然後調用attemptToRetry()。 6、attemptToRetry()中,根據不同的狀態framework有兩種結局: 1)completeFramework --> 將framework的狀態標記為FRAMEWORK_COMPLETED 2)retryFramework --> 將framework的狀態標記為FRAMEWORK_WAITING,然後調用createApplication()重新啟動一個AM。 從這個過程可以看到,framework的retry的情況只發生在yarn給framework拋出異常的時候。

4、task/taskRole的retry

有兩種情況: 一個container運行結束的時候,對它進行“屍檢”時是調用attemptToRetry()進行的。與framework類似,一個task會有兩種結局: 1)completeTask --> 將task的狀態標記為TASK_COMPLETED,attemptToStop()嘗試結束整個framework。 2)retryTask --> 將task的狀態標記為TASK_WAITING,addContainerRequest()繼續請求container。 二個是在recover()中,會調用attemptToRetry()來幫助恢復transitionTaskStateQueue,裏面對所有狀態是CONTAINER_COMPLETED的task進行了檢查。 不過目前這個recover()也只在AM初次啟動的時候才會調用到。 接下來需要了解一般的任務retry policy是怎麽設置的?

PAI FrameworkLauncher(4) -- retry policy 了解一下