問題
有一個Apache Spark作業被正確觸發,但在啟動之前長時間處於空閑狀態。
您有一個Spark作業,它運行了一段時間,但在恢複之前很長一段時間都處於閑置狀態。
症狀包括:
- 集群在空閑時間將縮減到工作節點的最小數量。
- 驅動日誌沒有顯示任何Spark作業在空閑時間,但有重複的元數據信息。
- Ganglia隻在驅動程序節點上顯示活動。
- 執行器日誌顯示沒有活動。
- 一段時間後,集群擴展,Spark作業開始或恢複。
導致
這些症狀表明在作業期間發生了許多文件掃描操作。在下遊操作中讀取和使用表。
查看Spark UI中的SQL選項卡時,可以看到文件掃描操作的詳細信息。查詢似乎已完成,這使得在此空閑時間內似乎沒有執行任何工作。
驅動程序節點很忙,因為它正在執行文件列表和處理數據(包含模式和其他信息的元數據)。這項工作隻發生在驅動節點上,這就是為什麼在此期間您隻能在Ganglia度量中看到驅動節點的活動。
如果您有大量的小文件,這個問題會更加明顯。
解決方案
您應該通過實現預處理步驟來控製文件大小和源位置攝取的文件數量。您還可以將輸入分解為一些更小的步驟,這樣一次必須掃描更少的文件。
另一種選擇是將數據存儲遷移到Delta Lake,它使用事務日誌作為所有底層文件的索引。