为什么要做成本治理
- 业务发展,资源消耗快速增长,但受限于公司资源有限,数仓任务调度效率跟不上,极大程度上影响了业务方的数据使用
- 每次的任务治理推动都需要花费较大精力去梳理任务情况,缺少任务资源成本消耗的统计数据
- 对于消耗资源大的任务,缺少有力的证据去推动业务方优化
针对以上问题,我们需要去完成以下几个目标
- 更细粒度的任务调度监控,针对每个任务的历史执行情况,消耗资源做到监控,并输出报表或者其他工具形式展现,可以清晰查看到每个任务主要资源占用时间段,以及每个时间段占用资源排行的任务
- 成本可以量化,做到每个人员、每个部门对应的资源占用可以输出报表,清晰地展示
- 任务链路的自动化巡检,定期清理无效任务,比如没有下游,数据一直未被使用,或者任务一直执行失败也无人反馈等类似情况
- 治理过程的可追溯,所有降本动作需要被记录与跟踪,反应成本变化,同时也能就每次的优化效果做到可衡量的数据指标体现(可以为后续推动各部门的自助降本打下基础)
治理规划
- 梳理公司团队、业务线,先把边界划分清楚,做好标签维护
- 梳理资源指标,制定一套资源计算规则,可以做到资产成本量化,同时做好资源使用情况的详细数据的采集
- 成本账单建设
- 过程可跟踪,治理动作需要被记录和跟踪,反应成本变化
- 设计一套奖惩机制,惩罚资源浪费现象,激发自主降本
具体实现
1、资源成本量化
首先要做到资源成本定义,存储需要磁盘,计算需要cpu和内存等。基于此,核心做法其实很简单:数据成本=资源单价x消耗资源x资源权重
资源单价:
- 总成本 total_cost = 所有机器的总投入
- 根据供需关系,决定是cpu贵还是内存贵,每类资源的成本占比是多少,分别记为:cpu_ratio、memory_ratio、disk_ratio
消耗资源:
- 存储使用的磁盘,包括备份成本,如存在hdfs集群上的数据,一般是3备份,则磁盘占用成本 = 磁盘使用空间 * 3
- 计算使用的cpu、内存等, 这里需要考虑 sts 采集的结果是实际需要消耗的,但是 yarn 在分配资源时,会有一定的损耗, 所以需要加上一个损耗系数
资源权重
- 不同时段,集群的资源紧缺程度不一样,比如凌晨批量跑任务,属于资源高峰期,这个时间段的资源权重应该加权计算,所以应该从供需角度,考虑分时段权重分配。大致思路如下:
-
首先统计出过去一段时间不同时段需要消耗的计算资源总量,得出一个比例, 比如分为三个时间段
时段 资源占比 权重 0-9 60% w1 9-18 30% w2 18-23 10% w3 -
根据比例计算权重,
0.6*w1+ 0.3*w2 + 0.1*w3=1
w1>w2>w3 且 w1和w2、w2与w3之间,要拉开差距(我司设定的为 w1=1.2,w2=0.8,w3=0.4)
-
2、成本账单建设
- 确立要分析的维度,比如任务维度、个人维度、团队维度、业务线维度
- 输出报表,可以清晰展现成本分布、成本变化的趋势统计等数据
- 成本浪费和降本效果有独立且明显的展示页面, 可以让人感受到动力和压力
- 梳理数据资产重要性,服务了多少业务,被多少人使用,体现价值,并且在任务调度时可以用于动态调整任务优先级
这里面需要注意的点是:
- 数据对应的任务,可能同时产出多个数据,如何分摊这个成本?(简化模型,等比分摊)
- 确保每个数据产出有唯一的owner,这个成本可以落实到具体的人, 不然到后面很难推进这个成本优化
- 针对那种临时查询任务,也会消耗资源,而且可能没有落地的产出,需要明确算到团队或者个人头上
3、开发平台智能优化策略
- 没有下游依赖的或者有下游,但是下游长期无访问的表或者调度任务推动下线, 因为没有价值
- 经常调度失败的任务推动下线,属于浪费资源
- 错峰执行,利用闲暇时段执行不重要的任务
- 通过埋点分析任务是否经常会发生数据倾斜, 标记需要优化, 通知归属人推动优化
以上所有的通知、优化操作都需要做日志埋点,用于可能的日志审计,防止扯皮