將 HDInsight 中的 Apache Spark 應用程式最佳化

本文提供將 Azure HDInsight 上的 Apache Spark 應用程式最佳化的策略概觀。

概觀

您可能會面臨下列常見案例

  • 相同的 Spark 作業速度比以前在相同 HDInsight 叢集中的速度慢
  • SPARK 作業在 HDInsight 叢集中的速度比內部部署或其他協力廠商服務提供者慢
  • Spark 作業在一個 HDI 叢集中的速度比在另一個 HDI 叢集中的速度慢

Apache Spark 作業的效能取決於多個因素。 這些效能因素包括:

  • 資料如何儲存
  • 如何設定叢集
  • 處理資料時所使用的作業。
  • 狀況不良的 yarn 服務
  • 記憶體限制,因為執行程式大小不正確和 OutOfMemoryError
  • 工作太多工或太少
  • 資料扭曲導致一些繁重的工作或緩慢的工作
  • 錯誤節點的工作速度較慢

步驟 1:檢查您的 yarn 服務是否狀況良好

  1. 移至 Ambari UI:
  • 檢查 ResourceManager 或 NodeManager 警示
  • 檢查 YARN > 摘要中的 ResourceManager 和 NodeManager 狀態:所有 NodeManager 都應該處於 [已啟動],而且只有 Active ResourceManager 應該處於 [已啟動]
  1. 檢查 Yarn UI 是否可透過 https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster 存取

  2. 檢查 ResourceManager 登入 /var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log 中是否有任何例外狀況或錯誤

如需詳細資訊,請參閱 Yarn 常見問題

步驟 2:比較新的應用程式資源與 yarn 可用的資源

  1. 移至Ambari UI > YARN > 摘要,檢查 ServiceMetrics 中的叢集記憶體

  2. 檢查 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,您應該使用網域管理員使用者。
  1. 計算新應用程式的總資源
  • 所有執行程式資源:spark.executor.instances * (spark.executor.memory + spark.yarn.executor.memoryOverhead) and spark.executor.instances * spark.executor.cores。 如需詳細資訊,請參閱 Spark 執行程式設定
  • ApplicationMaster
    • 在叢集模式中,使用 spark.driver.memoryspark.driver.cores
    • 在用戶端模式中,使用 spark.yarn.am.memory+spark.yarn.am.memoryOverheadspark.yarn.am.cores

注意

yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb

  1. 比較新的應用程式總資源與指定佇列中的 yarn 可用資源

步驟 3:追蹤您的 Spark 應用程式

  1. 透過 Spark UI 監視執行中的 Spark 應用程式

  2. 透過 Spark 歷程記錄伺服器 UI 監視完整的或不完整的 Spark 應用程式

我們需要透過 Spark UI 或 Spark 歷程記錄 UI 識別下列徵兆:

  • 哪個階段很慢
  • 在 [階段] 索引標籤的 [事件時間表] 中,是否完全利用執行程式 CPU v 核心
  • 如果使用 spark sql,SQL 索引標籤中的實體計畫是什麼
  • DAG 在一個階段中太長
  • 在 [階段] 索引標籤中觀察工作計量 (輸入大小、隨機寫入大小、GC 時間)

如需詳細資訊,請參閱監視 Spark 應用程式

步驟 4:最佳化 Spark 應用程式

另有許多最佳化功能可協助您克服這些挑戰,例如快取和允許資料扭曲。

在下列每篇文章中,您可以找到 Spark 最佳化不同層面的資訊。

最佳化 Spark SQL 分割區

  • spark.sql.shuffle.paritions 預設為 200。 我們可以根據隨機處理聯結或彙總的資料時,根據業務需求進行調整。
  • spark.sql.files.maxPartitionBytes 預設為 HDI 中的 1G。 讀取檔案時,要封裝成單一分割區的位元組數目上限。 只有在使用 Parquet、JSON 和 ORC 等檔案型來源時,此設定才有效。
  • Spark 3.0 中的 AQE。 請參閱彈性查詢執行

後續步驟