元数据管理可分为如下5个流程步骤:元模型定义、元数据采集、元数据加工、元数据存储、元数据应用。其中,元模型定义是整个元数据管理的前提和规范,用于定义可管理的元数据范式。元数据采集是元数据来源的重要途径,提供可管理的元数据原料,而如何进行可扩展且高效的元数据采集也是元数据管理的难点之一。本文将主要针对元模型定义、元数据采集两个模块进行详细说明。
元模型是元数据标准的M2层,是对元数据M1层的抽象。更多详情可参考《数据资产管理体系与标准》。
例如:一个Hive库表user.student,字段有id, name, age,各层级对应的样例数据是:
Hive Metastore 的元模型定义如下所示,一个库表即代表一个元模型,其中有颜色的库表是核心元模型:
元模型的抽象可以为元数据管理带来灵活性,但会引入系统复杂性和高维护成本。因此元模型并不是越灵活越好,在元模型设计时,需考虑使用场景决策元模型的管理。为满足使用场景和兼容系统简易性,我们限制元模型自定义管理,只抽象了两种固定的元模型:
备注:如果需考虑文件元数据等场景,需要对元模型扩展。对于复杂元模型的定义、元元模型管理可参考Apache Altas类型系统的实现,更多详情可参考《业界元数据管理:方案设计概览》
元数据采集是获取元数据的重要途径之一,通过对不同调度任务的封装,元数据采集可分为两种类型:
元数据采集系统的整体架构如图所示,为保证扩展和通用性,具备多维度的异构适配:
元数据推断(InferSchema):也称为元数据发现,主要在数据湖场景使用,用于schema推断。对于已存储的数据文件,识别文件信息,自动发现并加载Schema元数据,便于用户一键迁移的数据湖分析场景,如DLC数据湖计算。
元数据推断通过读取并解析存储系统(HDFS、COS等)的数据文件,自动识别和推断该数据文件对应的Schema信息(字段及字段属性),主要考虑因素如下:
最简单的实现可直接复用spark inferSchema能力,对于特定业务需求再进行对应改造:
val people = spark.read.format("csv")
.option("sep", ";")
.option("inferSchema", "true")
.option("header", "true")
.load("cos://examples/src/main/resources/people.csv")
val schema = people.schema;
元数据Crawler,即为通用的元数据采集,一般有两种采集方式:PULL、PUSH,为减少对数据源的侵入性,建议优先采用PULL方式。
社区开源组件的采集实现方式整理如下:
组件 | 方式 | 实现 |
---|---|---|
Apache Atlas | PUSH | 自定义Hive Hook上报Kafka,需适配不同Hive版本 |
Lyft Amundsen | PULL | Python采集脚本,连接HMS的元数据库 |
Linkedin Datahub | PULL | Python ORM框架是SQLAlchemy |
Schemacrawler | PULL | JDBC适配器获取不同JDBC数据源的元数据(仅支持JDBC数据源) |
元数据Crawler实现逻辑:定义采集对外提供的接口定义,其实现主要分为JDBC采集、非JDBC采集两类。
特别的,元数据Crawler的底层实现逻辑除了支持离线采集外,也可提供即时的数据目录功能。如图所示,可分别设计两个服务:
本文提供了元模型定义、元数据采集的一些思路和设计方向。在实践中,由于统一元数据管理与具体业务场景密切相关,该架构方案虽然无法直接套用,但也可以作为方案设计时的考量因素。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。