元数据管理架构功能:支持多业务线,支持多租户,支持多种数据源,有数据血缘功能,数据标签功能,与数据中台集成等。
元数据中心统一对外提供了 API 访问接口,数据传输、数据地图、数据服务等其他的子系统都可以通过API 接口获取元数据。另外 Ranger 可以基于元数据中心提供的 API 接口,获取标签对应的表,然后根据标签更新表对应的权限,实现基于标签的权限控制。
1.元数据采集和存储在数据处理的每一步中,我们必须获取相应的元数据,并将这些元数据集中存储在关系型数据库中,便于后续查询和管理。元数据是理解和使用数据的根据,它的完整性和正确性是整个大数据分析系统的基本条件。元数据采集必须能够适应异构环境,支持从传统关系型数据库和大数据平台中采集数据产生系统、数据加工处理系统和数据应用报表系统的全量元数据,包括过程中的数据实体(系统、库、表、字段的描述)以及数据实体加工处理过程中的逻辑。同时,元数据管理系统必须支持人工输入,允许人工的增、删、改、查及发布。
2.数据血缘通过Spark/Hive/Flink本身提供的Listener/Hook机制,解析调度依赖中的FROM、CREATE、INSERT等语句,获取输入节点与输出节点,生成血缘关系,就可以解析除SQL之外的其他语法。
在明确了实现方式后,就要考虑计划执行时机了。执行时机主要有3个。
(1)在运行前通过解析静态的SQL,获取依赖的输入节点与输出节点。
(2)在运行中实时截取动态的SQL,获取依赖的输入节点与输出节点。
(3)在运行后通过解析任务日志,获取依赖的输入节点与输出节点。
在这3个时机中,时机(1)因为没有执行代码,所以无法保证可以正常运行,时机(3)则比较后置,没有时效性,所以最合适的是时机(2),在运行中解析SQL,能够实时获取输入与输出表,并且当依赖关系改变时也能实时变更。但是时机(2)也有一个缺点,那就是当数据表开发完成但还没有被执行时,就无法获取血缘关系,这时就需要通过解析静态SQL的方式,建立跟其他表的依赖关系。
Apache Atlas就是采用(2)方式实现,其架构图如下:
对于 Hive 计算引擎,Atlas 通过 Hook 方式,实时地捕捉任务执行计划,获取输入表和输出表,推送给Kafka,由一个 Ingest 模块负责将血缘写入 JanusGraph 图数据库中。然后通过 API 的方式,基于图查询引擎,获取血缘关系。对于 Spark,Atlas 提供了 Listener 的实现方式。
对于数据血缘的实现,可以简要概述为:首先,通过Spark Listener/HiveHook/Flink Hook,解析调度依赖中的FROM、CREATE、INSERT等语句获取输入节点与输出节点,生成血缘关系并推送给消息中间件(Kafka);其次,消费端负责将血缘关系沉淀到图形数据库(Neo4j)中;最后,通过图计算引擎在前端以图形的方式将其展示出来。
3.数据字典在实际的场景中,公司普遍存在大量多源异构的数据,其数据源包括Hive、MySQL、Oracle、Greenplum等。支持不同数据源,建立一个可扩展的、统一的元数据层非常重要的,否则公司的元数据是缺失的。所以构建数据字典是很重要的,开源的Metacat 擅长管理数据字典,可以参考Metacat的架构构建公司的数据字典。
Metacat最大的优势:多数据源的可扩展架构:
从上面Metacat的架构图中,可以看到:Metacat的设计非常巧妙,它并没有单独再保存一份元数据,而是采取直连数据源拉取的方式。一方面,它不存在保存两份元数据一致性的问题;另一方面,这种架构设计很轻量化,每个数据源只要实现一个连接实现类即可,扩展成本很低。
4.数据地图数据地图是基于所有元数据搭建起来的数据资产列表,可以将数据地图看作将所有元数据进行可视化呈现的系统。数据地图是基于元数据中心构建的一站式企业数据资产目录,可以看作是元数据中心的界面。数据开发、分析师、数据运营、算法工程师可以在数据地图上完成数据的检索,解决了“不知道有哪些数据?”“到哪里找数据?”“如何准确的理解数据”的难题。
数据地图最核心的功能有两个:元数据信息的展示、血缘关系。