使用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
的預定義超型別擴充套件。稍後將提供有關此預定義型別的更多詳細資訊。
-
在此示例中,每個配置單元表都從稱為
-
具有元型別
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的血緣如何演變。