在大規模數據處理中,這個錯誤比較常見。壹般發生在有大量shuffle操作的時候,task不斷的failed,然後又重執行,壹直循環下去,直到application失敗。
SparkSQL shuffle報錯樣例
RDD shuffle報錯樣例
shuffle 分為 shuffle write 和 shuffle read 兩部分:
解決辦法主要從 shuffle的數據量 和 處理shuffle數據的分區數 兩個角度入手。
通過 spark.sql.shuffle.partitions 控制分區數,默認為200,根據shuffle的量以及計算的復雜度提高這個值。
通過 spark.default.parallelism 控制 shuffle read 與 reduce 處理的分區數,默認為運行任務的core的總數(mesos細粒度模式為8個,local模式為本地的core總數),官方建議設置成運行任務的core的2-3倍。
通過 spark.executor.memory 適當提高executor的內存
通過 spark.executor.cores 增加每個executor的cpu,這樣不會減少task並行度