09 | 数据服务到底解决了什么问题?

你好,我是郭忆。

从04讲元数据中心开始,到08讲成本治理,我已经把元数据以及在它基础上的五大应用场景:数据发现(数据地图)、指标管理、模型设计、数据质量、成本优化,全部讲完了。这部分内容对应的就是数据中台OneData 方法论。相信学完这部分内容之后,你已经了解了OneData方法论在企业内部落地的方法了。

而这节课我要和你聊的,是数据中台另外一个核心方法论,OneService的实现:数据服务。

服务化在业务系统中提的比较多,它是业务系统化繁为简,实现业务拆分的必经之路(特别是这几年微服务的概念深入人心)。那对于数据中台,服务化意味着什么呢?数据服务到底解决了什么问题? 我相信很多人会有这样的疑问。

服务化:不同系统之间通过服务方式交互,服务通常以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接口访问数据,大幅度提高了数据应用的研发效率。

当然了,数据接入效率低,除了跟对接不同的中间存储有关,还因为数据和接口不能复用。这又是怎么回事呢?

数据和接口没有办法复用

我们还是举个例子。

在上图中,当我们开发“数据应用-经营分析”时,数据开发会基于a表加工c表,然后数据应用开发会把a和b的数据导出到“数据应用-经营分析的数据库db1”中,然后开发经营分析的服务端代码,通过接口1对web提供服务。

当我们又接到任务开发“数据应用-毛利分析”时,我们同样需要用到b表的数据,虽然b的数据已经存在于db1中,但db1是“数据应用-经营分析”的数据库,无法共享给“数据应用-毛利分析”(因为不同应用之间共享数据库,会存在相互影响)。

同时,经营分析的服务端接口也无法直接给毛利分析用,因为接口归属在经营分析应用中,已经根据应用需求高度定制化。

所以我们看到这样的现象:即使数据重复,不同数据应用之间,在中间存储和服务端接口上,也是无法复用的。这种烟囱式的开发模式,导致了数据应用的研发效率非常低。

而数据服务,使数据中台暴露的不再是数据,而是接口,接口不再归属于某个数据应用,而是在统一的数据服务上。这就使接口可以在不同的数据应用之间共享,同时因为数据服务具备限流的功能,使接口背后的数据共享成为可能,解决了不同应用共享数据相互影响的问题。

那么当数据应用上线之后,我们就进入了运维阶段,如果这个阶段没有数据服务的话,会出现什么问题呢?

不知道数据被哪些应用访问

来看一个我身边的案例。

张好看(化名)是一名数据开发,某一天的凌晨,她突然接到了一堆电话报警:有大量的任务出现异常(对应上图中红色表的产出任务)。经过紧张的定位后,她确认问题来源于业务系统的源数据库,也就是说,因为一次数据库的表结构变更,导致数据中台中,原始数据清洗出现异常,从而影响了下游的多个任务。

这时,摆在她面前的,是一堆需要恢复重跑的任务。可是队列资源有限,到底先恢复哪一个呢? 哪个任务最终会影响到老板第二天要看的报表呢?

虽然数据血缘建立了表与表之间的链路关系,但是在表的末端,我们却不知道这个表被哪些应用访问,所以应用到表的链路关系是断的。当某个任务异常时,我们无法快速判断出这个任务影响了哪些数据应用,从而也无法根据影响范围决定恢复的优先级,最终可能导致重要的报表没有恢复,不重要的报表却被优先恢复了。

同样,在成本治理中,我也提到,因为没有应用和数据的链路关系,我们不敢贸然下线数据。

而数据服务打通了数据和应用的访问链路,建立了从数据应用到数据中台数据的全链路数据血缘关系,这就等于我们在迷宫中拿到了一个地图,当任何一个任务出现问题,我们都可以顺着地图,找到这个故障影响了哪些应用,从而针对重要应用加速恢复速度。同样,我们也可以放心的下线数据中台中任意一张表。

除了不知道数据被哪些下游应用使用,在运维阶段,我们还经常面临着数据表频繁重构,而这也许是数据应用开发最可怕的噩梦了。

数据部门字段变更导致应用变更

数据中台底层模型的字段变更是比较频繁的一个事情,因为本身汇总层的模型也在随着需求不断优化。

“数据应用-经营分析”使用了数据中台的ads_mamager_1d这张表的c字段,如果我们对这张表进行了重构,访问字段需要替换成e字段,此时需要数据应用修改代码。这种因为数据中台的数据变更导致应用需要重新上线的事情,是非常不合理的,不但会增加应用开发额外的工作量,也会拖累数据变更的进度。

有了数据服务,就会把数据应用和中台数据进行解耦,当中台数据表结构变更时,我们只需要修改一下数据服务上接口参数和数据字段的映射关系就可以了。不需要再修改代码,重新上线数据应用。

课堂总结

你看,我列举了在数据接入和运维过程中,遇到的4个典型的问题,也为你简要分析了数据服务为什么能够帮我们解决这些问题。而这些问题会让数据应用使用中台数据效率低下,同时也带来了中台数据维护的烦恼。

今天这部分内容,是下一讲的基础,下一讲我会和你聊一聊数据服务具备哪些功能,如果你正准备设计一个数据服务,或者正在做数据服务的产品选型,那你一定要留意这部分内容。最后,我会提供给你一个网易数据服务的实现方案,告诉你在数据服务实现上的几个关键设计。

在最后,我通过一个脑图,总结一下今天的内容。

思考时间

其实,在我刚接触数据服务的时候,我听到最多的一种说法,数据服务解决了数据的安全性的问题,你觉得有道理吗? 欢迎你在留言区与我互动。

最后,感谢你的阅读,如果这一节课让你有所收获,也欢迎你将它分享给更多的朋友,我们下一讲见。

精选留言

  • 发现新大陆

    2020-04-22 20:49:09

    oneservice建设过程中,数据使用方常常希望还是直接访问表,认为自身需求的多变中台无法快速适应,怎么办?在基本数据需求定义标准API的基础上,能否开放一个通用servcice,允许使用方传入SQL,支持多变的临时性需求,采用这种方式是否可行,会有什么问题・_・?
    作者回复

    你好,首先,数据服务的API接口可以让用户自己定义,如果还是没办法满足,可以考虑通过数据服务放开SQL接口接入,但是必须要由数据服务代理。否则,你没办法获取到链路关系。另外,尽量不要放开SQL,不好管理。至少也要经过审批。

    感谢你的阅读~

    2020-04-29 19:48:33

  • 高圣

    2020-05-17 21:38:21

    你好,全链路的数据血缘是怎么做到的?因为数据表的血缘可以做到,但是数据服务或者数据应用这部分怎么和表级血缘关联呢?有什么工具实现吗?
    作者回复

    HI,你好,高圣,

    数据服务化,其中之一就是解决你说的这个问题的,打通数据和应用之间的访问链路。数据服务,在定义API接口时,必然会定义每个接口访问的数据中台的表(如果是数据中台抽取到中间存储,然后由中间存储对外提供API接口查询,数据服务也可以关联到中台的表),在接口授权给某个数据应用时,数据应用和数据中台表之间的链路关系就建立了,然后由数据服务把链路关系推送给元数据中心,最终沉淀到元数据中心中。

    数据服务和数据报表,在元数据中心的存储,是以标签的形式存储的,这么做的好处,是方便,我们在查询一个表影响了哪些下游的接口或者报表时,查询起来非常快,因为不仅是数据服务直接访问的表会打上数据应用的标签,整个表的上游链路中所有涉及的表都会打,这样当任何一个表的数据出现问题,我们都能以O(1)的时间复杂度,给出这个表的下游影响应用和报表,非常的高效。

    感谢你的提问~希望我的答案已经解决了你的问题,也欢迎你在数据中台实践中,任何问题与我分享和交流~祝好~

    2020-05-25 19:49:40

  • cristal

    2020-06-14 07:00:57

    郭老师好,写的真棒,有个问题想咨询下,大数据数仓中每一层的任务你们是怎么调度的?对于依赖,是需要结合元数据管理中的数据血緣,还是说我们手动的配置依赖?谢谢
    作者回复

    你好~ 首先感谢你的认可,我来回答一下你的问题。

    数据中台中,每一层的任务,都是基于任务调度系统调度的,网易的调度系统是基于Azkaban 二次开发。调度系统解决的核心问题是复杂的任务依赖和定时的任务执行,至于任务依赖,我们是数据开发在提交任务上线时人工配置的,但是系统会根据数据血缘,自动的推荐他建立到哪个任务的依赖关系。

    同时,我们也提供了任务治理的功能,系统会自动检测,有数据依赖,但是没有任务依赖的任务,然后推荐给任务对应的数据开发,由数据开发建立任务依赖关系。

    由系统直接根据数据血缘,建立任务依赖,这个对数据开发不太受控制,不够灵活。最佳的实现方式,还是自动推荐依赖任务,由开发来决定要不要建依赖。

    希望我的答案可以帮助到你~

    2020-06-15 19:44:48

  • JohnT3e

    2020-04-22 07:53:52

    数据服务可以通过鉴权和数据分级分类实现数据访问时的安全控制。但数据接入,存储,备份恢复,乃至治理过程中的安全则需要其它方面的技术配合。比如加密传输,透明加密存储,集群访问认证控制,数据脱敏,开发环境和线上环境分离等
    作者回复

    你好,其实我提这个问题,想说的是,数据服务重点还是数据接入效率提高和数据接入后数据的管理效率提升。数据安全,其实还是通过权限控制的。

    感谢你的提问,下一次见~

    2020-04-29 19:34:56

  • 吴科🍀

    2020-04-22 08:18:32

    统一的数据服务,可以统一管理数据的权限,规范统一的数据格式,对外暴露的是服务接口,应用层不关心底层是MySQL还是oracle。
    我们也存在多份数据保存在不同的存储中的问题,某张宽表,在clickhouse,gp都保存了一份,不同的系统在用。业务场景不一样,不好统一。
    期待老师后面的课程。
    作者回复

    你好,你说的数据服务的作用都是对的。

    如果业务场景不一样,数据也可以存在不同的中间存储上,为了保证性能和查询的场景,比如ck对于多表join支持不好,gp可以满足,但是ck性能比较强。这个也是灵活掌握。

    感谢你的提问~

    2020-04-29 19:33:56

  • jerry guo

    2021-11-01 10:15:02

    对于一些小批量的数据,API返回没问题。
    如何做到大批量的数据返回呢?
  • 你好

    2020-05-01 16:16:58

    “而数据服务打通了数据和应用的访问链路,建立了从数据应用到数据中台数据的全链路数据血缘关系,这就等于我们在迷宫中拿到了一个地图“

    没看懂,数据服务和打通地图有什么关系,老师能再给阐述下吗?谢谢
    作者回复

    你好,数据服务,打通了数据应用和数据中台数据的链路关系,也就是说,原先,一个数据中台某个表数据有问题,我都不知道影响了那个数据应用。现在,基于全链路数据血缘,再加上数据服务,我可以推断出一个表影响了哪些下游的数据应用。

    这就好比你有了一个全局的视角,在一个迷宫中,可以知道每一条路到哪个终点。像一个地图一样。



    2020-05-09 16:47:54

  • leslie

    2020-04-22 16:23:54

    记得去年GOPS大会就有过2场关于安全的议题,特意去听过;其实目前安全这个词已经敏感的渗透的到各个环节。记得道哥曾经有过一句话“如果云计算还剩下最后一个属性,那就是安全”。
    数据服务并不是解决了数据的安全,数据的安全不仅仅是考服务就能解决的;它对于上下的依赖其实很明显,我们可以去看到云计算目前的框架就可以看到现在都是称为数据存储,一旦问题到数据服务了-说明已经到了接近最后一层了。
    谢谢今天的分享,期待后续课程。
    作者回复

    你好, 其实我提这个问题,就是为了让大家搞清楚,数据服务,并不是为了解决数据安全的问题。有的人可能会说,你可以在数据服务上,去控制,不让用户访问原始数据,或者明细数据,但是这个通过数据权限也可以完全做的到。所以我觉得,解决安全问题的,你可以说数据权限。但是数据服务不是,数据服务主要还是为了解决数据接入效率和接入后的管理效率引入的。

    感谢你的提问,欢迎继续与我在留言区交流。

    2020-04-29 19:27:14

  • Geek_52e718

    2020-08-09 15:22:14

    “而数据服务,使数据中台暴露的不再是数据,而是接口,接口不再归属于某个数据应用,而是在统一的数据服务上。这就使接口可以在不同的数据应用之间共享,同时因为数据服务具备限流的功能,使接口背后的数据共享成为可能,解决了不同应用共享数据相互影响的问题。”
    这里的接口共享我知道,但是接口共享的时候会把某些上层 应用不需要的数据给提供过去了,而且我们的接口都是通过参数调用的,不是全数据推送的;“限流的功能”指的就是字段控制吗?具体是怎么做到的呢?谢谢老师
  • easy-cloud

    2022-05-22 16:56:22

    当需要的数据量比较大时,这个时候数据服务该如何处理呀?
  • 付俊

    2022-03-15 08:49:41

    我有个问题想问一下,目前公司的大数据平台用HIVE进行存储,并且用HIVE执行查询,由于HIVE查询效率比较低,有没有提高HIVE查询效率的方法?还是一定要改成MySQL数据库提高效率。
  • 尤里卡

    2021-12-12 08:28:28

    数据使用场景除了API,还有报表和灵活查询,不知道数据服务(中台)可以提供什么管理方案
  • fish

    2021-05-17 18:42:57

    有道理,可以在数据接口层添加权限控制,在原来的数据的基础上多了一层保护,不清楚理解是否对
  • 罗霄

    2021-01-14 14:38:03

    某些场景下需要数据服务提供的是基于离线数据的实时数据怎么办,比如有一个实时信任设备场景。
    离线:历史常用的设备属于信任设备
    实时:用户进行手机号验证属于信任设备
    如果需要查询用户当前设备是否是信任设备需要实时和离线数据进行整合,但是离线数据每日ETL到HBASE又很费时间,这中间数据处于不可用
  • 白刚

    2020-10-24 18:33:07

    数据服务是中台不可缺少的一部分
  • 唯。💍👑🍭

    2020-09-28 17:56:07

    我们目前使用sql通过数据服务访问数据,请问下这个会带来哪些问题,虽然灵活,但是总感觉不可控,有好的方式解决吗,目前我们sql可以查询多种数据源
  • lign

    2020-07-27 19:23:51

    老师,元数据中心中数据字典里的表与模型设计里的模型是否有对应关系?数据发现里是用数据字典的表还是模型设计里的模型数据?
  • Aaron

    2020-06-28 08:04:55

    我觉得数据安全主要还是通过权限来控制,虽然数据服务打通了表与数据应用的链路,很清晰的知道有哪些应用在使用数据,但这不是控制数据安全的根本。
    作者回复

    对的~

    2020-07-20 20:48:46

  • 没什么大不了

    2020-06-19 08:38:17

    我理解数据服务其实就是我理解数据服务就是数据中台的数据与数据应用层的隔离层,数据中台表的结构或者是逻辑的变更,对数据应用层没有直接的感知的,不影响原先数据应用调用数据服务接口内容,另外通过数据服务层,可以追溯到数据中台表的下游任务,当数据中台表出问题后方便定位有哪些下游受影响
  • 手心里的阳光

    2020-04-24 08:00:47

    赞,一直想请教一下,最后总结是用的什么工具呢?
    作者回复

    你好,感谢你的认可。

    你说的是课堂总结中的脑图么? 这个我是在xmind上完成的,不过编辑是基于我提供的xmind,重新画的。

    感谢你的阅读~

    2020-04-25 23:25:50