背景:筆者和團隊的小夥伴近期在進行數據治理/元數據管理方向的探索, 在接下來的系列文章中, 會陸續與讀者們進行分享在此過程當中踩過的坑和收穫。html
[0] - 使用Atlas進行元數據管理之Atlas簡介
[1] - 使用Atlas進行元數據管理之Glossary(術語)
[2] - 使用Atlas進行元數據管理之Type(類型)數據庫
Atlas容許用戶爲他們想要管理的元數據對象定義模型。該模型由稱爲type(類型)
的定義組成。稱爲entities(實體)
的type(類型)
實例表示受管理的實際元數據對象。 Type System是一個容許用戶定義和管理類型和實體的組件。開箱即用的Atlas管理的全部元數據對象(例如Hive表)都使用類型建模並表示爲實體。要在Atlas中存儲新類型的元數據,須要瞭解類型系統組件的概念。編程
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
DataSet
的預約義超類型擴展。稍後將提供有關此預約義類型的更多詳細信息。Entity
,Struct
,Classification
或Relationship
的類型能夠具備屬性的集合。每一個屬性都有一個名稱(例如: name
)和一些其餘相關屬性。可使用表達式type_name.attribute_name
引用屬性。值得注意的是,屬性自己是使用Atlas元類型定義的。
屬性中的類型引用(如hive_table.db)特別有趣,使用這樣的屬性,咱們能夠定義Atlas中定義的兩種類型之間的任意關係,從而構建豐富的模型。此外,還能夠將引用列表收集爲屬性類型(例如,hive_table.columns,表示從hive_table到hive_column類型的引用列表)設計
Atlas中的entity
是type
的特定值或實例,所以表示現實世界中的特定元數據對象。用咱們對面向對象編程語言的類比,實例(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
從上面的例子中能夠注意到如下幾點:
有了實體的這個設計,咱們如今能夠看到Entity和Struct元類型之間的區別。實體(Entity)和結構(Entity)都構成其餘類型的屬性。可是,實體類型的實例具備標識(具備GUID值),而且能夠從其餘實體引用(例如,從hive_table實體引用hive_db實體)。 Struct類型的實例沒有本身的標識。 Struct類型的值是在實體自己內「嵌入」的屬性集合。
咱們已經看到,屬性(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
:
isIndexable
isUnique
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系統強制執行的特定建模行爲(約束,索引等)。
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的血緣如何演變。