提示:上游任务优化、当前任务优化、下游任务优化和相关环境优化,全链路优化任务。
一、模型优化
合理的需求、合理的表结构、合理的处理逻辑。
1. 字段优化
1 缩减字段
1)删除没有用途的字段;
2) 中英文都有的字段, 只保留英文;
3) 删除不常用且可以通过现有字段关联得到的字段;
2 字段类型
1)选择合适的数据类型,尽量选择低存储的;
2)尽量不要为了方便,都选择string类型;
3 字段值
1)选择存储简洁的代码,需要真实值时通过码表获取;
2)列式存储时,用null填充空值;
2. 存储类型
1 存储格式
1)最好列式存储(parquet、orc),压缩比高、读取性能好;
2)最好选计算引擎默认的存储格式,性能最优;
2 压缩格式
1)查询较多表,要求高处理性能,可选低压缩率的;
2)查询较少表,要求低存储的,可选高压缩率的;
3)不同的层采取不同的压缩格式;
3 分层存储
1)数据冷热分层
4 文件均匀度
1)最好大小均匀
2)小文件合并
3. 维表字段
尽量在最后一步关联码表
1)聚合完成后,再关联出所需要的维度;
4. 全量表优化
1 增量数据并入
历史数据一般比较多,增量数据如何高效并入合成全量表;
2 过滤无效数据
1)过滤失活数据;
2)过滤不再使用的数据;
5. 添加索引
分区很多的表,查询元数据缓慢时,可以增加分区索引;
二、代码优化
1. 顺序优化
1)多表关联时,能减少数据量的表先关联;
2)join语句的关联键区分度大的在左边;
3)where语句先分区过滤再字段过滤,区分度大的字段在左边;
4)窗口键的顺序: 区分度大的放在前面
5)数据先关联,后执行表生成函数;
2 hint优化
1)显示指明广播join
2)控制写出文件数
3 主键过滤
关联主键(为空为null和异常处理),能降低关联的数据量和避免数据倾斜
1)id = '异常主键'
2) id is null
3) id = ''
4 近似计算
要求不精确的统计,可以近似计算;
1)对表进行抽样
2)近似计算算子
5 数据倾斜
6 读文件优化
1)读取海量小文件优化
三、环境优化
1. 硬件资源
1)CPU
2)内存
a. spark.shuffle.spill.numElementsForceSpillThreshold数据更多的溢写到磁盘;
b. 性能更好的磁盘,数据更快的写到磁盘;
3)磁盘
a. shuffle read 和 shuffle write慢,磁盘iops可能达到上限;
b. 在单个节点上配置更多的卷
使得所有卷的总大小和以前单个卷的大小一样,以增加单个任务节点的总磁盘读写吞吐量。
比如,对于集群的任务 Spot 实例组,您可以使用 4 个 EBS 卷,每个 1TB 大小,而不是 1 个 4TB 大小的卷。
4)网络带宽
网络带宽是否达到了上线
5)桶带宽
桶带宽是否达到上限
2. 打散任务
任务越集中,整体的性能越差,尽量均匀布置任务;集群越庞大,整体性能越差;
1)实效性不强的任务,可以迁移到低峰区;
2)需要多天回溯的,是否可以延时执行只运行一次;
3)价值高的优先执行,价值低的低峰执行;
4)重点任务在稳定集群运行任务,避免宕机或资源回收导致的任务重试影响实效性;
5)集群拆分:重要程度、区域;
3. spot集群
执行时间短,shuffle过程少
5. 保证driver稳定
1)driver最好运行在core节点
driver启动在非core节点上,节点被回收会导致任务失败无法进行重试。
2)非driver任务不要运行在core节点
避免资源紧张,无法启动driver。
6. 对象存储
- 对象存储的流控与频控;
- 对象存储的多版本;
- 数据的分层存储;
四、调度优化
1. 同时调度的任务不能过多(调度并行度限制)
2. 高频转低频(小时到天,天到周)
四、外部优化
上下游任务的调整,是否可以减低本任务处理的复杂度;