Atlas允許用戶爲他們想要管理的元數據對象定義模型。該模型由稱爲type(類型)的定義組成。稱爲entities(實體)的type(類型)實例表示受管理的實際元數據對象。 Type System是一個允許用戶定義和管理類型和實體的組件。開箱即用的Atlas管理的所有元數據對象(例如Hive表)都使用類型建模並表示爲實體。要在Atlas中存儲新類型的元數據,需要了解類型系統組件的概念
Type
Type(類型)在Atlas中代表了一類數據, 以Hive爲例(看源碼:HiveDataTypes)
Type:Atlas中的 “類型” 定義瞭如何存儲和訪問特定類型的元數據對象。類型表示了所定義元數據對象的一個或多個屬性集合。具有開發背景的用戶可以將 “類型” 理解成面向對象的編程語言的 “類” 定義的或關係數據庫的 “表模式”。類型具有元類型,如hdfs_path Type,hive_db Type,hive_table Type,hive_column
使用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類型的引用列表)
Classification
分類傳播允許與實體關聯的分類自動與實體的其他相關實體關聯。這對於處理數據集從其他數據集派生數據的場景非常有用,將分類一直繼承下去,可以選擇有效期,是否延續下去
Entity
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類型的值是在實體本身內“嵌入”的屬性集合。
Glossary(術語)
Atlas的術語表(Glossary)提供了一些適當的“單詞”,這些“單詞”能彼此進行關連和分類,以便業務用戶在使用的時候,即使在不同的上下文中也能很好的理解它們。此外,這些術語也是可以映射到數據資產中的,比如:數據庫,表,列等。術語表抽象出了和數據相關的專業術語,使得用戶能以他們更熟悉的方式去查找和使用數據,作用如下:
- 能夠使用自然語言(技術術語和/或業務術語)定義豐富的術語詞彙表。
- 能夠將術語在語義上相互關聯。
- 能夠將資產映射到術語表中。
- 能夠按類別劃分這些術語。這爲術語增加了更多的上下文。
- 允許按層次結構排列類別,能展示更廣泛和更精細的範圍。
- 從元數據中獨立管理術語表
術語(Term)
對於企業來說術語作用的非常大的。對於有用且有意義的術語,需要圍繞其用途和上下文進行分組。 Apache Atlas中的術語必須具有唯一的qualifiedName,可以有相同名稱的術語,但它們不能屬於同一個術語表。具有相同名稱的術語只能存在於不同的術語表中。
術語名稱可以包含空格,下劃線和短劃線(作爲引用單詞的自然方式)但不包含“。”或“@”,因爲qualifiedName的格式爲:<術語>@<術語限定名>
。限定名稱可以更輕鬆地使用特定術語。
術語只能屬於單個術語表,並且它們的生命週期也是相同的,如果刪除術語表,則術語也會被刪除。術語可以屬於零個或多個類別,這允許將它們限定爲更小或更大的上下文。
可以在Apache Atlas中爲一個或多個實體分配/鏈接一個術語。可以使用分類(classifications
,類似標籤的作用)對術語進行分類,並將相同的分類應用於分配術語的實體。
類別(Category)
類別是組織術語的一種方式,以便可以豐富術語的上下文。
類別可能包含也可能不包含層次結構,即子類別層次結構。類別的qualifiedName是使用它在術語表中的分層位置導出的,例如:<類別名稱>.<父類別限定名>
。當發生任何層級更改時,此限定名稱都會更新,例如:添加父類別,刪除父類別或更改父類別。
Attribute
類型系統中,Type和Entity都是有屬性的。Attribute定義了Type和Entity的具體屬性。然而,Atlas中的attributes具有一些properties,這些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系統強制執行的特定建模行爲(約束,索引等)。
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的血緣如何演變。