背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程当中踩过的坑和收获。html
[0] - 使用Atlas进行元数据管理之Atlas简介
[1] - 使用Atlas进行元数据管理之Glossary(术语)
[2] - 使用Atlas进行元数据管理之Type(类型)数据库
Atlas容许用户为他们想要管理的元数据对象定义模型。该模型由称为type(类型)
的定义组成。称为entities(实体)
的type(类型)
实例表示受管理的实际元数据对象。 Type System是一个容许用户定义和管理类型和实体的组件。开箱即用的Atlas管理的全部元数据对象(例如Hive表)都使用类型建模并表示为实体。要在Atlas中存储新类型的元数据,须要了解类型系统组件的概念。编程
Atlas中的Type
是对特定类型的元数据对象如何存储和访问的定义。Type表示定义元数据对象属性的一个或一组属性。具备开发基础的用户能了解到,类型就至关于面向对象编程语言的“Class”定义或关系数据库的“table schema”。数组
使用Atlas的类型的其中一个示例是Hive表。 Hive表定义了如下属性:服务器
Name: hive_table TypeCategory: Entity SuperTypes: DataSet Attributes: name: string db: hive_db owner: string createTime: date lastAccessTime: date comment: string retention: int sd: hive_storagedesc partitionKeys: array<hive_column> aliases: array<string> columns: array<hive_column> parameters: map<string,string> viewOriginalText: string viewExpandedText: string tableType: string temporary: boolean
从上面的例子中能够注意到如下几点:编程语言
Atlas中的类型(Type)由name
惟一标识ui
DataSet
的预约义超类型扩展。稍后将提供有关此预约义类型的更多详细信息。Entity
,Struct
,Classification
或Relationship
的类型能够具备属性的集合。每一个属性都有一个名称(例如: name
)和一些其余相关属性。可使用表达式type_name.attribute_name
引用属性。值得注意的是,属性自己是使用Atlas元类型定义的。
属性中的类型引用(如hive_table.db)特别有趣,使用这样的属性,咱们能够定义Atlas中定义的两种类型之间的任意关系,从而构建丰富的模型。此外,还能够将引用列表收集为属性类型(例如,hive_table.columns,表示从hive_table到hive_column类型的引用列表)设计
Atlas中的entity
是type
的特定值或实例,所以表示现实世界中的特定元数据对象。用咱们对面向对象编程语言的类比,实例(instance)
是某个类(Class)
的对象(Object)
。code
实体的其中一个示例就是Hive表。Hive在'default'数据库中有一个名为'customers'的表。该表是hive_table类型的Atlas中的“实体”。因为是实体类型的实例,它将具备做为Hive表'type'的一部分的每一个属性的值,例如:htm
guid: "9ba387dd-fa76-429c-b791-ffc338d3c91f" typeName: "hive_table" status: "ACTIVE" values: name: “customers” db: { "guid": "b42c6cfc-c1e7-42fd-a9e6-890e0adf33bc", "typeName": "hive_db" } owner: “admin” createTime: 1490761686029 updateTime: 1516298102877 comment: null retention: 0 sd: { "guid": "ff58025f-6854-4195-9f75-3a3058dd8dcf", "typeName": "hive_storagedesc" } partitionKeys: null aliases: null columns: [ { "guid": ""65e2204f-6a23-4130-934a-9679af6a211f", "typeName": "hive_column" }, { "guid": ""d726de70-faca-46fb-9c99-cf04f6b579a6", "typeName": "hive_column" }, ...] parameters: { "transient_lastDdlTime": "1466403208"} viewOriginalText: null viewExpandedText: null tableType: “MANAGED_TABLE” temporary: false
从上面的例子中能够注意到如下几点:
有了实体的这个设计,咱们如今能够看到Entity和Struct元类型之间的区别。实体(Entity)和结构(Entity)都构成其余类型的属性。可是,实体类型的实例具备标识(具备GUID值),而且能够从其余实体引用(例如,从hive_table实体引用hive_db实体)。 Struct类型的实例没有本身的标识。 Struct类型的值是在实体自己内“嵌入”的属性集合。
咱们已经看到,属性(attributes)是在实体(Entity),结构(Struct),分类(Classification)和关系(Relationship)等元类型中定义的。但咱们将属性列举为具备名称和元类型值。然而,Atlas中的attributes具备一些properties,这些properties定义了与类型系统相关的更多概念。
attributes具备如下properties:
name: string, typeName: string, isOptional: boolean, isIndexable: boolean, isUnique: boolean, cardinality: enum
上述属性具备如下含义:
name
: 属性的名称dataTypeName
: 属性的元类型名称(native, collection, composite))isComposite
:
isIndexable
isUnique
multiplicity
: 标示该属性是必选(required),可选(optional)的仍是能够是多值的(multi-valued)。若是实体的属性值定义与类型定义中的多重性声明不匹配,则这将违反约束,而且实体添加将失败。所以,该字段可用于定义元数据信息的一些约束。根据上面的内容,让咱们展开下面的hive表的一个attributes的属性定义。让咱们看一下名为'db'的属性,它表示hive表所属的数据库:
db: "name": "db", "typeName": "hive_db", "isOptional": false, "isIndexable": true, "isUnique": false, "cardinality": "SINGLE"
请注意“isOptional = true”约束 - 若是没有db引用,则没法建立表实体。
columns: "name": "columns", "typeName": "array<hive_column>", "isOptional": optional, "isIndexable": true, “isUnique": false, "constraints": [ { "type": "ownedRef" } ]
请注意列的“ownedRef”约束。经过这样,咱们指出定义的列实体应始终绑定到它们所定义的表实体。
经过此描述和示例,您将可以意识到属性定义可用于影响Atlas系统强制执行的特定建模行为(约束,索引等)。
Atlas自带了一些预约义的系统类型。咱们在前面的部分中看到了一个示例(DataSet)。在本节中,咱们将看到更多这些类型并了解它们的重要性。
Referenceable:该类型表示可使用名为qualifiedName的惟一属性搜索的全部实体。
Asset:该类型扩展了Referenceable并添加了名称,描述和全部者等属性。 Name是必需属性(isOptional = false),其余属性是可选的。
Referenceable和Asset的目的是为建模者提供在定义和查询本身类型的实体时强制一致性的方法。拥有这些固定的属性集容许应用程序和用户界面基于约定作出关于默认状况下它们能够指望类型的属性的假设。
Infrastructure:该类型继承自Asset,一般可用做基础结构元数据对象(如集群,主机等)的常见超类型。
DataSet:该类型继承自Referenceable。从概念上讲,它能够用于表示存储数据的类型。在Atlas中,hive表,hbase_tables等都是从DataSet扩展的类型。扩展DataSet的类型能够预期具备Schema,由于它们具备定义该数据集的属性的属性。对于例如hive_table中的columns属性。此外,扩展DataSet的类型实体参与数据转换,Atlas能够经过血缘)图了解到转换过程。
Process:该类型继承自Asset。从概念上讲,它能够用于表示任何数据转换操做。例如,将具备原始数据的配置单元表转换为存储某些聚合的另外一个配置单元表的ETL过程能够是扩展Process类型的特定类型。流程类型有两个特定属性,即输入和输出。输入和输出都是DataSet实体的数组。所以,Process类型的实例可使用这些输入和输出来捕获DataSet的血缘如何演变。