1、业务层面
计算量太大是不是必须的,是否可以减少参与计算的用户量或者时间跨度;
计算逻辑是否过于复杂,是否可以简化。
2、模型层面
是否有现成的数据可以使用或者基于现成的数据进行加工;
是否可以将整个计算逻辑进行合理拆分,降低每个子任务的复杂度,同时提高复用的可能性;
维度退化,空间和时间的权衡。
3、系统层面(遵循一些计算引擎建议的使用规则和参数设置)
使用Spark3引擎,自动合并小文件;
输入文件的存储格式、压缩格式、大小;
输出文件的大小;
启用压缩;
分区、分桶;
拉链表;
yarn队列的设置;
合适的计算引擎;
task的内存设置;
task处理的数据量;
task的数量;
并行度优化;
调整参数减少Map数量;
调整参数减少reduce数量。
4、sql、代码层面
列裁剪,避免select *;
分区裁剪,使用分区字段过滤;
条件限制;
谓词下推;
map端预聚合;
大key的过滤;
打散倾斜key;
合适的join方式;
用Distribute By Rand控制分区中数据量;
group by优化;
中间结果的缓存和复用;
小文件优化。
5、任务层面
减少任务依赖,尽可能缩短链路;
业务链路/逻辑重构/改写;
任务分级,任务数评估,错峰调度;
任务依赖降级,周级别的任务依赖天级别,天级别依赖小时级别,小时级别依赖分钟级别;
避免频繁创建任务;
核心任务优先保证产出,双链路机制开启;
耗时长的任务拆分成子任务。任务批次提交;
资源动态扩容;
资源腾挪调整;
无用任务下线。