Apache-Atlas系列-类型系统
概述
本文主要介绍一下 Atlas 的类型系统。
Atlas Type System
Atlas 类型系统,Atlas 允许用户为他们想要管理的元数据对象定义一个模型。该模型由称为**“类型”**的定义组成。被称为“实体”的“类型”实例表示被管理的实际元数据对象。
类型系统是一个组件,允许用户定义和管理类型和实体。由 Atlas 管理的所有元数据对象(例如 Hive 表)都使用类型进行建模,并表示为实体。如果要在 Atlas 中存储新类型的元数据,需要了解类型系统组件的概念(二次开发)。
Atlas REST API
|
|
Types
Atlas 中的“类型”定义了如何存储和访问特定类型的元数据对象。类型表示了所定义元数据对象的一个或多个属性集合。具有开发背景的用户可以将“类型”理解成面向对象的编程语言的“类”定义的或关系数据库的“表模式”。
可以通过该 API 获取 Atlas 的所有类型:
|
|
下面通过该 API 获取 hive_table 类型的定义:
|
|
hive_table 类型示例:
|
|
从上面的例子可以注意到以下几点:
- Atlas 中的类型由 “name” 唯一标识
- attributeDefs 表示该类型中属性的定义
- 类型具有元类型,元类型表示 Atlas 中此模型的类型
Atlas 有以下几种类型:
- 基本元类型:Int,String,Boolean 等。
- 枚举元类型
- 集合元类型:Array,Map
- 复合元类型:Class,Struct,Trait
类型可以从称为“superTypes”的父类型“extend” - 通过这种方式,它将拥有在“supertype”中定义的属性。这允许模型在一组相关类型等之间定义公共属性。这再次类似于面向对象语言如何定义类的超类的概念。Atlas 中的类型也可以从多个超类型扩展。同时 subTypes 表示该类型的子类型。
在该示例中,每个 hive_table 类型从预定义的超类型(称为 “DataSet”)扩展。稍后将提供关于此预定义类型的更多细节。
具有“Class”,“Struct”或“Trait”的元类型的类型可以具有属性集合。每个属性都有一个名称(例如“name”)和一些其他关联的属性。可以使用表达式 type_name.attribute_name 来引用属性。还要注意,属性本身是使用 Atlas 元类型定义的。
在这个例子中,hive_table.name 是一个字符串,hive_table.aliases 是一个字符串数组,hive_table.db 引用一个类型的实例称为 hive_db 等等。
在属性中键入引用(如hive_table.db)。使用这样的属性,我们可以在 Atlas 中定义的两种类型之间的任意关系,从而构建丰富的模型。注意,也可以收集一个引用列表作为属性类型(例如 hive_table.columns,它表示从 hive_table 到 hive_column 类型的引用列表)
DataSet 类型定义:
|
|
可以看到 DataSet 有很多的子类型,部分 Atlas 自带的类型都继承自 DataSet。同时 DataSet 继承自 Asset,Asset 表示资产的意思,其中定义了一些通用的属性
Asset 类型定义:
|
|
Asset 类型中定义了3个属性:
- name:名称
- owner:所属人
- description:描述
它也有不少子类型,表示资产的意义,比如说 hive 数据库 hive_db,hbase 命名空间 hbase_namespace。它继承自 Referenceable 类型。
Referenceable 类型定义:
|
|
该类型定义了一个非常重要的属性,qualifiedName, 该类型中唯一限定名,可以通过该属性配合类型名在Atlas中查找对应的唯一实体内容,注意与guid的区别,guid是全局唯一的。
例如:
一个 hive 数据库的 qualifiedName:test@primary
该数据库 test 下表 test_table 的 qualifiedName:test.test_table@primary
该表 test_table 中字段 name 的 qualifiedName:test.test_table.name@primary
@primary 表示集群默认名字,通过如下配置集群名称,通过加上集群名称,在不同集群间唯一标识一个实体。
atlas.cluster.name primary
Process 类型定义:
|
|
Process 类型继承自 Asset 类型,所以自带有 name,owner,description,quailifiedName 四种属性。
它自己特有的inputs 和 outputs 表示该过程的输入输出,它是Atlas血缘管理中所有类型的超类。
在概念上,它可以用于表示任何数据变换操作。例如,将原始数据的 hive 表转换为存储某个聚合的另一个 hive 表的 ETL 过程可以是扩展过程类型的特定类型。流程类型有两个特定的属性,输入和输出。输入和输出都是 DataSet 实体的数组。因此,Process 类型的实例可以使用这些输入和输出来捕获 DataSet 的 lineage 如何演变。
4 Entities
表示实体,前面的 Type 理解为 Java 的类,则 Entity 可以理解为类对应的一个实例,该类的一个对象。
hive_table 类型的实体对象示例:
|
|
表名:student 包含3个列:name,age,phone
开头 referredEntities 中包含了该 table 的引用的实体对象,即3个列实体和一个 hive_storagedesc 实体(表示该表的存储信息),实际存储时存储的为它们的 guid。
entity 中包含了该表 student 的一些信息,name,owner,guid,status,attribute等等。
作为 Class Type 实例的每个实体都由唯一标识符 GUID 标识。此 GUID 由 Atlas 服务器在定义对象时生成,并在实体的整个生命周期内保持不变。在任何时间点,可以使用其 GUID 来访问该特定实体。
6 Attributes
在扩展时常用的一种类型,表示某个类型的附加属性,该类型具有以下属性:
此处以 hive_table 类型的 db,createTime,columns 属性为例。
|
|
- name:该属性名
- typeName:该属性类型,包括基本类型,以及date,各种type类型,和集合类型等等
- isOptional:是否可选,false表示该属性必须指定
- cardinality:如下图三种,SINGLE(单个),LIST(可重复多个),SET(不可重复多个)
- valuesMinCount:该属性最小个数
- valuesMaxCount:该属性最大个数
- isUnique:是否为唯一属性 此标志与索引相关。如果指定为唯一,这意味着为 JanusGraph 中的此属性创建一个特殊索引,允许基于等式的查找。 具有此标志的真实值的任何属性都被视为主键,以将此实体与其他实体区分开。因此,应注意确保此属性在现实世界中模拟独特的属性。 例如,考虑 hive_table 的 name 属性。孤立地,名称不是 hive_table 的唯一属性,因为具有相同名称的表可以存在于多个数据库中。如果 Atlas 在多个集群中存储 hive 表的元数据,即使一对(数据库名称,表名称)也不是唯一的。只有集群位置,数据库名称和表名称可以在物理世界中被视为唯一。
- isIndexable:此标志指示此属性是否应该索引,以便可以使用属性值作为谓词来执行查找,并且可以高效地执行查找。
- constraints:限制类型,该属性的限制类型,猜测可以通过该值来实现类似于MySQL中外键的功能,默认值有如下3个
- Atlas创建类型与更新类型
- Atlas创建access_info类型
|
|
Atlas 更新 kafka_topic 类型,添加属性。
|
|
注意:添加后的属性不能删除,也不能更新,虽然有对应的接口,但是目前尚不支持。