概述

Atlas 允许用户为他们想要管理的元数据对象定义模型。该模型由称为“类型”的定义组成。称为“实体”(entities)的“类型”实例表示管理的实际元数据对象。类型系统(The Type System)是一个允许用户定义和管理类型(types )和实体(entities)的组件。开箱即用的由 Atlas 管理的所有元数据对象(例如 Hive 表)都使用类型建模并表示为实体。要在 Atlas 中存储新类型的元数据,需要了解类型系统组件的概念。

Types

Atlas 中的类型定义了如何存储和访问特定类型的元数据对象。类型表示定义元数据对象属性的一个或一组属性。具有开发背景的用户将认识到类型与面向对象编程语言的“类”定义的相似性,types 对应类,entities对应对象。

使用 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 中的类型由“名称”唯一标识
  • 一个类型有一个元类型。Atlas 具有以下元类型:
    • 原始元类型:boolean, byte, short, int, long, float, double, biginteger, bigdecimal, string, date
    • 枚举元类型
    • 集合元类型: array, map
    • 复合元类型: Entity, Struct, Classification, Relationship
  • 实体和分类类型可以从其他类型“扩展”,称为“超类型”。凭借这一点,它也将包含在超类型中定义的属性。这允许建模者跨一组相关类型等定义通用属性。这再次类似于面向对象语言如何为类定义超类( super classes)的概念。Atlas 中的一个类型也可以从多个超类型扩展而来。
    • 在此示例中,每个 hive 表都从称为“DataSet”的预定义超类型扩展而来。稍后将提供有关此预定义类型的更多详细信息。
  • 具有Entity“实体”、Struct“结构”、Classification“分类”或Relationship“关系”元类型的类型可以具有属性集合。每个属性都有一个名称(例如“名称”)和一些其他相关属性。可以使用表达式 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 类型的引用列表)
  • xx

Entities

Atlas 中的“实体”是实体“类型”的特定值或实例,因此代表现实世界中的特定元数据对象。回顾我们对面向对象编程语言的类比,“实例”是某个“类”的“对象”。

实体的一个示例将是特定的 Hive 表。假设 Hive 在“默认”数据库中有一个名为“customers”的表。该表将是类型为 hive_table 的 Atlas 中的“实体(entity)”。由于是实体类型的实例,它将具有属于 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 元类型之间的区别。

graph LR
A[Entity和Struct异同] --> B(相同点)
A[Entity和Struct异同] --> C(异同点)
B --> D[由其他的类型的属性组成]
C --> E[标识]
C --> F[值类型]
E --> G[Entity types have an identity:GUID]
E --> H[Struct types do not have an identity of their own]
F --> I[can be referenced from other entities]
F --> J[The value of a Struct type is a collection of attributes that are 'embedded' inside the entity itself]

Attributes

我们已经看到属性是在元类型中定义的,例如Entity, Struct, Classification 和 Relationship。但是我们隐含地将属性称为具有名称和元类型值。Atlas 中的属性有更多的属性来定义更多与类型系统相关的概念。

attribute具有以下属性:

name:        string,
typeName:    string,
isOptional:  boolean,
isIndexable: boolean,
isUnique:    boolean,
cardinality: enum

上述属性具有以下含义:

  • name - 属性的名称
  • dataTypeName - 属性的元类型名称(原生、集合、复合)
  • isComposite
    • 此标志表示建模的一个方面。如果一个属性被定义为复合属性,则意味着它的生命周期不能独立于它所包含的实体。这个概念的一个很好的例子是构成 hive 表一部分的列集。由于列在 hive 表之外没有意义,因此它们被定义为复合属性。
    • 必须在 Atlas 中创建一个复合属性以及它所包含的实体。即,必须与 hive 表一起创建一个 hive 列。
  • isIndexable
    • 此标志指示是否应为此属性编制索引,以便可以使用属性值作为谓词执行查找,并且可以高效执行。
  • isUnique
    • 此标志再次与索引有关。如果指定为唯一,则意味着在 JanusGraph 中为该属性创建了一个特殊索引(唯一索引),允许基于相等的查找。
    • 此标志的任何具有真值的属性都被视为主键,以将此实体与其他实体区分开来。此标志的任何具有真值的属性都被视为主键,以将此实体与其他实体区分开来。
      • 例如考虑 hive_table 的 name 属性。孤立地看,名称不是 hive_table 的唯一属性,因为同名的表可以存在于多个数据库中。如果 Atlas 在多个集群之间存储 hive 表的元数据,即使一对(数据库名称、表名称)也不是唯一的。只有集群位置、数据库名称和表名称在物理世界中才能被认为是唯一的。
  • multiplicity(多样性) - 指示此属性是必需的、可选的还是可以是多值的。如果实体对属性值的定义与类型定义中的多重性声明不匹配,这将违反约束并且实体添加将失败。因此,该字段可用于定义对元数据信息的一些约束。

使用上述内容,让我们扩展下面 hive 表的属性之一的属性定义。让我们看一下名为“db”的属性,它表示 hive 表所属的数据库:

db:
    "name":        "db",
    "typeName":    "hive_db",
    "isOptional":  false,
    "isIndexable": true,
    "isUnique":    false,
    "cardinality": "SINGLE"					# 基数

注意“isOptional=false”约束——没有数据库引用就不能创建表实体。

columns:
    "name":        "columns",
    "typeName":    "array<hive_column>",
    "isOptional":  optional,
    "isIndexable": true,
    “isUnique":    false,
    "constraints": [ { "type": "ownedRef" } ]

注意:列的“ownedRef”约束。通过这样做,我们表明定义的列实体应始终绑定到定义它们的表实体。

System specific types and their significance

Atlas 带有一些预定义的系统类型。我们在前面的部分中看到了一个示例 (DataSet)。在本节中,我们将看到更多这些类型并了解它们的重要性。

Referenceable: 此类型表示可以使用名为qualifiedName 的唯一属性进行搜索的所有实体。

Asset: 此类型扩展了 Referenceable 并添加了名称、描述和所有者等属性。Name 是必需属性 (isOptional=false),其他属性是可选的。

Referenceable 和 Asset 的目的是为建模者提供在定义和查询他们自己类型的实体时强制一致性的方法(一处定义,多处引用,这样就可以保证一套结构多次复用)。拥有这些固定的属性集允许应用程序和用户界面对默认情况下他们可以期望的类型属性做出基于约定的假设。

Infrastructure(基础设施): 此类型扩展了 Asset,通常可用作基础设施元数据对象(如集群、主机等)的通用超类型。

DataSet: 这种类型扩展了 Referenceable。从概念上讲,它可用于表示存储数据的类型。在 Atlas 中,hive_tables、hbase_tables 等都是从 DataSet 扩展而来的类型。可以期望扩展 DataSet 的类型具有 Schema,因为它们将具有定义该数据集属性的属性。例如hive_table 中的列属性。扩展 DataSet 的类型实体也参与数据转换,Atlas 可以通过谱系(或来源)图捕获这种转换。

Process: 这种类型 Asset。从概念上讲,它可用于表示任何数据转换操作。例如,将带有原始数据的 hive 表转换为另一个存储某些聚合的 hive 表的 ETL 过程可以是扩展 Process 类型的特定类型。流程类型有两个特定属性,输入和输出。输入和输出都是 DataSet 实体的数组。因此,Process 类型的实例可以使用这些输入和输出来捕获 DataSet 的沿袭如何演变。

参考资料:

1.http://atlas.apache.org/#/TypeSystem