特性

类型系统

qianmoQqianmoQ· 更新于 2026-09-27· 阅读 13 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

类型系统

概述

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 中的类型通过 ‘name’ 唯一标识

  • 类型具有元类型(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)’ 是某个 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 中的属性还具有更多属性,用于定义与类型系统相关的更多概念。

属性具有以下属性:

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 - 表示该属性是必需的、可选的,还是可以为多值的。如果实体对该属性值的定义与类型定义中的 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_table 等都是扩展自 DataSet 的类型。扩展 DataSet 的类型可以预期具有 Schema,即它们会有一个定义该数据集属性的属性。例如 hive_table 中的 columns 属性。此外,扩展 DataSet 的类型的实体会参与数据转换,而这种转换可通过 Atlas 的血缘(或溯源)图来捕获。

Process:该类型扩展自 Asset。从概念上讲,它可以用来表示任何数据转换操作。例如,一个将包含原始数据的 hive 表转换为存储某种聚合结果的另一个 hive 表的 ETL 过程,可以是一个扩展自 Process 类型的具体类型。Process 类型有两个特定属性:inputs 和 outputs。inputs 和 outputs 都是 DataSet 实体的数组。因此,Process 类型的实例可以利用这些 inputs 和 outputs 来捕获 DataSet 血缘的演化过程。

评论

登录后参与评论

正在加载评论…