云原生数据仓库 AnalyticDB MySQL 版推出Spark SQL诊断功能,若您提交的Spark SQL存在性能问题,您可以根据诊断信息快速定位、分析并解决性能瓶颈问题,优化Spark SQL。本文主要介绍如何进行Spark SQL性能诊断以及性能诊断的示例。
前提条件
集群的产品系列为湖仓版。
已创建Job型资源组。具体操作,请参见新建资源组。
已创建数据库账号。
如果是通过阿里云账号访问,只需创建高权限账号。具体操作,请参见创建高权限账号。
如果是通过RAM用户访问,需要创建高权限账号和普通账号并且将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运行期间扫描多表数据量之间差距过大,会在读取数据时间上存在长尾效应,影响最终查询效果。
建议:
通过选择合适的分布字段来减少表扫描的数据量。