优化 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 都应处于“已启动”状态,且只有活动 ResourceManager 应处于“已启动”状态
  1. 检查 Yarn UI 是否可通过 https://YOURCLUSTERNAME.azurehdinsight.cn/yarnui/hn/cluster 访问

  2. 检查 /var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log 中 ResourceManager 日志中是否存在任何异常或错误

有关详细信息,请参阅 Yarn 常见问题

步骤 2:将新应用程序资源与 yarn 可用资源进行比较

  1. 转到“Ambari UI”>“YARN”>“摘要”,检查 ServiceMetrics 中的“群集内存”

  2. 详细检查 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,应使用域管理员用户。
  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 History Server UI 监视完整或不完整的 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。 请参阅自适应查询执行

后续步骤