提高磚的火花排斥機製
Ed注:本文包含引用這個詞黑名單,一個術語,引發社會積極致力於消除火花。功能名稱將會改變在即將到來的火花3.1版更包容,我們期待這個新版本。
為什麼排斥?
任務調度的排斥機製被引入Apache火花2.2.0(如“黑名單”)。有排斥的動機是提高容錯的火花,特別是對以下問題的場景:
- 與數百或數千個節點集群中,有一個像樣的執行器故障的概率(如。I / O在糟糕的磁盤)的一個節點上發生火花運行期間應用程序,這可能會導致任務失敗。
- 當任務發生故障時,有一個高概率,調度程序將重新安排任務相同的地點相同節點和執行者因為考慮。現在,這項任務將會失敗。
- 失敗後
spark.task.maxFailures
多次在同一任務,激發工作將中止。
圖1所示。任務失敗多次在糟糕的節點
排除解決問題通過以下機製。當一個執行人/節點失敗任務指定的次數(由配置決定spark.blacklist.task.maxTaskAttemptsPerExecutor
和spark.blacklist.task.maxTaskAttemptsPerNode
),任務的執行者/節點將被阻塞,也不會再次接受相同的任務。我們也計算失敗的執行人/節點的數量在一個階段/應用程序級別,並阻止他們對整個舞台/應用程序數量超過閾值時(取決於配置spark.blacklist.application.maxFailedTasksPerExecutor
和spark.blacklist.application.maxFailedExecutorsPerNode
)。執行者和節點在一個應用程序級排斥將發布的排斥在超時時間(取決於spark.blacklist.timeout
)。
圖2。任務成功排除壞節點
排斥機製存在的缺陷
排斥機製中引入火花2.2.0具有以下缺點,禁止它被默認為用戶啟用。
- 排斥機製從未主動解除節點。排除節點就會閑置著,無需為任務完成。
- 當有瞬態和頻繁的任務失敗,許多節點將被添加到排除列表,因此一個集群迅速進入一個場景,沒有工人節點可以使用。
- 排斥機製不能啟用隻為shuffle-fetch失敗。
磚運行時的7.3中引入的新特性
在磚運行時的7.3中,我們改進了火花排斥機製通過實現以下功能。
啟用節點解除排斥
在一個場景,某些節點有永久失敗,所有的舊排斥機製所能做的就是把它們放在應用程序級別排除列表,帶他們出去吃另一個嚐試在超時時間,然後放到。節點將閑置,導致什麼,他們保持不好。
我們解決這個問題通過添加一個配置spark.databricks.blacklist.decommissionNode.enabled
。如果spark.databricks.blacklist.decommissionNode.enabled
被設置為true,當一個節點排除在應用程序級別,它將退役,而且會啟動一個新節點保持集群所需的大小。
圖3。解除壞節點,添加創建新的健康的節點
排除閾值
在磚運行時的7.3中,我們介紹了閾值的特征排斥機製。通過調優spark.blacklist.application.blacklistedNodeThreshold
INT_MAX(默認),用戶可以限製節點排除在外的最大數量為火花應用程序在同一時間。
圖4。解除壞節點,直到達到排除閾值
閾值非常有用當集群中的故障暫態和頻繁。在這種情況下,一個排斥機製沒有閾值是所有執行者和節點發送到應用程序的風險水平排斥、讓用戶沒有資源來使用,直到新的健康節點啟動。
如圖4所示,我們隻解除不良節點,直到達到排除閾值。集群與閾值正確配置,因此,不會進入情況,它隻能利用工作節點遠低於預期。同時,由於舊的壞節點替換為新的健康的節點,我們仍然可以逐漸代替壞習慣其餘節點集群中。
獨立使FetchFailed錯誤
FetchFailed錯誤發生當一個節點失敗時獲取一個洗牌塊從另一個節點。在這種情況下,有可能從該節點是擁有一個長久的失敗,和許多任務會受到影響,由於獲取失敗失敗。因此,我們看到FetchFailed排除錯誤的一個特例排斥機製由於其巨大的影響。
在火花2.2.0,排斥FetchFailed錯誤時隻能使用一般排除(如啟用。spark.blacklist.enabled
被設置為true)。在磚運行時的7.3中,我們實現了獨立FetchFailed錯誤。
現在,用戶可以設置spark.blacklist.application.fetchFailure.enabled
僅使排除FetchFailed錯誤。
結論
改進的排斥機製更好的集成與控製平麵,它逐步解除排除節點。因此,壞節點回收,取而代之的是新的健康的節點,因此減少了任務失敗造成的不良節點,也節省了成本花在糟糕的節點。今天開始,嚐試改進排斥機製磚7.3運行時。