年初,一个月黑风高的夜晚,数据中台的TL独自坐在工位上,左手托着下巴,右手搭着键盘,指尖缓动,眉头紧锁。面对下边这张图,本可以下班的他,迟迟不愿离开。
过去的半年,有赞的业务高速增长,可喜可贺。但是数据中台的计算资源消耗也水涨船高,半年翻一番,甚至超过业务涨幅。再这么下去,部门恐怕要凉凉,想到这,不禁打了个寒颤。
数据是我们的重要资产,随着业务的发展以及历史的积累,所需存储和计算不断增长在所难免。但是“大”数据意味着大成本,如何有效控制成本合理增长?这个问题,值得深思。
很直接的,找到无用的数据进行下线处理,找到可优化的任务进行改造……这些点都可以省资源。但是仅仅这样是不够的,因为做这些事情本身也需要成本,很琐碎也很费事,还需要各种推动讨人嫌。
我们需要是一种长效的,自运转的降本机制,让小伙伴们感知到成本,感受到浪费,自发地关注成本,节约成本。那么就需要做到这几点:
于是,摆在眼前的几座大山,需要一一翻跃:怎么量化数据成本;怎么算清帐有没有浪费或者优化点;怎么降本和支持降本;怎么跟踪降本过程;怎么持续运营产生效益。
合理地量化出直观的数据成本,是第一步。因此,首先要聊到我们的成本模型。
数据的成本在于硬件资源消耗(本文不考虑人力),存储需要磁盘,计算需要cpu和内存等。基于此,我们的核心做法其实很简单: 数据成本=资源单价*消耗资源 ,下面我们来一一解释。
根据实际情况,判断我们硬件的核心资源:cpu、内存、磁盘,需要估算各自的单价。
以猪价类比,影响因素有很多,关键几个是:
有以上变量,可以估算出单价:
total_cost*cpu_ratio/(total_cpu*load_factor)
total_cost*memory_ratio/(total_memory*load_factor)
total_cost*disk_ratio/(total_disk*load_factor)
数据消耗的资源分为三类:
这个比较简单,定时采集即可,这里就不赘述了。
占用存储资源: disk = data_size*replicator
,其中data_size是数据名义大小,replicator是备份数。
首先,我们有yarn资源利用率监控,可以采集到分钟级的集群负载情况。但是这个是整体的,如何才能精确到每个计算任务的消耗呢?有两个关键的服务:
其中sts采集的结果是实际需要消耗的,但是yarn在分配资源时,会有一定的损耗(可以理解为资源分配、回收环节,占用了资源,但是不做实际计算)。这个系数记为loss_factor,它是一个经验值,可以通过大量任务测试对比得出。
为了统一公式,对于smnt的采集结果,loss_factor=0。这样,就可以算出每个任务消耗的资源:
cpu_seconds*(1+loss_factor)
memory_seconds*(1+loss_factor)
集群的负载随时间变化,看监控,可以发现夜间负载很高,白天负载偏低。同样的资源消耗,在白天跑和在夜间跑,如果计费相同,有违“市场规律”。
因此,为了调节供需关系,同时也鼓励不重要数据在空闲时段计算,我们考虑分时计费。
上图是我们集群某天cpu实际负载情况,可以发现三个时段:
我们有必要对以上三个时段设定不同权重,来“调节市场”。那么,权重怎么设计呢?关键原则是: 设定权重后,保持资源总量合理 。
我们首先统计出过去一段时间不同时段需要消耗的计算资源总量,可以求出一个比例,如下表:
对于权重,要求:0.6*w1+0.3*w2+0.1*z=1
且 w1>w2>w3
。为了更好的效果,w1和w2、w2与w3之间,要拉开差距。
这样,就可以大概定一组权重(我们目前设定的是w1=1.2,w2=0.8,w3=0.4)。值得注意的是,对于可能跨越多个时段的任务,也要按比例加权求和。
定义好这三个权重,假设三个时段消耗的cpu_seconds分别是cs1、cs2、cs3,那么加权系数:
cpu_weight= (cs1*w1+cs2*w2+cs3*w3)/cpu_seconds
,同理可以算出 memory_weight 。
评估好资源单价,采集到资源消耗以及运行时段,就可以评估出一个较为合理的数据成本了。
cpu_price*(cpu*cpu_weight)
memory_price*(memory*memory_weight)
disk_price*disk
当然,实际计算成本,还有许多细节需要考虑,比如:
这里不再展开。
数据有了成本,总不能让它自我优化吧,哈哈,得有人。接下来是,如何让大家感知到成本情况呢?成本账单是必要的。
目前我们提供的账单有全局、部门、个人粒度的。主要内容包含:
实现数据成本量化和账单,本身也需要数据开发。以数据为基础,为了实现多粒度账单,需要特别关注分层和复用。数据分层偏向数仓模型设计,此处不展开,着重讲一下复用。
上面这个图,表达了资源成本的核算过程。
成本可以量化,又有了账单,台子搭好了,接下来要邀请大伙儿来唱戏了。等等,唱什么戏?还得有剧本。
我的成本高企,怎么优化呢?经过我们深入调研,总结出降本“六脉神剑”(其实不止六种)。
除了以上优化点,其实还有很多,这里也不展开了。比如我们强大的数仓团队,使用hive cube能将多个中间层表一次计算得出,降低数倍计算量。
系统上我们做了很多配套服务,方便降本,也保障过程安全可控。同时对于哪些自主发起,系统监控不到的降本行为,也提供了“登记”功能,便于追踪和分析效果。
降本的一切准备就绪,好像天衣无缝,但是我们发布了功能,反应平平啊,导演有点慌。不行,得想办法让机制运转起来,我们总结了四词真言:宣导、骚扰、反馈、奖惩。
首先是宣导,宣传成本意识,引导降本行动。
其次是骚扰,主动出击推动降本。
再次是反馈,平台与用户互动起来。
最后是奖惩,鼓励减少浪费。
总之:降本意识靠 宣导 ,成本大户要 骚扰 ,既要用户多 反馈 ,也要 奖惩 做到位。
以上之外,平台本身也需要对降本做全方面的统计监控,我们有专门的看板辅助运营。
经过半年的努力,我们建立起完善的离线数据降本机制。
半年以来,参与到降本行动的小伙伴有40人,降本行为660次,累计节省约17%离线集群成本。更可喜的是,有超过20%的节省是自主自发完成的。
机制的有效性得以验证,并可以持续产生效益,后续我们会更关注运营,让整个过程更高效。
在降本方面,我们迈出了第一步,未来有几个重点事情:
本文转载自公众号有赞coder(ID:youzan_coder)。
领取专属 10元无门槛券
私享最新 技术干货