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