將 HDInsight 中的 Apache Spark 應用程式最佳化
本文提供將 Azure HDInsight 上的 Apache Spark 應用程式最佳化的策略概觀。
概觀
您可能會面臨下列常見案例
- 相同的 Spark 作業速度比以前在相同 HDInsight 叢集中的速度慢
- SPARK 作業在 HDInsight 叢集中的速度比內部部署或其他協力廠商服務提供者慢
- Spark 作業在一個 HDI 叢集中的速度比在另一個 HDI 叢集中的速度慢
Apache Spark 作業的效能取決於多個因素。 這些效能因素包括:
- 資料如何儲存
- 如何設定叢集
- 處理資料時所使用的作業。
- 狀況不良的 yarn 服務
- 記憶體限制,因為執行程式大小不正確和 OutOfMemoryError
- 工作太多工或太少
- 資料扭曲導致一些繁重的工作或緩慢的工作
- 錯誤節點的工作速度較慢
步驟 1:檢查您的 yarn 服務是否狀況良好
- 移至 Ambari UI:
- 檢查 ResourceManager 或 NodeManager 警示
- 檢查 YARN > 摘要中的 ResourceManager 和 NodeManager 狀態:所有 NodeManager 都應該處於 [已啟動],而且只有 Active ResourceManager 應該處於 [已啟動]
檢查 Yarn UI 是否可透過
https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster
存取檢查 ResourceManager 登入
/var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log
中是否有任何例外狀況或錯誤
如需詳細資訊,請參閱 Yarn 常見問題
步驟 2:比較新的應用程式資源與 yarn 可用的資源
移至Ambari UI > YARN > 摘要,檢查 ServiceMetrics 中的叢集記憶體
檢查 yarn 佇列計量的詳細資料:
- 移至 Yarn UI,透過
https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster/scheduler
檢查 Yarn 排程器計量 - 或者,您可以透過 Yarn Rest API 檢查 yarn 排程器計量。 例如:
curl -u "xxxx" -sS -G "https://YOURCLUSTERNAME.azurehdinsight.net/ws/v1/cluster/scheduler"
。 針對 ESP,您應該使用網域管理員使用者。
- 計算新應用程式的總資源
- 所有執行程式資源:
spark.executor.instances * (spark.executor.memory + spark.yarn.executor.memoryOverhead) and spark.executor.instances * spark.executor.cores
。 如需詳細資訊,請參閱 Spark 執行程式設定 - ApplicationMaster
- 在叢集模式中,使用
spark.driver.memory
和spark.driver.cores
- 在用戶端模式中,使用
spark.yarn.am.memory+spark.yarn.am.memoryOverhead
和spark.yarn.am.cores
- 在叢集模式中,使用
注意
yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb
- 比較新的應用程式總資源與指定佇列中的 yarn 可用資源
步驟 3:追蹤您的 Spark 應用程式
我們需要透過 Spark UI 或 Spark 歷程記錄 UI 識別下列徵兆:
- 哪個階段很慢
- 在 [階段] 索引標籤的 [事件時間表] 中,是否完全利用執行程式 CPU v 核心
- 如果使用 spark sql,SQL 索引標籤中的實體計畫是什麼
- DAG 在一個階段中太長
- 在 [階段] 索引標籤中觀察工作計量 (輸入大小、隨機寫入大小、GC 時間)
如需詳細資訊,請參閱監視 Spark 應用程式
步驟 4:最佳化 Spark 應用程式
另有許多最佳化功能可協助您克服這些挑戰,例如快取和允許資料扭曲。
在下列每篇文章中,您可以找到 Spark 最佳化不同層面的資訊。
- 最佳化 Apache Spark 的資料儲存體
- 最佳化 Apache Spark 的資料處理
- 最佳化 Apache Spark 的記憶體使用量
- 將 Apache Spark 的 HDInsight 叢集最佳化的設定
最佳化 Spark SQL 分割區
spark.sql.shuffle.paritions
預設為 200。 我們可以根據隨機處理聯結或彙總的資料時,根據業務需求進行調整。spark.sql.files.maxPartitionBytes
預設為 HDI 中的 1G。 讀取檔案時,要封裝成單一分割區的位元組數目上限。 只有在使用 Parquet、JSON 和 ORC 等檔案型來源時,此設定才有效。- Spark 3.0 中的 AQE。 請參閱彈性查詢執行