Apache Spark 的記憶體使用量優化

本文討論如何優化 Apache Spark 叢集的記憶體管理,以獲得最佳 Azure HDInsight 效能。

概觀

Spark 的運作方式是將數據放入記憶體中。 因此,管理記憶體資源是優化Spark作業執行的重要層面。 有數種技術可以有效使用叢集的記憶體。

  • 偏好較小的資料分割區,並在分割策略中考量資料大小、類型和發佈。
  • 請考慮較新的、更有效率 Kryo data serialization的 ,而不是預設的 Java 串行化。
  • 偏好使用 YARN,因為它會依批次分隔 spark-submit
  • 監視和微調 Spark 組態設定。

下圖顯示 Spark 記憶體結構,以及部分索引鍵執行程式記憶體參數,以供您參考。

Spark 記憶體考量

如果您使用 Apache Hadoop YARN,YARN 會控制每個 Spark 節點上所有容器所使用的記憶體。 下圖顯示索引鍵物件及其關聯性。

YARN Spark Memory Management.

若要處理「記憶體不足」訊息,請嘗試:

  • 檢閱 DAG 管理重組。 減少地圖端縮減、預先分割區(或貯體化)源數據、最大化單一隨機顯示,並減少傳送的數據量。
  • 偏好 ReduceByKey 將其固定記憶體限制設為 GroupByKey,其提供匯總、視窗和其他函式,但記憶體限制沒有系結。
  • 偏好對於執行程式或資料分割進行較多作業的 TreeReduce,而不偏好對於驅動程式進行所有作業的 Reduce
  • 使用 DataFrame,而不是較低層級的 RDD 物件。
  • 建立封裝動作的 ComplexTypes,例如「前 N 項」、各種彙總或視窗化作業。

如需其他疑難解答步驟,請參閱 Azure HDInsight 中 Apache Spark 的 OutOfMemoryError 例外狀況。

下一步