背景:筆者和團隊的小伙伴近期在進行數據治理/元數據管理方向的探索, 在接下來的系列文章中, 會陸續與讀者們進行分享在此過程中踩過的坑和收獲。
元數據管理系列文章:
[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
唯一標識 -
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
的預定義超類型擴展。稍后將提供有關此預定義類型的更多詳細信息。
- 在此示例中,每個配置單元表都從稱為
-
具有元類型
Entity
,Struct
,Classification
或Relationship
的類型可以具有屬性的集合。每個屬性都有一個名稱(例如: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中的entity
是type
的特定值或實例,因此表示現實世界中的特定元數據對象。用我們對面向對象編程語言的類比,實例(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的血緣如何演變。