Spark SQL诊断
云原生数据仓库 AnalyticDB MySQL 版推出Spark SQL诊断功能,若您提交的Spark SQL存在性能问题,您可以根据诊断信息快速定位、分析并解决性能瓶颈问题,优化Spark SQL。本文主要介绍如何进行Spark SQL性能诊断以及性能诊断的示例。
前提条件
- 集群的产品系列为企业版、基础版或湖仓版。 
- 已创建数据库账号。 - 如果是通过阿里云账号访问,只需创建高权限账号。 
- 如果是通过RAM用户访问,需要创建高权限账号和普通账号并且将RAM用户绑定到普通账号上。 
 
- 已授权AnalyticDB for MySQL扮演AliyunADBSparkProcessingDataRole角色来访问其他云资源。 
注意事项
仅支持诊断14天以内且执行成功的Spark SQL。
操作步骤
- 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。 
- 在左侧导航栏,单击。 - 查询列表展示SQL查询的更多信息,例如具体的SQL语句、查询提交时间、执行耗时等,详细说明如下: - 字段名 - 字段说明 - 操作 - 单击诊断,查看执行详情,包括详细SQL语句以及诊断结果。 - SQL - SQL语句。 - 查询ID - 查询ID。 - 执行ID - Spark SQL应用中该SQL的顺序ID。 - 状态 - SQL语句的执行状态,包括: - 已完成 
- 运行中 
- 失败 
 - 开始时间 - 查询提交的时间。 - 执行耗时 - SQL语句的执行耗时。 - 最大算子独占时间 - 算子单独占用的最大执行时间。 - 峰值内存 - 查询消耗的峰值内存。 - 扫描数据 - 查询从存储层返回到计算层的数据量。 
- 单击SQL语句对应操作列的诊断。 
- 在查询属性页面,单击执行计划页签来查看目标查询的执行计划树图。 
- 在执行计划树右侧,单击查询级别诊断结果,即可直接查看Query级别诊断结果。 
Query级别诊断结果
AnalyticDB for MySQL的Spark SQL诊断功能可以对Spark SQL查询的Query级别的信息进行统计,再在统计信息的基础上进行诊断并提供调优建议。
Join存在数据膨胀
- 问题: - 如果Join算子的输出行数大于输入行数,则认为是不合理Join操作,会存在数据膨胀问题。最终导致较多计算资源和内存资源被占用,查询变慢。 
- 建议: - 优化代码,例如提前过滤不参与Join的数据,以减少数据计算量。 
扫描数据量倾斜
- 问题: - Spark SQL运行期间扫描多表数据量之间差距过大,会在读取数据时间上存在长尾效应,影响最终查询效果。 
- 建议: - 通过选择合适的分布字段来减少表扫描的数据量。