Spark job中,一個stage什麼時候完成,取決於stage下最後一個task的完成時間。
task的完成時間也被很多因素影響,比如partition的分配,executor的資源使用情況,host的運行狀態,集羣網絡等等。很多情況下因爲運行環境導致的task跑的過慢,或者直接卡死,讓task可以重新跑起來是可以緩解這個問題的,也就是Spark中的推測執行機制(speculation)。
--conf spark.speculation=true
--conf spark.speculation.interval=100
--conf spark.speculation.quantile=0.9
--conf spark.speculation.multiplier=1.5
1. 當spark.speculation設置爲true時,就會對task開啓推測執行,也就是在一個stage下跑的慢的tasks有機會重新啓動;
2. spark.speculation.interval,100ms,Spark檢測tasks推測機制的間隔時間;
3. spark.speculation.quantile,0.9,當一個stage下多少百分比的tasks運行完畢後纔開啓推測執行機制,0.9即90%的任務都運行完畢後開啓推測執行;
4. spark.speculation.multiplier,1.5,一個task的運行時間是所有task的運行時間中位數的幾倍時,纔會被認爲該task需要重新啓動。
當啓動了推測執行後,spark會獲取先完成的task結果並且將task標記爲完成,所以也不會出現數據衝突和重複。