类型系统
概述
Atlas 允许用户为他们想要管理的元数据对象定义一个模型。该模型由称为「类型(type)」的定义组成,而这些类型的实例称为「实体(entity)」,用于表示被管理的实际元数据对象。类型系统是一个允许用户定义和管理类型与实体的组件。Atlas 开箱即用所管理的所有元数据对象(例如 Hive 表)都是使用类型建模并以实体形式表示的。若要在 Atlas 中存储新型的元数据,就需要了解类型系统组件的相关概念。
类型
Atlas 中的类型是对某一特定类型元数据对象如何存储和访问的定义。一个类型表示一个或一组属性,这些属性定义了该元数据对象的特性。具备开发背景的用户不难看出,类型与面向对象编程语言中的「类(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>
viewOriginalText: string
viewExpandedText: string
tableType: string
temporary: boolean从上面的例子中,可以注意到以下几点:
Atlas 中的类型通过‘名称’唯一标识
类型具有元类型(metatype)。Atlas 具有以下元类型:
- 基本元类型:boolean、byte、short、int、long、float、double、biginteger、bigdecimal、string、date
- 枚举元类型
- 集合元类型:array、map
- 复合元类型:Entity、Struct、Classification、Relationship
实体(Entity)与分类(Classification)类型可以‘继承’自其他类型,即所谓的‘超类型(supertype)’——借助这一机制,它也会包含超类型中定义的属性。这使得建模人员可以在一组相关类型之间定义公共属性等。这与面向对象语言中为类定义超类的概念类似。Atlas 中的类型同样可以继承自多个超类型。
- 在本示例中,每个 hive 表都继承自一个名为‘DataSet’的预定义超类型。关于这些预定义类型的更多细节将在后文说明。
元类型为‘Entity’、‘Struct’、‘Classification’或 'Relationship' 的类型可以拥有一组属性。每个属性都有一个名称(例如 ‘name’)以及其他一些关联属性。可以通过表达式 type_name.attribute_name 来引用某个属性。值得注意的是,属性本身也是使用 Atlas 元类型来定义的。
- 在本示例中,hive_table.name 是一个 String,hive_table.aliases 是一个 String 数组,hive_table.db 指向一个名为 hive_db 的类型的实例,依此类推。
属性中的类型引用(例如 hive_table.db)尤其值得关注。请注意,利用这类属性,我们可以在 Atlas 中定义的两个类型之间建立任意关系,从而构建丰富的模型。同时也要注意,也可以将引用的列表作为属性类型(例如 hive_table.columns 表示从 hive_table 到 hive_column 类型的引用列表)。
实体
Atlas 中的‘实体(entity)’是某个实体‘类型’的具体取值或实例,因此代表现实世界中的某个特定元数据对象。回到我们面向对象编程语言的类比,‘实例’就是某个‘类’的‘对象’。
实体的一个例子就是一张具体的 Hive 表。假设 Hive 在 ‘default’ 数据库中有一张名为 ‘customers’ 的表。这张表在 Atlas 中就是一个类型为 hive_table 的‘实体’。作为实体类型的实例,它将为 Hive 表‘类型’中包含的每一个属性都拥有相应的取值,例如:
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从上面的例子中可以注意到以下几点:
- 实体类型的每个实例都由一个唯一标识符(GUID)来标识。该 GUID 在对象定义时由 Atlas 服务器生成,并在实体的整个生命周期内保持不变。在任何时刻,都可以通过该 GUID 访问这个特定的实体。
- 在本例中,默认数据库中的 'customers' 表由 GUID "9ba387dd-fa76-429c-b791-ffc338d3c91f" 唯一标识
- 实体属于某个给定的类型,类型名称随实体定义一起提供。
- 在本例中,'customers' 表是一个 'hive_table。
- 该实体的值是一个映射,包含 hive_table 类型定义中所定义的全部属性名称及其对应的值。
- 属性值将遵循该属性的数据类型。实体类型属性的值类型为 AtlasObjectId。
基于上述关于实体的概念,我们现在可以了解 Entity 与 Struct 这两种元类型之间的区别。Entity 和 Struct 都由其他类型的属性组合而成。但是,Entity 类型的实例具有身份(拥有一个 GUID 值),并且可以被其他实体引用(例如 hive_table 实体会引用 hive_db 实体)。Struct 类型的实例没有自身的身份。Struct 类型的值是“嵌入”在实体本身内部的一组属性的集合。
属性
我们已经看到,属性定义在 Entity、Struct、Classification 和 Relationship 等元类型内部。但我们之前只是隐含地认为属性具有名称和元类型值。事实上,Atlas 中的属性还有更多属性(property),用于定义与类型系统相关的更多概念。
属性具有以下属性(property):
name: string,
typeName: string,
isOptional: boolean,
isIndexable: boolean,
isUnique: boolean,
cardinality: enum上述属性的含义如下:
name —— 属性的名称。
dataTypeName —— 属性的元类型名称(原生类型、集合类型或复合类型)。
isComposite —
- 该标志表示一种建模方面的特性。如果某个属性被定义为复合属性,意味着它的生命周期不能独立于它所属的实体。一个很好的例子是构成 hive 表组成部分的一组列。由于列脱离 hive 表便不再具有意义,因此它们被定义为复合属性。
- 复合属性必须在 Atlas 中与其所属的实体一同创建。也就是说,hive 列必须与 hive 表一起创建。
isIndexable —
- 该标志表示是否应对该属性建立索引,以便以属性值作为谓词进行查找,并保证查找的高效性。
isUnique —
该标志同样与索引相关。如果被指定为唯一,则意味着 JanusGraph 会为该属性创建一个特殊的索引,从而支持基于相等关系的查找。
任何该标志取值为 true 的属性都会被当作主键来对待,用于将该实体与其他实体区分开来。因此,需要注意确保该属性确实描述了现实世界中的唯一属性。
- 例如,考虑 hive_table 的 name 属性。单就 name 而言,它并不是 hive_table 的唯一属性,因为同名的表可以存在于多个数据库中。即使 (数据库名, 表名) 这一对组合也不一定是唯一的,前提是 Atlas 在多个集群中存储 hive 表的元数据。在物理世界中,只有集群位置、数据库名和表名才能被认为是唯一的。
multiplicity —— 表示该属性是必需的、可选的,还是可以多值的。如果某个实体的属性值定义与类型定义中的多重性声明不符,这就构成约束违反,该实体的添加将会失败。因此,该字段可用于对元数据信息定义一些约束。
基于以上内容,下面让我们展开说明 hive 表中某个属性的属性定义。我们来看名为 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、description 和 owner 等属性。name 是必填属性(isOptional=false),其他属性为可选属性。
Referenceable 和 Asset 的目的在于为建模者提供一种方式,使其在定义和查询自有类型的实体时能够保证一致性。拥有这组固定的属性,可以让应用程序和用户界面基于约定,对它们默认可以从各类型中期望哪些属性作出假设。
Infrastructure:该类型扩展了 Asset,通常可用作集群、主机等基础架构元数据对象的通用超类型。
DataSet:该类型扩展了 Referenceable。从概念上讲,它可以用来表示存储数据的类型。在 Atlas 中,hive_table、hbase_tables 等都是从 DataSet 扩展而来的类型。可以预期,扩展 DataSet 的类型会拥有一个 Schema,也就是说它们会有一个用来定义该数据集属性的属性。例如 hive_table 中的 columns 属性。此外,扩展 DataSet 的类型的实体会参与数据转换,而这种转换可以通过 Atlas 的血缘(或溯源)图来捕获。
Process:该类型扩展了 Asset。从概念上讲,它可以用来表示任何数据转换操作。例如,一个将含有原始数据的 hive 表转换为存储某些聚合数据的另一个 hive 表的 ETL 过程,可以是一个扩展自 Process 类型的具体类型。Process 类型有两个特定属性:inputs 和 outputs。inputs 和 outputs 都是 DataSet 实体的数组。因此,Process 类型的实例可以利用这些 inputs 和 outputs 来捕获 DataSet 的血缘是如何演化的。
评论
登录后参与评论
KnowForge