摘要: 部分用户(尤为对外输出)使用MaxCompute(原Odps)时,因为对产品的使用层面和执行层面了解程度不一样,致使提交的任务执行时间过长、占用了较多集群资源;严重的会致使失败、不只须要投入支持同窗精力协助解决、也影响了用户正常业务。 合并整理部分性能提高方法方sql
转载自xiaorui网络
部分用户(尤为对外输出)使用MaxCompute(原Odps)时,因为对产品的使用层面和执行层面了解程度不一样,致使提交的任务执行时间过长、占用了较多集群资源;严重的会致使失败、不只须要投入支持同窗精力协助解决、也影响了用户正常业务。 合并整理部分性能提高方法方便支持用户查询和优化Sql,提升效率;部分须要原来手动调优的如mapjoin、ppd谓词下推注意分区位置等原有的调优设置在不断衍进的产品中都已实现了自动化调优、 不一样阶段的产品调优参数和细节会有不一致、可是熟悉了调优思路和方法后能够作到触类旁通、逐步深刻。分布式
一. 总体思路函数
总体上,调优从底层到sql能够有多个层面的调优,随着产品的不断完善,部分调优已经实现了自动化。若是用户能熟悉常见的调优机制和执行原理,在开发执行sql、业务逻辑和相关参数设置调整来提升性能、能够作到事半功倍。性能
1.硬件及操做系统层面调优:包括磁盘I/O调优(多路复用等)、网络调优(缓冲区大小、链接数放大等)、内存调优(虚拟内存设置、内存控制等);优化
2. 分布式计算平台及存储层面调优:存储格式设置、压缩格式设置、RPC调用设置、链接数控制设置、调度机制设置、block及分片设置、执行资源设置等;ui
3. 业务逻辑层面及参数调整,除总体执行的调优外,对不一样类型的操做进行参数级别的调优、针对聚合、链接、一读多写等修改成不一样的sql或者设置不一样的参数能够极大的提升性能; 操作系统
4. Sql层面及应用层面的调优,重构sql写法、合并sql,大小表链接修改成mapjoin等,在odps2.0中已处理了自动mapjoin等、目前未升级用户及对外输出的用户仍须要修改sql来支持;设计
不一样层面调优及优缺点见下:blog
二. 场景及调优列举
1. 大小表关联修改成mapjoin,增长Mapjoin hint
方法及注意事项:
全部指定的小表占用的内存总和不超过 512M
多表Join时,最左边的两个表,不能同时是 Mapjoin 的表
不一样的关联方式(left/right/inner),对表的顺序有要求
left outer join 左表必须为大表
right outer join 右表必须为大表
inner join 左右表皆可为大表
full outer join 不能直接使用 mapjoin,修改成mapjoin + union all
最新的发布版本上已经支持了automapjoin,能够根据join表的大小自动把小表转为mapjoin,对部分没有显示增长hint的sql和中间结果为小表的sql进行自动优化
2. 数据倾斜
数据倾斜表现:
任务进度长时间维持在99%,查看监控,只有少许 reduce 子任务未完成
单一 reduce 记录数与平均记录数差别多大,最长时长远大于平均时长
优化方法及注意事项:
聚合倾斜,设置参数:set odps.sql.groupby.skewindata=true
关联倾斜,设置参数:set odps.sql.skewinfo=tab1:(col1,col2)[(v1,v2),(v3,v4),...|(v1,v2),(v3,v4),...];set odps.sql.optimize.skewjoin=true
关联倾斜,同时大小表,考虑修改成mapjoin
具体问题具体分析:由于聚合key值null引发的数据倾斜,能够修改null为随机值,打撒数据分发到不一样的instance执行
3. Map 端一读多写
场景及优化:
屡次读取同一张物理表,执行不一样操做,写入多张表;考虑与multiinsert 的联系和区别,是否合适作修改
创建临时表,实现临时表的并行化
注意事项:
优势:大大节省了集群的计算资源和磁盘I/O资源
缺点:写的次数很是多时,可能致使性能问题,影响任务总体执行效率
4 分区裁剪
场景:事实表不少分区,数据量大
优化:避免全表扫描,减小资源浪费;关注分区裁剪有无生效,见下注意事项:从表设计、使用上注意,尽可能让分区裁剪生效
注意事项:
过滤条件中的分区列上有UDF 则分区裁剪生效
表关联时关联条件中包含分区列:
出如今 on 条件中,分区裁剪生效
出如今 where 条件中,主表分区裁剪生效,其他可能失败
5. SQL 合并
场景:
1. 屡次读取相同的数据且源数据数据量大、性能差、费用高
2. 统一业务流程先后关联sql或统计多种指标、筛选不一样数据的sql
优化方法及注意事项:经过修改sql,合并为1个sql执行,尽可能减小对相同数据源的读取次数,达到一次扫描计算多个基础统计量,一次扫描,处理多个筛选条件;如下调整列举:
CASE … WHEN…:合并相同数据源的不一样子查询的关联
动态分区&多路插入等:将知足不一样条件的会员统计信息插入到不一样的表或表分区中去
先后流程sql合并为1个sql执行
6 使用窗口函数优化SQL
窗口函数:
1. 能够进行灵活的分析处理工做
2. 使用 partition by 开窗,order by 排序
3. 能够用 rows 指定开窗范围
4.丰富的开窗函数
优化及注意事项:合理使用窗口函数,能够减小Join次数,提升运行性能;不用窗口函数处理须要写复杂sql的功能,用开窗函数能够高效执行获得预期结果。
阅读更多干货好文,请关注扫描如下二维码: