<audio id="audio" title="04 | 元数据中心的关键目标和技术实现方案" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4e/0a/4e9535d135d900fd575ebd768e30550a.mp3"></audio>

你好，我是郭忆。

在上一节课程中，我从宏观的角度，系统性地带你了解了数据中台建设的方法论、支撑技术和组织架构，从这节课开始，我们正式进入实现篇，我会从微观的角度出发，带你具体分析数据中台的支撑技术，以电商场景为例，分别讲解元数据中心、指标管理、模型设计、数据质量等技术如何在企业落地。

这节课，咱们来聊聊元数据。

为什么要先讲元数据呢？我来举个例子。在原理篇中，我提到数据中台的构建，需要确保全局指标的业务口径一致，要把原先口径不一致的、重复的指标进行梳理，整合成一个统一的指标字典。而这项工作的前提，是要搞清楚这些指标的业务口径、数据来源和计算逻辑。而这些数据呢都是元数据。

你可以认为，如果没有这些元数据，就没法去梳理指标，更谈不上构建一个统一的指标体系。当你看到一个数700W，如果你不知道这个数对应的指标是每日日活，就没办法理解这个数据的业务含义，也就无法去整合这些数据。**所以你必须要掌握元数据的管理，才能构建一个数据中台。**

那么问题来了：元数据中心应该包括哪些元数据呢？ 什么样的数据是元数据？

## 元数据包括哪些？

结合我的实践经验，我把元数据划为三类：数据字典、数据血缘和数据特征。我们还是通过一个例子来理解这三类元数据。

<img src="https://static001.geekbang.org/resource/image/47/db/4792edac4ec5eefdbf5f2e71f404b0db.jpg" alt="">

在这个图中，dwd_trd_order_df 是一张订单交易明细数据，任务flow_dws_trd_sku_1d 读取这张表，按照sku粒度，计算每日sku的交易金额和订单数量，输出轻度汇总表dws_trd_sku_1d。

数据字典描述的是数据的结构信息，我们以dws_trd_sku_1d为例，数据字典包括：

<img src="https://static001.geekbang.org/resource/image/70/b6/706050b3ef2c71001ecd94158efe55b6.jpg" alt="">

数据血缘是指一个表是直接通过哪些表加工而来，在上面的例子中，dws_trd_sku_1d是通过dwd_trd_order_df的数据计算而来，所以，dwd_trd_order_df是dws_trd_sku_1d的上游表。

数据血缘一般会帮我们做影响分析和故障溯源。比如说有一天，你的老板看到某个指标的数据违反常识，让你去排查这个指标计算是否正确，你首先需要找到这个指标所在的表，然后顺着这个表的上游表逐个去排查校验数据，才能找到异常数据的根源。

而数据特征主要是指数据的属性信息，我们以dws_trd_sku_1d为例：

<img src="https://static001.geekbang.org/resource/image/d5/1b/d5303f16e5a969f039080e413d26201b.jpg" alt="">

通过这个例子，你了解了元数据了吗？ 不过元数据的种类非常多，为了管理这些元数据，你必须要构建一个元数据中心。那么接下来，我们就来看看如何搭建一个元数据中心，打通企业的元数据。

## 业界元数据中心产品

我做系统设计这么些年，一直有一个习惯，是先看看业界的产品都是怎么设计的，避免关门造车。业界的比较有影响力的产品：

- 开源的有Netflix的Metacat、Apache Atlas；
- 商业化的产品有Cloudera Navigator。

我今天重点想带你了解Metacat和Atlas这两款产品，一个擅长于管理数据字典，一个擅长于管理数据血缘，通过了解这两款产品，你更能深入的理解元数据中心应该如何设计。

### Metacat 多数据源集成型架构设计

关于[Metacat](https://github.com/Netflix/metacat)，你可以在GitHub上找到相关介绍，所以关于这个项目的背景和功能特性，我就不再多讲，我只想强调一个点，就是它多数据源的可扩展架构设计，因为这个点对于数据字典的管理，真的太重要！

<img src="https://static001.geekbang.org/resource/image/ca/3f/ca1fd21c2109b921c680008469dd663f.jpg" alt="">

在一般的公司中，数据源类型非常多是很常见的现象，包括Hive、MySQL、Oracle、Greenplum等等。支持不同数据源，建立一个可扩展的、统一的元数据层是非常重要的，否则你的元数据是缺失的。

从上面Metacat的架构图中，你可以看到，Metacat的设计非常巧妙，它并没有单独再保存一份元数据，而是采取直连数据源拉的方式，一方面它不存在保存两份元数据一致性的问题，另一方面，这种架构设计很轻量化，每个数据源只要实现一个连接实现类即可，扩展成本很低，我把这种设计叫做集成型设计。我认为这种设计方式对于希望构建元数据中心的企业，是非常有借鉴意义的。

### Apache Atlas 实时数据血缘采集

同样，关于[Apache Atlas](http://atlas.apache.org/)的背景和功能，我也不多说，只是想强调Atlas 实时数据血缘采集的架构设计，因为它为解决血缘采集的准确性和时效性难题提供了很多的解决思路。

血缘采集，一般可以通过三种方式：

- 通过静态解析SQL，获得输入表和输出表；
- 通过实时抓取正在执行的SQL，解析执行计划，获取输入表和输出表；
- 通过任务日志解析的方式，获取执行后的SQL 输入表和输出表。

第一种方式，面临准确性的问题，因为任务没有执行，这个SQL对不对都是一个问题。第三种方式，血缘虽然是执行后产生的，可以确保是准确的，但是时效性比较差，通常要分析大量的任务日志数据。所以第二种方式，我认为是比较理想的实现方式，而Atlas 就是这种实现。

<img src="https://static001.geekbang.org/resource/image/b9/8c/b96e93b2ea7548fbd8bcb15eab93988c.jpg" alt="">

对于Hive 计算引擎，Atlas 通过Hook方式，实时地捕捉任务执行计划，获取输入表和输出表，推送给Kafka，由一个Ingest 模块负责将血缘写入JanusGraph图数据库中。然后通过API的方式，基于图查询引擎，获取血缘关系。对于Spark，Atlas 提供了Listener的实现方式，此外Sqoop、Flink 也有对应的实现方式。

这两款产品在设计网易元数据中心时，给了很多灵感，下面我就带你了解一下网易元数据中心的设计，以便你掌握一个元数据中心在设计时应该考虑哪些点。

## 网易元数据中心设计

在设计网易元数据中心之初，我设定了元数据中心必须实现的5个关键目标：

**其一，多业务线、多租户支持。**

在网易，电商、音乐都是不同的业务线，同一个业务线内，也分为算法、数仓、风控等多个租户，所以元数据中心必须支持多业务线、多租户。

**其二，多数据源的支持。**

元数据中心必须要能够支持不同类型的数据源（比如MySQL、Hive、Kudu等），同时还要支持相同数据源的多个集群。为了规范化管理，还需要考虑将半结构化的KV也纳入元数据中心的管理（比如Kafka、Redis、HBase等）。这些系统本身并没有表结构元数据，所以需要能够在元数据中心里定义Kafka每个Topic的每条记录JSON中的格式，每个字段代表什么含义。

**其三，数据血缘。**

元数据中心需要支持数据血缘的实时采集和高性能的查询。同时，还必须支持字段级别的血缘。

什么是字段级别的血缘，我们来举个例子。

> 
<p>insert overwrite table t2 select classid, count(userid) from t1 group<br>
by classid;</p>


t2表是由t1表的数据计算来的，所以t2和t1是表血缘上下游关系，t2的classid字段是由t1的classid字段产生的，count字段是由userid经过按照classid字段聚合计算得到的，所以t2表的classid与t1的classid存在字段血缘，t2表的count分别与t1表的classid和userid存在血缘关系。

<img src="https://static001.geekbang.org/resource/image/10/31/10215ac91d081d84a53ee72deb1fad31.jpg" alt="">

字段血缘在做溯源的时候非常有用，因为大数据加工链路的下游是集市层，为了方便使用者使用，一般都是一些很宽的表（列很多的表，避免Join带来的性能损耗），这个表的上游可能是有几十个表产生的，如果不通过字段血缘限定溯源范围，就会导致搜索范围变得很大，无法快速地精准定位到有问题的表。

另外，数据血缘还必须要支持生命周期管理，已经下线的任务应该立即清理血缘，血缘要保留一段时间，如果没有继续被调度，过期的血缘关系应该予以清理。

**其四，与大数据平台集成。**

元数据中心需要与Ranger集成，实现基于tag 的权限管理方式。在元数据中心中可以为表定义一组标签，Ranger可以基于这个标签，对拥有某一个标签的一组表按照相同的权限授权。这种方式大幅提高了权限管理的效率。比如，对于会员、交易、毛利、成本，可以设定表的敏感等级，然后根据敏感等级，设定不同的人有权限查看。

另外，元数据中心作为基础元数据服务，包括自助取数分析系统，数据传输系统，数据服务，都应该基于元数据中心提供的统一接口获取元数据。

**其五，数据标签。**

元数据中心必须要支持对表和表中的字段打标签，通过丰富的不同类型的标签，可以完善数据中台数据的特征，比如指标可以作为一种类型的标签打在表上，主题域、分层信息都可以作为不同类型的标签关联到表。

基于这5个因素的考虑，我们设计了网易元数据中心。

<img src="https://static001.geekbang.org/resource/image/d5/f4/d590abca0d8f54d19fa413696dfd97f4.jpg" alt="" title="网易元数据中心系统架构设计图">

这个图按照功能模块分为数据血缘、数据字典和数据特征。

数据血缘由采集端、消息中间件、消费端以及血缘清理模块组成，基于Hive Hook，Spark Listener，Flink Hook ，可以获取任务执行时输入表和输出表，推送给统一的消息中间件（Kafka），然后消费端负责将血缘关系沉淀到图数据库中。

图数据库选择Neo4j，主要考虑是性能快、部署轻量化、依赖模块少，当然，开源的Neo4j没有高可用方案，并且不支持水平扩展，但是因为单个业务活跃的表规模基本也就在几万的规模，所以单机也够用，高可用可以通过双写的方式实现。

血缘还有一个清理的模块，主要负责定时清理过期的血缘，一般我们把血缘的生命周期设置为7天。

数据字典部分，我们参考了Metacat实现，我们由一个统一的Connector Mananger负责管理到各个数据源的连接。对于Hive、MySQL，元数据中心并不会保存系统元数据，而是直接连数据源实时获取。对于Kafka、HBase、Redis等KV，我们在元数据中心里内置了一个元数据管理模块，可以在这个模块中定义Value的schema信息。

数据特征主要是标签的管理以及数据的访问热度信息。元数据中心内置了不同类型的标签，同时允许用户自定义扩展标签类型。指标、分层信息、主题域信息都是以标签的形式存储在元数据中心的系统库里，同时元数据中心允许用户基于标签类型和标签搜索表和字段。

元数据中心统一对外提供了API访问接口，数据传输、数据地图、数据服务等其他的子系统都可以通过API接口获取元数据。另外Ranger 可以基于元数据中心提供的API接口，获取标签对应的表，然后根据标签更新表对应的权限，实现基于标签的权限控制。

元数据中心构建好以后，你肯定会问，这个元数据中心没有界面吗？它长什么样子？用户咋使用这个元数据中心？ 别急，我们接着往下看。

## 数据地图：元数据中心的界面

数据地图是基于元数据中心构建的一站式企业数据资产目录，可以看作是元数据中心的界面。数据开发、分析师、数据运营、算法工程师可以在数据地图上完成数据的检索，解决了“不知道有哪些数据？”“到哪里找数据？”“如何准确的理解数据”的难题。

<img src="https://static001.geekbang.org/resource/image/7b/8c/7b0bb4f2555d4610a05b91c86416888c.png" alt="">

数据地图提供了多维度的检索功能，使用者可以按照表名、列名、注释、主题域、分层、指标进行检索，结果按照匹配相关度进行排序。考虑到数据中台中有一些表是数仓维护的表，有一些表数仓已经不再维护，在结果排序的时候，增加了数仓维护的表优先展示的规则。同时数据地图还提供了按照主题域、业务过程导览，可以帮助使用者快速了解当前有哪些表可以使用。

<img src="https://static001.geekbang.org/resource/image/a3/35/a315fc502a4f94ac3b77947d38de7535.jpg" alt="">

当使用者定位到某一个表打开时，会进入详情页，详情页中会展示表的基础信息，字段信息、分区信息、产出信息以及数据血缘。数据血缘可以帮助使用者了解这个表的来源和去向，这个表可能影响的下游应用和报表，这个表的数据来源。

<img src="https://static001.geekbang.org/resource/image/17/ba/17516d5fb201cffc9d69f32e98993bba.png" alt="">

数据地图同时还提供了数据预览的功能，考虑到安全性因素，只允许预览10条数据，用于判断数据是否符合使用者的预期。数据地图提供的收藏功能， 方便使用者快速找到自己经常使用的表。当数据开发、分析师、数据运营找到自己需要的表时，在数据地图上可以直接发起申请对该表的权限申请。

数据地图对于提高数据发现的效率，实现非技术人员自助取数有重要作用。经过我的实践，数据地图是数据中台中使用频率最高的一个工具产品，在网易，每天都有500以上人在使用数据地图查找数据。

## 课程总结

本节课，我以元数据作为起点，带你了解了元数据应该包括数据字典、数据血缘和数据特征，然后通过分析两个业界比较有影响力的元数据中心产品，结合我在网易数据中台实践，给出了元数据中心设计的5个关键特性和技术实现架构，最后介绍了基于元数据中心之上的数据地图产品。我想在最后强调几个关键点：

- 元数据中心设计上必须注意扩展性，能够支持多个数据源，所以宜采用集成型的设计方式。
- 数据血缘需要支持字段级别的血缘，否则会影响溯源的范围和准确性。
- 数据地图提供了一站式的数据发现服务，解决了检索数据，理解数据的“找数据的需求”。

最后，你要知道，元数据中心是数据中台的基石，它提供了我们做数据治理的必须的数据支撑，在后续的章节中，我们将逐一介绍指标、模型、质量、成本、安全等的治理，这些都离不开元数据中心的支撑。

<img src="https://static001.geekbang.org/resource/image/06/63/069ede4c461619307896563cbf681063.jpg" alt="">

## 课程思考

在课程中，我介绍了血缘采集的三种方式，并且推荐了通过实时采集的方式，但是其实静态解析血缘也有它的优势应用场景，你能想到有哪些么？欢迎在留言区与我讨论。

最后，感谢你的阅读，如果这篇文章让你有所收获，也欢迎你将它分享给更多的朋友。
