为什么要做成本治理

  1. 业务发展,资源消耗快速增长,但受限于公司资源有限,数仓任务调度效率跟不上,极大程度上影响了业务方的数据使用
  2. 每次的任务治理推动都需要花费较大精力去梳理任务情况,缺少任务资源成本消耗的统计数据
  3. 对于消耗资源大的任务,缺少有力的证据去推动业务方优化

针对以上问题,我们需要去完成以下几个目标

  1. 更细粒度的任务调度监控,针对每个任务的历史执行情况,消耗资源做到监控,并输出报表或者其他工具形式展现,可以清晰查看到每个任务主要资源占用时间段,以及每个时间段占用资源排行的任务
  2. 成本可以量化,做到每个人员、每个部门对应的资源占用可以输出报表,清晰地展示
  3. 任务链路的自动化巡检,定期清理无效任务,比如没有下游,数据一直未被使用,或者任务一直执行失败也无人反馈等类似情况
  4. 治理过程的可追溯,所有降本动作需要被记录与跟踪,反应成本变化,同时也能就每次的优化效果做到可衡量的数据指标体现(可以为后续推动各部门的自助降本打下基础)

治理规划

  • 梳理公司团队、业务线,先把边界划分清楚,做好标签维护
  • 梳理资源指标,制定一套资源计算规则,可以做到资产成本量化,同时做好资源使用情况的详细数据的采集
  • 成本账单建设
  • 过程可跟踪,治理动作需要被记录和跟踪,反应成本变化
  • 设计一套奖惩机制,惩罚资源浪费现象,激发自主降本

具体实现

1、资源成本量化

首先要做到资源成本定义,存储需要磁盘,计算需要cpu和内存等。基于此,核心做法其实很简单:数据成本=资源单价x消耗资源x资源权重

资源单价:

  • 总成本 total_cost = 所有机器的总投入
  • 根据供需关系,决定是cpu贵还是内存贵,每类资源的成本占比是多少,分别记为:cpu_ratio、memory_ratio、disk_ratio

消耗资源:

  • 存储使用的磁盘,包括备份成本,如存在hdfs集群上的数据,一般是3备份,则磁盘占用成本 = 磁盘使用空间 * 3
  • 计算使用的cpu、内存等, 这里需要考虑 sts 采集的结果是实际需要消耗的,但是 yarn 在分配资源时,会有一定的损耗, 所以需要加上一个损耗系数 Data-Governance2

资源权重

  • 不同时段,集群的资源紧缺程度不一样,比如凌晨批量跑任务,属于资源高峰期,这个时间段的资源权重应该加权计算,所以应该从供需角度,考虑分时段权重分配。大致思路如下:
    1. 首先统计出过去一段时间不同时段需要消耗的计算资源总量,得出一个比例, 比如分为三个时间段

      时段 资源占比 权重
      0-9 60% w1
      9-18 30% w2
      18-23 10% w3
    2. 根据比例计算权重, 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、成本账单建设

  • 确立要分析的维度,比如任务维度、个人维度、团队维度、业务线维度
  • 输出报表,可以清晰展现成本分布、成本变化的趋势统计等数据
  • 成本浪费和降本效果有独立且明显的展示页面, 可以让人感受到动力和压力
  • 梳理数据资产重要性,服务了多少业务,被多少人使用,体现价值,并且在任务调度时可以用于动态调整任务优先级 Data-Governance1

这里面需要注意的点是:

  • 数据对应的任务,可能同时产出多个数据,如何分摊这个成本?(简化模型,等比分摊)
  • 确保每个数据产出有唯一的owner,这个成本可以落实到具体的人, 不然到后面很难推进这个成本优化
  • 针对那种临时查询任务,也会消耗资源,而且可能没有落地的产出,需要明确算到团队或者个人头上

3、开发平台智能优化策略

  1. 没有下游依赖的或者有下游,但是下游长期无访问的表或者调度任务推动下线, 因为没有价值
  2. 经常调度失败的任务推动下线,属于浪费资源
  3. 错峰执行,利用闲暇时段执行不重要的任务
  4. 通过埋点分析任务是否经常会发生数据倾斜, 标记需要优化, 通知归属人推动优化

以上所有的通知、优化操作都需要做日志埋点,用于可能的日志审计,防止扯皮

参考