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

背景:筆者和團隊的小夥伴近期在進行數據治理/元數據管理方向的探索,會在接下來的系列文章中, 將經驗與收穫和讀者們進行分享。

元數據系列文章:
[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唯一標識
  • 類型具有元類型。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)

實體的其中一個示例就是Hive表。Hive在'default'數據庫中有一個名爲'customers'的表。該表是hive_table類型的Atlas中的“實體”。由於是實體類型的實例,它將具有作爲Hive表'type'的一部分的每個屬性的值,例如:

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的血緣如何演變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章