服务化在业务系统中提的比较多,它是业务系统化繁为简,实现业务拆分的必经之路(特别是这几年微服务的概念深入人心)。那对于数据中台,服务化意味着什么呢?数据服务到底解决了什么问题? 我相信很多人会有这样的疑问。服务化:不同系统之间通过服务方式交互,服务通常以 API 接口形式存在。
当然,关于数据服务的“料”很多,信息比较密集,要想搞清楚数据服务解决了什么问题,就要先知道,没有数据服务,我们在日常数据建设中存在哪些痛点。
数据接入方式多样,接入效率低
数据中台加工好的数据,通常会以 Hive 表的形式存储在 HDFS 上。如果想直接通过数据报表或者数据产品前端展现,为了保证查询的速度,会把数据导出到一个中间存储上:
数据量少的可以用 MySQL , Oracle 等 DB,因为部署维护方便、数据量小、查询性能强。比如数据量小于 500W 条记录,建议使用 DB 作为中间存储;
涉及大数据量、多维度查询的可以用 GreenPlum,它在海量数据的 OLAP(在线分析处理)场景中有优异的性能表现。
比如数据量超过 500W 记录,要进行多个条件的过滤查询;涉及大数据量的单 Key 查询,可以用 HBase。在大数据量下,HBase 拥有不错的读写性能。比如超过 500W 记录,根据 Key 查询 Value 的场景。如果需要用到二级索引,由于 HBase 原生不支持二级索引,所以可以引入 ES,基于 ES 构建二级索引和 RowKey(HBase 中的 Key)映射关系,查询时先根据二级索引在 ES 中找到 RowKey,然后再根据 RowKey 获取 HBase 中的 Value 值。
因为不同的中间存储,涉及的访问 API 也不一样,所以对数据应用开发来说,每个数据应用都要根据不同的中间存储,开发对应的代码,如果涉及多个中间存储,还需要开发多套代码,数据接入效率很低。而数据服务为数据开发屏蔽了不同的中间存储,应用开发使用统一的 API 接口访问数据,大幅度提高了数据应用的研发效率。当然了,数据接入效率低,除了跟对接不同的中间存储有关,还因为数据和接口不能复用。这又是怎么回事呢?
那么当数据应用上线之后,我们就进入了运维阶段,如果这个阶段没有数据服务的话,会出现什么问题呢?
不知道数据被哪些应用访问
张好看(化名)是一名数据开发,某一天的凌晨,她突然接到了一堆电话报警:有大量的任务出现异常(对应上图中红色表的产出任务)。经过紧张的定位后,她确认问题来源于业务系统的源数据库,也就是说,因为一次数据库的表结构变更,导致数据中台中,原始数据清洗出现异常,从而影响了下游的多个任务。
这时,摆在她面前的,是一堆需要恢复重跑的任务。可是队列资源有限,到底先恢复哪一个呢? 哪个任务最终会影响到老板第二天要看的报表呢?
虽然数据血缘建立了表与表之间的链路关系,但是在表的末端,我们却不知道这个表被哪些应用访问,所以应用到表的链路关系是断的。当某个任务异常时,我们无法快速判断出这个任务影响了哪些数据应用,从而也无法根据影响范围决定恢复的优先级,最终可能导致重要的报表没有恢复,不重要的报表却被优先恢复了。
同样,在成本治理中,我也提到,因为没有应用和数据的链路关系,我们不敢贸然下线数据。
而数据服务打通了数据和应用的访问链路,建立了从数据应用到数据中台数据的全链路数据血缘关系,这就等于我们在迷宫中拿到了一个地图,当任何一个任务出现问题,我们都可以顺着地图,找到这个故障影响了哪些应用,从而针对重要应用加速恢复速度。同样,我们也可以放心的下线数据中台中任意一张表。
除了不知道数据被哪些下游应用使用,在运维阶段,我们还经常面临着数据表频繁重构,而这也许是数据应用开发最可怕的噩梦了。
数据部门字段变更导致应用变更
数据中台底层模型的字段变更是比较频繁的一个事情,因为本身汇总层的模型也在随着需求不断优化。
“数据应用 - 经营分析”使用了数据中台的 ads_mamager_1d 这张表的 c 字段,如果我们对这张表进行了重构,访问字段需要替换成 e 字段,此时需要数据应用修改代码。这种因为数据中台的数据变更导致应用需要重新上线的事情,是非常不合理的,不但会增加应用开发额外的工作量,也会拖累数据变更的进度。有了数据服务,就会把数据应用和中台数据进行解耦,当中台数据表结构变更时,我们只需要修改一下数据服务上接口参数和数据字段的映射关系就可以了。不需要再修改代码,重新上线数据应用。