gitbook/数据中台实战课/docs/226294.md
2022-09-03 22:05:03 +08:00

255 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 08 | 交付速度和质量问题解决了,老板说还得“省”
你好,我是郭忆。
在上一节课中,我们讨论了如何保障数据中台的数据质量,让数据做到“准”。我认为,除了“快”和“准”,数据中台还离不开一个“省”字。尤其是随着数据规模越来越大,成本越来越高,如果不能合理控制成本,还没等你挖掘出数据的应用价值,企业利润就已经被消耗完了。
所以,能否做到精细化的成本管理,关乎数据中台项目的成败。还是分享一个我见过的事儿。
![](https://static001.geekbang.org/resource/image/ab/cf/abd782015625ed0497a401b1b2eab7cf.png?wh=854*568 "某电商业务数据建设资源增长趋势CU= 1vcpu + 4G memory")
这张图展示了某电商平台的大数据资源消耗增长趋势尤其值得你关注的是到了2019年全年的资源规模已经达到了25000CU全年机器预算达到了3500W。对一个在创业的企业来说这显然是一笔不小的开支。
终于有一天数据团队的负责人李好看化名就被CEO叫到了办公室CEO问了几个问题
* 这3500W花在什么业务上
* 你们做了哪些成本优化的举措,效果如何?
一系列的灵魂拷问,直接把李好看问懵了,他心想:团队的成本是按机器又不是数据应用核算的。在数据中台中,数据应用之间的底层数据是复用的,那具体每个数据产品或者报表花了多少钱,自己没有这样的数据啊,怎么可能知道。
可对CEO来说这些问题很重要因为资源总是有限的他必须确保资源都用在战略目标的关键节点上。比如对于电商团队今年的核心KPI是提升单个注册会员在平台的消费额那从老板角度来讲他必须确保资源都投入与KPI相关业务中例如基于数据对注册会员进行精准化营销来提升会员在平台的消费额。
讲到这儿,你可以想一想,自己所在的团队是否发生过类似的事情? 我相信,数据部门是企业的成本中心,如果要展现自己的价值,一方面是支撑好业务,获得业务的认可;另外一方面就是精简成本,为公司省钱。
所以,今天我们就把重点放在省钱上,聊一聊数据中台的精细化成本管理。
## 有哪些成本的陷阱?
在一开始建设数据中台时,你往往会关注新业务的接入,数据的整合,数据价值的挖掘上,忽略成本管控的问题,从而落入陷阱中,造成成本爆炸式的增长。所以,你有必要深入了解一下有哪些陷阱,从而尽量在日常开发中避免。
在这里我总结了8种陷阱其中
* 1~3是广泛存在但是容易被忽略的需要你格外注意
* 4~8涉及数据开发中一些技能你在开发过程中注意一下就可以了。
除此之外,在学习这部分知识的过程中,我建议你“知其然,更要知其所以然”,这样才能发现问题的本质,从而深入掌握解决问题的方法。
**第一,数据上线容易下线难。**
![](https://static001.geekbang.org/resource/image/e5/5d/e5db0e377d41724e387a0d2fc0e8bb5d.png?wh=1058*655)
先来看一组统计数据这是某数据中台项目表相关的使用统计。从中你可以发现有一半的表在30天内都没有访问而这些表占用了26%的存储空间。如果我们把这些表的产出任务单独拎出来在高峰期需要消耗5000Core CPU的计算资源换算成服务器需要125台按照一台服务器可分配CPU 40Core计算折合成本一年接近500W。
是不是觉得自己竟然有这么多没用的数据?我经常把数据比作手机中的图片,我们总是不断地拍照,生成图片,却懒得清理,最终手机里面的存储经常不够用。
对于无法及时清理数据,数据开发其实也有苦衷。他们并不知道一个表还有哪些任务在引用,还有哪些人在查询,自然不敢停止这个表的数据加工,那造成的后果就是数据上线容易,下线难。
**第二,低价值的数据应用消耗了大量的资源。**
我们的数据看上去每天都在被访问,但究竟产出了多少价值,投入和产出是否匹配呢?作为一个数据部门,我们要问一问自己。
我们曾经有一个宽表拥有很多列的表经常出现在数据中台下游的汇总层数据中算上上游加工链路的任务每天加工这张宽表要消耗6000块钱一年要200W可追查后我们发现这张宽表实际每天只有一个人在使用还是一个运营的实习生。显然投入和产出极不匹配。
这其实间接说明,数据部门比较关注新的数据产品带给业务的价值,却忽略了已经存在的产品或者报表是否还存在价值,最终导致低价值的应用仍然在大量消耗资源。
**第三,烟囱式的开发模式。**
烟囱式的开发不仅会带来研发效率低的问题同时因为数据重复加工还会存在资源浪费的问题。我们来算一笔账一张500T的表加工这张表计算任务需要高峰期消耗300Core折合7台服务器按照一台服务器可分配CPU 40Core计算再加上存储盘的成本(按照0.7 元/TB\*天计算)一年需要消耗40W。
而这张表每复用一次就可以节省40W的成本。所以通过模型复用还可以实现省钱的目的。
**第四,数据倾斜。**
数据倾斜会让任务性能变差,也会浪费大量的资源,那什么是数据倾斜呢?
![](https://static001.geekbang.org/resource/image/83/c8/83bb148a5b12651be930df928d170fc8.jpg?wh=1142*1026 "单Stage阶段Spark任务数据分片运行图")
你肯定听说过木桶效应吧一个木桶装多少水主要取决于最短的那块板。对于一个分布式并行计算框架来说这个效应同样存在。对于Spark计算引擎来说它可以将海量的数据切分成不同的分片Partition分配到不同机器运行的任务中进行并行计算从而实现计算能力水平扩展。
但是整个任务的运行时长,其实取决于运行最长的那个任务。因为每个分片的数据量可能不同,每个任务需要的资源也不相同。由于不同的任务不能分配不同的资源,所以,总任务消耗资源=max{单个任务消耗的资源} \* 任务数量。这样一来,数据量小的任务会消耗更多的资源,就会造成资源的浪费。
我们还是举个电商场景的例子。
假设你需要按照商户粒度统计每个商户的交易金额此时我们需要对订单流水表按照商户进行group by计算。在平台上每个商户的订单交易量实际差距很大有的订单交易量很多有的却比较少。
![](https://static001.geekbang.org/resource/image/f2/a9/f267e8c7f4d1b03ff464e349cbd98ba9.jpg?wh=1142*747)
我们利用Spark SQL完成计算过程。
![](https://static001.geekbang.org/resource/image/11/0c/1152306e695043efba993f303e31720c.jpg?wh=1142*550 "数据倾斜示意图")
在上图中任务A 读取了左边某个分片的数据按照供应商进行聚合然后输出给下一个Stage的B、C、D任务。
你可以看到聚合后B、C和D任务输入的数据量有很大的不同B处理的数据量比C和D多消耗的内存自然更多假设单个Executor需要分配16G而B、C、D不能设置不同的内存大小所以C和D也都设置了16G。可实际上按照C和D的数据量只需要4G就够了。这就造成了C和D 任务资源分配的浪费。
**第五,数据未设置生命周期。**
在[06讲](https://time.geekbang.org/column/article/224516)中,我强调,一般原始数据和明细数据,会保留完整的历史数据。而在汇总层、集市层或者应用层,考虑到存储成本,数据建议按照生命周期来管理,通常保留几天的快照或者分区。如果存在大表没有设置生命周期,就会浪费存储资源。
**第六,调度周期不合理。**
![](https://static001.geekbang.org/resource/image/91/52/913db7534374e4da5b2bf1a4c2f84052.png?wh=854*568)
通过这张图你可以看到大数据任务的资源消耗有很明显的高峰和低谷效应一般晚上12点到第二天的9点是高峰期9点到晚上12点是低谷期。
虽然任务有明显的高峰低谷效应,但是服务器资源不是弹性的,所以就会出现服务器在低谷期比较空闲,在高峰期比较繁忙的情况,整个集群的资源配置取决于高峰期的任务消耗。所以,把一些不必要在高峰期内运行任务迁移到低谷期运行,也可以节省资源的消耗。
**第七,任务参数配置。**
任务参数配置的不合理往往也会浪费资源。比如在Spark中Executor 内存设置的过大CPU设置的过多还有Spark 没有开启动态资源分配策略一些已经运行完Task的Executor 不能释放,持续占用资源,尤其是遇到数据倾斜的情况,资源浪费会更加明显。
**第八,数据未压缩。**
Hadoop 的HDFS 为了实现高可用默认数据存储3副本所以大数据的物理存储量消耗是比较大的。尤其是对于一些原始数据层和明细数据层的大表动辄500多T折合物理存储需要1.5P三副本所以实际物理存储500\*3大约需要16台物理服务器一台服务器可分配存储按照12\*8T计算如果不启用压缩存储资源成本会很高。
另外在Hive或者Spark 计算过程中中间结果也需要压缩可以降低网络传输量提高Shuffer (在Hive或者Spark 计算过程中,数据在不同节点之间的传输过程)性能。
你看我为你列举了8个典型的成本陷阱那你可能会问了老师我已经中招了该怎么办呢 别急,接下来我们就看一看,如何进行精细化的成本管理。
## 如何实现精细化成本管理?
我认为,成本治理应该遵循全局盘点、发现问题、治理优化和效果评估四个步骤。
![](https://static001.geekbang.org/resource/image/b7/bb/b72d173eee93d56100bcc7f53da0a1bb.jpg?wh=1142*1060)
### 全局资产盘点
精细化成本管理的第一步,就是要对数据中台中,所有的数据进行一次全面盘点,基于元数据中心提供的数据血缘,建立全链路的数据资产视图。
![](https://static001.geekbang.org/resource/image/fc/64/fc9f418642523cc955ba91575f240064.jpg?wh=1142*719)
从这个图中你可以看到,全链路数据资产视图的下游末端关联到了数据应用(报表:财务分析),而上游的起点是刚进入数据中台的原始数据。数据之间通过任务进行连接。
接下来我们要计算全链路数据资产视图中末端数据的成本和价值末端数据就是加工链路最下游的表例如图中TableATable G
为什么一定要从末端开始呢? 因为中间数据,在计算价值的时候,还要考虑下游表被使用的情况,比较难计算清楚,所以我们选择从末端数据开始。这与我们下线表的顺序也是一致的,如果数据的价值很低,成本很高,我们也是从末端数据开始下线的。
**那么数据成本该如何计算呢?**
我们要对上图中财务分析报表核算成本这个报表上游链路中涉及到abc3个任务ABCDEF 6张表那么
> 这张报表的成本=3个任务加工消耗的计算资源成本+6张表消耗的存储资源的成本。
另外,需要注意的是,如果一个表被多个下游应用复用,那这个表的存储资源成本以及产出任务消耗的成本,需要分摊给多个应用。
**那价值又该如何计算呢?**
![](https://static001.geekbang.org/resource/image/e4/63/e4a0117a42386ad9c8bec7a418d89563.jpg?wh=1142*346)
我们来分析一下这张图。
如果末端数据是一张应用层的表它对接的是一个数据报表那衡量这个数据的价值主要是看报表的使用范围和使用频率。在计算使用范围时通常用周活来评估同时还要考虑不同管理级别的人权重对于老板他一个人的权重可以相当于1000个普通员工。
之所以这样设计,是考虑到管理级别越高,做出的商业决策影响就越大,自然这个价值也就越大。使用频率一般使用单个用户每周查看报表的次数来衡量,次数越高,说明报表价值越大。
如果末端数据对接的不是一个数据报表,而是面向特定场景的数据应用(比如我之前提到过的供应链分析决策系统,它面向的人群主要是供应链部门)。衡量这类产品的价值,主要考虑目标人群的覆盖率和直接业务价值产出。什么是直接业务价值产出呢?,在供应链决策系统中,就是通过系统自动生成的采购订单占所有采购订单的比例。
除此之外,末端数据,可能还是一张集市层的表,它主要用于提供给分析师做探索式查询。这类表的价值主要看它被哪些分析师使用,使用频率如何。同样,在使用范围评估时,要对分析师按照级别进行加权。
### 发现问题
全局盘点,为我们发现问题提供了数据支撑,而你需要重点关注下面三类问题:
* 持续产生成本但是已经没有使用的末端数据“没有使用”一般指30天内没有访问
* 数据应用价值很低,成本却很高,这些数据应用上游链路上的所有相关数据;
* 高峰期高消耗的数据。
那么为什么你要关注这三类数据呢?
* 其实第一类就是没有使用但一直在消耗成本的表对应的就是我提到的陷阱1。
* 第二类其实就是低价值产出高成本的数据应用对应的是陷阱2。
* 第三类高成本的数据对应的就是陷阱48。
![](https://static001.geekbang.org/resource/image/86/36/86978c0d60e6cc050b1b9fc512221b36.png?wh=2239*1376)
陷阱3实际是在第6节模型设计中解决的。
### 治理优化
针对这三类问题,我们需要制订相应的策略。
对于第一类问题,应该对表进行下线。 数据下线要谨慎,你可以参考这张数据下线的执行过程图:
![](https://static001.geekbang.org/resource/image/9a/3b/9a782afd76ce95cab7e224afb97e123b.jpg?wh=1142*635)
末端数据删除后,原先末端数据的上游数据会成为新的末端数据,同样还要按发现问题到治理优化进行重复,直到所有的末端数据都不满足下线策略为止。
对第二类问题我们需要按照应用粒度评估应用是否还有存在的必要。对于报表可以按照30天内没有访问的应用自动下线的策略先对报表进行销毁然后对报表上游的表进行下线如果该表还被其他的应用引用就不能下线。**下线步骤可以参考前面的下线步骤。**
第三类问题主要是针对高消耗的数据又具体分为产出数据的任务高消耗和数据存储高消耗。对于产出任务高消耗首先要考虑是不是数据倾斜。具体怎么判断呢其实你可以通过MR或者Spark日志中Shuffer的数据量进行判断。如果有某一个Task 数据量非常大,其他的很少,就可以判定出现了数据倾斜。
![](https://static001.geekbang.org/resource/image/bb/4a/bb6bff0893077c370c812911684ed24a.png?wh=2655*1451 "图 Spark task shuffer records")
![](https://static001.geekbang.org/resource/image/ce/62/ce3feb95851ef24d662127dae42cf062.png?wh=2654*1421 "图 MR reduce task records")
如果出现数据倾斜,该如何处理呢?
数据倾斜的处理方法有很多不同的场景有一些适用的解决方案比如在一些大表和小表关联时Key 分布不均造成的数据倾斜可以使用mapjoin的方式解决另外还有一些比较通用的处理方式例如把热点的Key 进行单独的处理然后对剩下的Key进行处理然后对结果进行并集。
因为它不是本文的重点,所以这里就不再详细展开,之前有一篇美团的文章,对数据倾斜有比较深入的分析,推荐给你做课下学习的[资料。](https://tech.meituan.com/2016/05/12/spark-tuning-pro.html)
除了数据倾斜我们还应该检查任务的配置参数。例如对于Spark 执行引擎Executor 个数是否开的过大executor-cores和executor-memory是否开的过多利用率比较低。一般来说executors-memorty 设置为4G-8G为宜executor-cores设置为2-4个为宜这是我们实践过利用率最高的配置选项
另外,你还要考虑任务是否真的有必要在高峰期执行,可以根据集群的负载情况,尽量将任务迁移到非高峰期执行,我将这个步骤称为“削峰填谷”。
上面几点是产出任务高消耗的情况,那么对于存储消耗比较大的任务,你首先要考虑是否要压缩,尤其是对于原始数据层和明细数据层,建议压缩,压缩的方式有这样几种:
![](https://static001.geekbang.org/resource/image/9c/fd/9c17d6c8975d68ca3679a201fd05dcfd.jpg?wh=1142*410)
整体来看对于小文件的压缩不考虑splitgzip比较合适对于大文件推荐使用lzo支持split在保证压缩效率的前提下有着相对稳定的压缩比。
除此之外,还需要考虑生命周期是否设置:
* 对于ODS原始数据层和DWD 明细数据层,比较适合用永久保留的策略;
* 对于一些商品、用户维表可以考虑3年或者5年的保留策略。
整体上底层表都是长期保留的。所以你的关注重点应该是汇总层以上的表包括汇总层一般可以根据数据的重要性制订7天1个月的保留策略。
### 治理效果评估
现在,通过我介绍的这几个方法,你已经能够节省大量的资源消耗,那如何量化我们的治理成果呢?
五个字:省了多少钱。不过,如果直接拿服务器的数量来衡量,其实并不能真实地反应治理效果,因为还要考虑业务增长的原因。业务不是停止不动的,所以你可以围绕任务和数据的成本考虑这样几点:
* 下线了多少任务和数据;
* 这些任务每日消耗了多少资源;
* 数据占用了多少存储空间。
拿这些资源来计算成本这样就能够算出来省了多少钱。我还是拿本节课开始的例子来看任务A 运行时长 3个小时在运行过程中共消耗5384503 cpu\*s37007892 GB \*s, 假设我们1个CU 1 cpu 4g memeory一年是1300元成本折合每天为3.5元计算公式为1300/365
**这里需要特别强调,**不论是优化或者下线任务,我们只统计高峰时间段内,因为优化低峰时间,并不能实际节省资源。
高峰时间段为8个小时那折合每秒的费用为0.00012153, 那该任务的费用为max{5384503\*0.00012153, 37007892/4 \* 0.00012153} = max{654, 1124} = 1124 。那下线这个任务后就节省1124元再加上表 A占用的存储空间大小乘以每GB的成本就可以得出数据表A下线节省的费用。
## 成本治理中心
成本治理不是一劳永逸的工作需要持之以恒不断发现问题然后治理优化建立长久运行机制的前提是必须降低成本治理的门槛接下来看一下网易的一个成本治理的平台EasyCost。
![](https://static001.geekbang.org/resource/image/94/8d/94acdfab6f168b955d16109748abed8d.png?wh=2696*1579)
系统提供了数据诊断的功能,可以按照访问时间、访问频率、关联的应用,设置下线策略,支持一键灰度下线,大幅提高了管理的效率。
![](https://static001.geekbang.org/resource/image/04/f4/047cef40dba74b20b9d97f31d92216f4.png?wh=2657*1578)
通过介绍EasyCost我想告诉你的是今天的内容其实可以通过系统化的方式沉淀到产品中然后通过产品提高管理的效率从而实现治理机制的长久落地。
## 课堂总结
总的来说,通过数据中台,一方面你可以获得大数据作为资产中心带来的红利,另一方面,你也有可能陷入成本的深渊,为野蛮增长的大数据费用买单。
今天这节课我从常见的8个成本陷阱入手带你分析了可能造成成本浪费的原因然后介绍了精细化成本管理的方法在最后我想再强调几个你可能忽略的点
* 无用数据的下线应该从全链路数据资产视图的末端入手,然后抽丝剥茧,一层一层,向数据加工链路的上游推进。
* 应用层表的价值应该以数据应用的价值来衡量,对于低价值产出的应用,应该以应用为粒度进行下线。
* 对高消耗任务的优化只要关注集群高峰期的任务,项目的整体资源消耗只取决于高峰期的任务消耗,当然,如果你使用的是公有云的资源,可以高峰和低谷实施差异化的成本结算,那低谷期的也是要关注的。
![](https://static001.geekbang.org/resource/image/c2/b7/c233339ec939674b3e1517d69d7b9bb7.jpg?wh=1142*857)
## 思考时间
在数据中台的集市层,会存在一些大的宽表,这些宽表可能存在几百个字段,上游可能有数十个表,如果要计算这个表的成本会非常高。在这个表中,字段的访问频率是不相同,有的字段频率很高,有的字段频率很低,如果要对这张宽表做优化,你觉得如何来做呢?
最后感谢你的阅读,如果这节课让你有所收获,也欢迎你分享给更多的朋友。