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 内存管理。

若要解决显示“内存不足”消息的问题,请尝试:

  • 查看 DAG 管理数据重组。 通过映射端化简减少内存使用,对源数据进行预分区(或 Bucket 存储化),最大化单个数据重组,以及减少发送的数据量。
  • 首选具有固定内存限制的 ReduceByKey,而不是 GroupByKey,后者提供聚合、窗口化和其他功能,但具有无限内存限制。
  • 首选在执行程序或分区上执行更多工作的 TreeReduce,而不是在驱动程序上执行所有工作的 Reduce
  • 使用 DataFrame,而不是级别较低的 RDD 对象。
  • 创建用于封装操作(比如“Top N”、各种聚合或窗口化操作)的 ComplexType。

有关其他故障排除步骤,请参阅 Azure HDInsight 中 Apache Spark 的 OutOfMemoryError 异常

后续步骤