美文网首页我爱编程
类型系统(Type System)

类型系统(Type System)

作者: jupiter_2000 | 来源:发表于2018-07-25 22:07 被阅读0次

概览

Atlas允许用户定义元数据对象(metadata object)模型,即CWM(Common Warehouse Meta model,公共仓库元模型)中的M2。该模型由称之为“类型”(type)的东西组成。类型的实例称之为“实体”(entity),它便是实际待管理的元数据对象。类型系统是一个提供给用户定义和管理类型与实体的组件。所有Atlas中可管理的、立即可用的元数据对象都是由特定类型模型下的实体开描述的。为了在Atlas中存储新类型的元数据,我们需要理解类型系统组件中的概念。

类型(type)

在Atlas中“类型”是对一个特定类别元数据对象如何存储和访问的定义。一个类型描述了一项属性或一组属性集合,而这些属性定义了元数据对象所包含的内容。有开发背景的用户可将类型类比理解为面向对象编程语言中的类,或者是关系型数据库中的表模式(table schema)。

下面是在Atlas中定义的一个名为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中每一个类型都通过唯一的名字来标识。
  • 每一个类型都有一个元类型(metatype)。Atlas有如下的元类型:
    1.基本元类型:boolean, byte, short, int, long, float, double, biginteger, bigdecimal, string, date
    2.枚举元类型(Enum metatypes)
    3.集合元类型:array, map
    4.复合元类型:Entity, Struct, Classification, Relationship
  • Entity & Classification可以继承其他类型,被继承的类型称为supertype。这样做的好处是,类型可以继承获得超类型的属性。建模者可以将一些公共属性定义在超类型中。比如示例中hive表就是继承自DataSet。
  • 具有‘Entity’, ‘Struct’, ‘Classification’ or 'Relationship'元类型的类型可拥有一个属性集合。其中每一项属性都有一个名词及与之对应的取值。属性可通过表达式type_name.attribute_name来引用。比如hive_table.name是String,hive_table.aliases是String数组,hive_table.db引用了hive_db类型的一个实例 。

实体

Atlas中的一个“实体”是一个实体类型的特殊值或实例,也表征了真实世界中的元数据对象。类比面向对象编程语言,一个实例是特定类的一个对象。
一个Hive表的实例就是一个实体。假设在“default”数据库中有个名为“customers”的hive表。该表就是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来访问这个对象。
  • 一个实体实例的values是一个map,该map的key为对应类型中定义属性的名称,value为属性的取值。
  • 属性的取值必须与类型中定义的属性类型保持一致。实体类型(Entity-type)的属性拥有一个AtlasObjectId类型的取值。

实体(Entity)与结构(Struct)元类型都是由其他类型属性组合而成。然而,实例类型的实例拥有一个标识(GUID值),可以被其他实例引用(比如hive_db实体引用hive_table实体)。结构类型没有标识。结构类型的值是所有属性的集合。

属性

一个属性拥有以下的内容:

    name:        string,
    typeName:    string,
    isOptional:  boolean,
    isIndexable: boolean,
    isUnique:    boolean,
    cardinality: enum
  • name - 属性的名称。
  • typeName - 属性的元类型名称。
  • isComposite - 这个标识了建模的考虑。如果一个属性被标记为复合的(composite),那么就表明这个属性不能脱离包含它的实体而存在。比如一个hive表的字段不能脱离表存在。一个复合属性必须在Atlas与包含的实体一起创建。
  • isIndexable - 标识是否在该属性上建立了索引
  • isUnique - 是否时唯一索引。任何标记设置为真的属性,都可以作为区分实体的主键。
  • multiplicity - 值是该属性是必须的,可选的,多值的其中之一。

如果isOptional=true,那么创建表实体时必须可以引用到db实体

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

注意到列属性定义中的ownedRef约束。这使得我们在定义列实体必须与对应的表实体绑定起来。

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

系统特殊类型和它们的重要性

Atlas预定了一些系统类型,比如DataSet。这里我们列举了更多的系统类型,以及它们的重要作用。

  • Referenceable:该类型表示,它的所有实体都可以通过叫做qualifiedName的唯一属性查询到。
  • Asset: 该类型扩展自Referenceable,并增加了诸如name,description和owner等属性。name是必选属性,其他为可选属性。提供Referenceable和Asset的目的是,让建模者在定义和查询他们自定义类型时能具备强一致性。具有这些固定的属性集,能让应用和用户接口开发时有这样的属性假设,即默认这些属性已经才能在。
  • Infrastructure: 该类型扩展自Asset,一般可作为基础上设施元数据对象(如集群,主机等)的公用超类型。
  • DataSet:该类型扩展自Referenceable。概念上,它用于描述一种存储数据的类型。在Atlas中,hive表,hbase表等都可以从DataSet扩展而来。从DataSet类型扩展而来的类型都将拥有一个模式(schema),即有一个属性定义了该数据集的列(字段或属性),比如hive表中columes字段。所有DataSet扩展类型的实体都会参与数据转换(transformation),而这种转换会通过Atlas的血缘图记录下来。
  • Process:该类型扩展自Asset。概念上,它用于描述任何数据转换的操作。例如,一个ETL处理过程可以是Process扩展类型的实例,而该ETL处理过程可将原始数据转换成存储到一个存放聚合数据的hive表中。Process类型有两个特别的属性,输入和输出。输入和输出都是DataSet实例数组类型的。因此,一个Process类型的实例可用输入和输出属性来展示数据的血缘关系。

相关文章

网友评论

    本文标题:类型系统(Type System)

    本文链接:https://www.haomeiwen.com/subject/fbmpmftx.html