2.4 实现模式
与现有的任务图相对应,元数据目录服务的自动化有三个级别(如图2-5所示)。每个级别对应将目前手工或效率低下的任务组合自动化。
图2-5:元数据目录服务的不同自动化级别
特定源连接器模式
简化连接到不同数据源,并提取与数据相关的元数据信息的过程。
沿袭关联模式
自动提取与源表和目标表相关的转换沿袭。
团队知识模式
简化聚合业务上下文和数据用户之间的知识共享的过程。
元数据目录服务正越来越多地作为数据平台的一部分来实现。流行的开源实现有FINRA的Herd项目(https://oreil.ly/YRXV0)、Uber的Databook项目(https://oreil.ly/VFXXO)、LinkedIn的WhereHows项目(https://oreil.ly/MaSie)和DataHub项目(https://oreil.ly/oDsZg)、Netflix的Metacat项目(https://oreil.ly/js2JN)、Apache的Atlas项目(https://oreil.ly/Ge-1D),以及AWS Glue项目(https://oreil.ly/XbSXS)等云服务项目。
2.4.1 特定源连接器模式
特定源连接器模式从源数据提取元数据,以聚合技术元数据。数据集使用基于URN的命名来识别。这个模式有两个构建模块:
自定义提取器
特定源连接器用于连接和持续获取元数据。自定义提取器需要适当的访问权限,以授权凭据连接到RDBMS、Hive、GitHub等数据存储。对于结构化数据集和半结构化数据集,提取工作需要理解描述数据逻辑结构和语义的模式。一旦提取器连接到源,它就会通过实现分类器收集细节,确定数据集的格式、模式和相关属性。
联合持久性
元数据细节以标准化的方式持久化,各个系统仍然是模式元数据(schema metadata)的事实来源,因此元数据目录在其存储中不会将其具体化。元数据目录只直接存储关于数据集的业务和用户定义的元数据,它还将数据集的所有信息发布到搜索服务中,以供用户发现。
特定源连接器模式的一个示例是LinkedIn的WhereHows项目。特定源连接器用于从源系统收集元数据。例如,对于Hadoop数据集,爬取任务扫描HDFS上的文件夹和文件,读取并聚合元数据,然后将其存储回去。对于Azkaban和Oozie等调度器,连接器使用后端存储库来获取元数据,将其聚合并转换为规范化格式,最后将其加载到WhereHows数据库中。类似的连接器也用于获取Kafka和Samza的元数据。图2-6显示了在Netflix Metacat目录服务中实现的模式的示例。
图2-6:在Netflix Metacat中实现的特定源连接器模式(来自Netflix技术博客(https://oreil.ly/Kov-O))
特定源连接器模式的优点:
- 该模式详尽地聚合了多个系统的元数据,创建了一个单一仓库的抽象。
- 它将特定源的元数据规范化为一种通用格式。
特定源连接器模式的缺点:
- 难以与新的适配器保持同步。
- 在数百万个数据集的极端规模下,连接源并提取数据的事后方法是行不通的。
2.4.2 沿袭关联模式
沿袭关联模式将跨数据和作业的操作元数据组装在一起,并与执行状态结合。通过将作业执行记录与沿袭相结合,该模式可以用来解决一些问题,包括数据时效性、SLA、调整指定表的下游作业、基于使用情况对管道中的表进行排序等。
该模式包括以下三个构建块:
查询解析
通过分析即席查询或按预定的ETL运行的查询,可以完成对数据沿袭的跟踪。查询可以从作业调度器、数据存储日志、流式日志、GitHub存储库等收集。查询解析的输出是输入表和输出表的列表,即由查询读取和写入的表。查询解析不是一次性的活动,而是需要根据查询的更新而不断更新。查询可以用多种语言编写实现,比如Spark、Pig和Hive。
管道关联
一个数据或机器学习管道由多个数据转换作业组成。每个作业由一个或多个脚本组成,每个脚本包括一个或多个查询或执行步骤(如图2-7所示)。通过加入与每个查询关联的输入表和输出表来构建管道沿袭视图。这些信息是从接入框架、调度器、数据存储和查询引擎中特定系统的日志中提取的。
图2-7:在数据或机器学习管道中生成数据转换作业的沿袭
用执行统计丰富沿袭
执行统计(包括完成时间、处理的数据基数、执行中的错误、表的访问频率、表的计数等)都会添加到沿袭视图相应的表和作业中。这样,我们就可以将表和作业异常情况与整个管道的执行情况关联起来。
该模式的一个例子是Apache Atlas,它可以在多个Hadoop生态系统组件(即Sqoop、Hive、Kafka、Storm等)中提取沿袭。给定一个Hadoop作业ID,Atlas从作业历史节点收集作业的配置查询,解析查询以生成源表和目标表。类似的方法也适用于Sqoop作业。除了表级沿袭之外,Atlas还通过跟踪以下依赖类型来支持列级沿袭:
简单依赖
输出列与输入列具有相同的值。
表达式依赖
输出列在运行时由某个表达式(例如,一个Hive SQL表达式)在输入列上进行转换。
脚本依赖
输出列由用户提供的脚本进行转换。
沿袭关联模式的优势在于它提供了一种非侵入的方法来重建依赖关系。缺点是对于查询类型来说,沿袭可能没有100%的覆盖率,而且是近似的。对于每天运行数百个管道并保证性能和质量SLA的部署来说,沿袭关联模式至关重要。
2.4.3 团队知识模式
团队知识模式侧重于数据用户定义的元数据,以丰富与数据集关联的信息。其目标是让数据用户分享经验,并帮助跨团队扩展知识。当数据集没有很好的记录、有多个事实来源、质量参差不齐,以及数据集的大部分数据不再被维护时,该模式尤其有价值。
团队知识有三种主要类型。
数据文档
这种类型包括属性含义、枚举和数据描述的细节。用户可以根据自己的经验使用自由形式的元数据来注释表列。此外,数据集所有者可以用描述注释数据集,以帮助用户找出哪些数据集适合他们(例如,在某些数据集中使用哪些分析技术,以及要注意哪些陷阱)。考虑到不同水平的专业知识,初级团队成员的注释将会在添加到目录之前得到验证。
业务分类和标签
这种类型包括在业务中使用概念作为分类法,根据业务领域和主题领域对数据进行分类。使用业务分类法组织数据集可以帮助数据用户找到感兴趣的主题。为了便于对表的数据生命周期进行管理,可以对表打上标签。数据集审计人员可以对包含敏感信息的数据集进行标记,并提醒数据集所有者或提示审查,以确保数据处理得当。
可插拔式验证
表的所有者可以将关于表的审计信息作为元数据对外提供。他们还可以提供列默认值和验证规则,用于写入表。其中,验证还包括用于开发数据的业务规则。