优化 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 都应处于“已启动”状态,且只有活动 ResourceManager 应处于“已启动”状态
检查 Yarn UI 是否可通过
https://YOURCLUSTERNAME.azurehdinsight.cn/yarnui/hn/cluster
访问检查
/var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log
中 ResourceManager 日志中是否存在任何异常或错误
有关详细信息,请参阅 Yarn 常见问题
步骤 2:将新应用程序资源与 yarn 可用资源进行比较
转到“Ambari UI”>“YARN”>“摘要”,检查 ServiceMetrics 中的“群集内存”
详细检查 yarn 队列指标:
- 转到 Yarn UI,通过
https://YOURCLUSTERNAME.azurehdinsight.cn/yarnui/hn/cluster/scheduler
检查 Yarn 计划程序指标 - 或者,可以通过 Yarn Rest API 检查 yarn 计划程序指标。 例如,
curl -u "xxxx" -sS -G "https://YOURCLUSTERNAME.azurehdinsight.cn/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 History 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。 请参阅自适应查询执行