Spark SQL诊断

云原生数据仓库 AnalyticDB MySQL 版推出Spark SQL诊断功能,若您提交的Spark SQL存在性能问题,您可以根据诊断信息快速定位、分析并解决性能瓶颈问题,优化Spark SQL。本文主要介绍如何进行Spark SQL性能诊断以及性能诊断的示例。

前提条件

  • 集群的产品系列为企业版、基础版或湖仓版

  • 已创建Job型资源组。具体操作,请参见新建资源组

  • 已创建数据库账号。

  • 已授权AnalyticDB for MySQL扮演AliyunADBSparkProcessingDataRole角色来访问其他云资源。具体操作,请参见账号授权

注意事项

仅支持诊断14天以内且执行成功的Spark SQL。

操作步骤

  1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

  2. 在左侧导航栏,单击诊断优化 > Spark SQL诊断优化

    查询列表展示SQL查询的更多信息,例如具体的SQL语句、查询提交时间、执行耗时等,详细说明如下:

    字段名

    字段说明

    操作

    单击诊断,查看执行详情,包括详细SQL语句以及诊断结果。

    SQL

    SQL语句。

    查询ID

    查询ID。

    执行ID

    Spark SQL应用中该SQL的顺序ID。

    状态

    SQL语句的执行状态,包括:

    • 已完成

    • 运行中

    • 失败

    开始时间

    查询提交的时间。

    执行耗时

    SQL语句的执行耗时。

    最大算子独占时间

    算子单独占用的最大执行时间。

    峰值内存

    查询消耗的峰值内存。

    扫描数据

    查询从存储层返回到计算层的数据量。

  3. 单击SQL语句对应操作列的诊断

  4. 查询属性页面,单击执行计划页签来查看目标查询的执行计划树图。

  5. 在执行计划树右侧,单击查询级别诊断结果,即可直接查看Query级别诊断结果

Query级别诊断结果

AnalyticDB for MySQL的Spark SQL诊断功能可以对Spark SQL查询的Query级别的信息进行统计,再在统计信息的基础上进行诊断并提供调优建议。

Join存在数据膨胀

  • 问题

    如果Join算子的输出行数大于输入行数,则认为是不合理Join操作,会存在数据膨胀问题。最终导致较多计算资源和内存资源被占用,查询变慢。

  • 建议:

    优化代码,例如提前过滤不参与Join的数据,以减少数据计算量。

扫描数据量倾斜

  • 问题

    Spark SQL运行期间扫描多表数据量之间差距过大,会在读取数据时间上存在长尾效应,影响最终查询效果。

  • 建议

    通过选择合适的分布字段来减少表扫描的数据量。