使用Atlas進行元數據管理之Type(類型)

背景:筆者和團隊的小夥伴近期在進行數據治理/元數據管理方向的探索, 在接下來的系列文章中, 會陸續與讀者們進行分享在此過程當中踩過的坑和收穫。html

元數據管理系列文章:

[0] - 使用Atlas進行元數據管理之Atlas簡介
[1] - 使用Atlas進行元數據管理之Glossary(術語)
[2] - 使用Atlas進行元數據管理之Type(類型)數據庫

1. 概述

Atlas容許用戶爲他們想要管理的元數據對象定義模型。該模型由稱爲type(類型)的定義組成。稱爲entities(實體)type(類型)實例表示受管理的實際元數據對象。 Type System是一個容許用戶定義和管理類型和實體的組件。開箱即用的Atlas管理的全部元數據對象(例如Hive表)都使用類型建模並表示爲實體。要在Atlas中存儲新類型的元數據,須要瞭解類型系統組件的概念。編程

2. Types(類型)

Atlas中的Type是對特定類型的元數據對象如何存儲和訪問的定義。Type表示定義元數據對象屬性的一個或一組屬性。具備開發基礎的用戶能瞭解到,類型就至關於面向對象編程語言的「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,string>
    viewOriginalText: string
    viewExpandedText: string
    tableType:        string
    temporary:        boolean

從上面的例子中能夠注意到如下幾點:編程語言

  • Atlas中的類型(Type)由name惟一標識ui

  • Type具備元類型。Atlas中有如下元類型:
    • 原始元類型(Primitive metatypes):boolean,byte,short,int,long,float,double,biginteger,bigdecimal,string,date
    • 枚舉元型(Enum metatypes)
    • 集合元類型(Collection metatypes:):array, map
    • 複合元類型(Composite metatypes):Entity, Struct, Classification, Relationship
  • 實體(Entity)和分類(Classification)類型能夠從其餘類型繼承,稱爲「超類型/父類型」(supertype) ,它包括在超類型中定義的屬性。這容許建模者在一組相關類型等中定義公共屬性。相似於面嚮對象語言如何爲類定義父類。 Atlas中的類型也能夠從多個超類型擴展。
    • 在此示例中,每一個配置單元表都從稱爲DataSet的預約義超類型擴展。稍後將提供有關此預約義類型的更多詳細信息。
  • 具備元類型EntityStructClassificationRelationship的類型能夠具備屬性的集合。每一個屬性都有一個名稱(例如: name)和一些其餘相關屬性。可使用表達式type_name.attribute_name引用屬性。值得注意的是,屬性自己是使用Atlas元類型定義的。
    • 在此示例中,hive_table.name是String,hive_table.aliases是一個字符串數組,hive_table.db是指一個名爲hive_db的類型的實例,依此類推。
  • 屬性中的類型引用(如hive_table.db)特別有趣,使用這樣的屬性,咱們能夠定義Atlas中定義的兩種類型之間的任意關係,從而構建豐富的模型。此外,還能夠將引用列表收集爲屬性類型(例如,hive_table.columns,表示從hive_table到hive_column類型的引用列表)設計

3. Entities(實體)

Atlas中的entitytype的特定值或實例,所以表示現實世界中的特定元數據對象。用咱們對面向對象編程語言的類比,實例(instance)是某個類(Class)對象(Object)code

實體的其中一個示例就是Hive表。Hive在'default'數據庫中有一個名爲'customers'的表。該表是hive_table類型的Atlas中的「實體」。因爲是實體類型的實例,它將具備做爲Hive表'type'的一部分的每一個屬性的值,例如:htm

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)和結構(Entity)都構成其餘類型的屬性。可是,實體類型的實例具備標識(具備GUID值),而且能夠從其餘實體引用(例如,從hive_table實體引用hive_db實體)。 Struct類型的實例沒有本身的標識。 Struct類型的值是在實體自己內「嵌入」的屬性集合。

3. Attributes(屬性)

咱們已經看到,屬性(attributes)是在實體(Entity),結構(Struct),分類(Classification)和關係(Relationship)等元類型中定義的。但咱們將屬性列舉爲具備名稱和元類型值。然而,Atlas中的attributes具備一些properties,這些properties定義了與類型系統相關的更多概念。

attributes具備如下properties:

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

上述屬性具備如下含義:

  • name: 屬性的名稱
  • dataTypeName: 屬性的元類型名稱(native, collection, composite))
  • isComposite:
    • 該標誌表示建模的一個方面。若是將屬性定義爲複合(composite),則意味着它不能具備獨立於其所包含的實體的生命週期。這個概念的一個很好的示例是構成hive表的一部分的列集。因爲列在hive表外部沒有意義,所以它們被定義爲複合屬性。
    • 必須在Atlas中建立複合屬性及其包含的實體。即,必須與hive表一塊兒建立配置單元列。
  • isIndexable
    • 標誌指示是否應該對此屬性創建索引,以即可以使用屬性值做爲謂詞來執行查找,而且能夠有效地執行查找。
  • isUnique
    • 一樣與索引相關。若是指定爲惟一,則表示在JanusGraph中爲此屬性建立了一個特殊索引,容許基於相等的查找。
    • 具備該標誌的真值的任何屬性都被視爲主鍵,以將該實體與其餘實體區分開。所以,應該注意確保此屬性確實在現實世界中爲惟一屬性建模。
      • 對於例如考慮hive_table的name屬性。在單獨的狀況下,名稱不是hive_table的惟一屬性,由於具備相同名稱的表能夠存在於多個數據庫中。若是Atlas在多個集羣中存儲hive表的元數據,那麼即便是一對(數據庫名稱,表名)也不是惟一的。在物理世界中,只有集羣位置,數據庫名稱和表名稱才能被視爲惟一。
  • multiplicity: 標示該屬性是必選(required),可選(optional)的仍是能夠是多值的(multi-valued)。若是實體的屬性值定義與類型定義中的多重性聲明不匹配,則這將違反約束,而且實體添加將失敗。所以,該字段可用於定義元數據信息的一些約束。

根據上面的內容,讓咱們展開下面的hive表的一個attributes的屬性定義。讓咱們看一下名爲'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系統強制執行的特定建模行爲(約束,索引等)。

4. 系統特定類型及含義

Atlas自帶了一些預約義的系統類型。咱們在前面的部分中看到了一個示例(DataSet)。在本節中,咱們將看到更多這些類型並瞭解它們的重要性。

  • Referenceable:該類型表示可使用名爲qualifiedName的惟一屬性搜索的全部實體。

  • Asset:該類型擴展了Referenceable並添加了名稱,描述和全部者等屬性。 Name是必需屬性(isOptional = false),其餘屬性是可選的。

Referenceable和Asset的目的是爲建模者提供在定義和查詢本身類型的實體時強制一致性的方法。擁有這些固定的屬性集容許應用程序和用戶界面基於約定作出關於默認狀況下它們能夠指望類型的屬性的假設。

  • Infrastructure:該類型繼承自Asset,一般可用做基礎結構元數據對象(如集羣,主機等)的常見超類型。

  • DataSet:該類型繼承自Referenceable。從概念上講,它能夠用於表示存儲數據的類型。在Atlas中,hive表,hbase_tables等都是從DataSet擴展的類型。擴展DataSet的類型能夠預期具備Schema,由於它們具備定義該數據集的屬性的屬性。對於例如hive_table中的columns屬性。此外,擴展DataSet的類型實體參與數據轉換,Atlas能夠經過血緣)圖瞭解到轉換過程。

  • Process:該類型繼承自Asset。從概念上講,它能夠用於表示任何數據轉換操做。例如,將具備原始數據的配置單元錶轉換爲存儲某些聚合的另外一個配置單元表的ETL過程能夠是擴展Process類型的特定類型。流程類型有兩個特定屬性,即輸入和輸出。輸入和輸出都是DataSet實體的數組。所以,Process類型的實例可使用這些輸入和輸出來捕獲DataSet的血緣如何演變。

相關文章
相關標籤/搜索