本文由 網易雲 發布。
作者:網易/劉勛(本篇文章僅限知乎內部分享,如需轉載,請取得作者同意授權。)
面對海量且持續增加的各式各樣的數據對象,你是否有信心知道哪些數據從哪里來以及它如何隨時間而變化?采用Hadoop必須考慮數據管理的實際情況,元數據與數據治理成為企業級數據湖的重要部分。
為尋求數據治理的開源解決方案,Hortonworks 公司聯合其他廠商與用戶於2015年發起數據治理倡議,包括數據分類、集中策略引擎、數據血緣、安全和生命周期管理等方面。Apache Atlas 項目就是這個倡議的結果,社區伙伴持續的為該項目提供新的功能和特性。該項目用於管理共享元數據、數據分級、審計、安全性以及數據保護等方面,努力與Apache Ranger整合,用於數據權限控制策略。
Atlas 是一個可擴展和可擴展的核心基礎治理服務集 - 使企業能夠有效地和高效地滿足 Hadoop 中的合規性要求,並允許與整個企業數據生態系統的集成。
Atlas 的組件可以分為以下主要類別:
Core
此類別包含實現 Atlas 功能核心的組件,包括:
Type System:Atlas 允許用戶為他們想要管理的元數據對象定義一個模型。該模型由稱為 "類型" 的定義組成。"類型" 的 實例被稱為 "實體" 表示被管理的實際元數據對象。類型系統是一個組件,允許用戶定義和管理類型和實體。由 Atlas 管理的所有元數據對象(例如Hive表)都使用類型進行建模,並表示為實體。要在 Atlas 中存儲新類型的元數據,需要了解類型系統組件的概念。
需要注意的一個關鍵點是,Atlas 中建模的通用性質允許數據管理員和集成者定義技術元數據和業務元數據。也可以使用 Atlas 的特征來定義兩者之間的豐富關系。
Ingest / Export:Ingest 組件允許將元數據添加到 Atlas。類似地,Export 組件暴露由 Atlas 檢測到的元數據更改,以作為事件引發,消費者可以使用這些更改事件來實時響應元數據更改。
Graph Engine :在內部,Atlas 通過使用圖形模型管理元數據對象。以實現元數據對象之間的巨大靈活性和豐富的關系。圖形引擎是負責在類型系統的類型和實體之間進行轉換的組件,以及基礎圖形模型。除了管理圖形對象之外,圖形引擎還為元數據對象創建適當的索引,以便有效地搜索它們。
Titan:目前,Atlas 使用 Titan 圖數據庫來存儲元數據對象。 Titan 使用兩個存儲:默認情況下元數據存儲配置為 HBase ,索引存儲配置為 Solr。也可以通過構建相應的配置文件將元數據存儲作為 BerkeleyDB 和 Index 存儲使用為 ElasticSearch。元數據存儲用於存儲元數據對象本身,並且索引存儲用於存儲元數據屬性的索引,其允許高效搜索。
Integration
用戶可以使用兩種方法管理 Atlas 中的元數據:
API:Atlas 的所有功能通過 REST API 提供給最終用戶,允許創建,更新和刪除類型和實體。它也是查詢和發現通過 Atlas 管理的類型和實體的主要方法。
Messaging:除了 API 之外,用戶還可以選擇使用基於 Kafka 的消息接口與 Atlas 集成。這對於將元數據對象傳輸到 Atlas 以及從 Atlas 使用可以構建應用程序的元數據更改事件都非常有用。如果希望使用與 Atlas 更松散耦合的集成,這可以允許更好的可擴展性,可靠性等,消息傳遞接口是特別有用的。Atlas 使用 Apache Kafka 作為通知服務器用於鈎子和元數據通知事件的下游消費者之間的通信。事件由鈎子和 Atlas 寫到不同的 Kafka 主題。
元數據源
Atlas 支持與許多元數據源的集成。將來還會添加更多集成。目前,Atlas 支持從以下來源獲取和管理元數據:
與其它元數據源集成意味着兩件事:有一些元數據模型,Atlas 定義本機來表示這些組件的對象。 Atlas 提供了從這些組件中通過實時或批處理模式獲取元數據對象的組件。
Apps
由 Atlas 管理的元數據各種應用程序使用,滿足許多治理用例。
Atlas Admin UI:該組件是一個基於 Web 的應用程序,允許數據管理員和科學家發現和注釋元數據。這里最重要的是搜索界面和 SQL 樣的查詢語言,可以用來查詢由 Atlas 管理的元數據類型和對象。管理 UI 使用 Atlas 的 REST API 來構建其功能。
Tag Based Policies:Apache Ranger 是針對 Hadoop 生態系統的高級安全管理解決方案,與各種 Hadoop 組件具有廣泛的集成。通過與 Atlas 集成,Ranger 允許安全管理員定義元數據驅動的安全策略,以實現有效的治理。 Ranger 是由 Atlas 通知的元數據更改事件的消費者。
Business Taxonomy:從元數據源獲取到 Atlas 的元數據對象主要是一種技術形式的元數據。為了增強可發現性和治理能力,Atlas 提供了一個業務分類界面,允許用戶首先定義一組代表其業務域的業務術語,並將其與 Atlas 管理的元數據實體相關聯。業務分類法是一種 Web 應用程序,目前是 Atlas Admin UI 的一部分,並且使用 REST API 與 Atlas 集成。
Type System
Overview
Atlas 允許用戶為他們想要管理的元數據對象定義一個模型。該模型由稱為 "類型" 的定義組成。被稱為 "實體" 的 "類型" 實例表示被管理的實際元數據對象。類型系統是一個組件,允許用戶定義和管理類型和實體。由 Atlas 管理的所有元數據對象(例如Hive表)都使用類型進行建模,並表示為實體。要在Atlas中存儲新類型的元數據,需要了解類型系統組件的概念。
Types
Atlas中的 "類型" 定義了如何存儲和訪問特定類型的元數據對象。類型表示了所定義元數據對象的一個或多個屬性集合。具有開發背景的用戶可以將 "類型" 理解成面向對象的編程語言的 "類" 定義的或關系數據庫的 "表模式"。
與 Atlas 本地定義的類型的示例是 Hive 表。 Hive 表用這些屬性定義:
Name: hive_table
MetaType: Class
SuperTypes: DataSet
Attributes:
name: String (name of the table)
db: Database object of type hive_db
owner: String
createTime: Date
lastAccessTime: Date
comment: String
retention: int
sd: Storage Description object of type hive_storagedesc
partitionKeys: Array of objects of type hive_column
aliases: Array of strings
columns: Array of objects of type hive_column
parameters: Map of String keys to String values
viewOriginalText: String
viewExpandedText: String
tableType: String
temporary: Boolean
從上面的例子可以注意到以下幾點:
-
Atlas中的類型由 "name" 唯一標識,
-
類型具有元類型。元類型表示 Atlas 中此模型的類型。 Atlas 有以下幾種類型:
-
基本元類型: Int,String,Boolean等。
-
枚舉元類型
-
集合元類型:例如Array,Map
-
復合元類型:Class,Struct,Trait
-
-
類型可以從稱為 "supertype" 的父類型 "extend" - 憑借這一點,它將包含在 "supertype" 中定義的屬性。這允許模型在一組相關類型等之間定義公共屬性。這再次類似於面向對象語言如何定義類的超類的概念。 Atlas 中的類型也可以從多個超類型擴展。
-
在該示例中,每個 hive 表從預定義的超類型(稱為 "DataSet")擴展。稍后將提供關於此預定義類型的更多細節。
-
-
具有 "Class","Struct" 或 "Trait" 的元類型的類型可以具有屬性集合。每個屬性都有一個名稱(例如 "name")和一些其他關聯的屬性。可以使用表達式 type_name.attribute_name 來引用屬性。還要注意,屬性本身是使用 Atlas 元類型定義的。
-
在這個例子中,hive_table.name 是一個字符串,hive_table.aliases 是一個字符串數組,hive_table.db 引用一個類型的實例稱為 hive_db 等等。
-
-
在屬性中鍵入引用(如hive_table.db)。使用這樣的屬性,我們可以在 Atlas 中定義的兩種類型之間的任意關系,從而構建豐富的模型。注意,也可以收集一個引用列表作為屬性類型(例如 hive_table.cols,它表示從 hive_table 到 hive_column 類型的引用列表)
Entities
Atlas中的 "實體" 是類 "類型" 的特定值或實例,因此表示真實世界中的特定元數據對象。 回顧我們的面向對象編程語言的類比,"實例" 是某個 "類" 的 "對象"。
實體的示例將是特定的 Hive 表。 說 "Hive" 在 "默認" 數據庫中有一個名為 "customers" 的表。 此表將是類型為 hive_table 的 Atlas 中的 "實體"。 通過作為類類型的實例,它將具有作為 Hive 表 "類型" 的一部分的每個屬性的值,例如:
id: "9ba387dd-fa76-429c-b791-ffc338d3c91f"
typeName: “hive_table”
values:
name: "customers"
db: "b42c6cfc-c1e7-42fd-a9e6-890e0adf33bc"
owner: "admin"
createTime: "2016-06-20T06:13:28.000Z"
lastAccessTime: "2016-06-20T06:13:28.000Z"
comment: null
retention: 0
sd: "ff58025f-6854-4195-9f75-3a3058dd8dcf"
partitionKeys: null
aliases: null
columns: ["65e2204f-6a23-4130-934a-9679af6a211f", "d726de70-faca-46fb-9c99-cf04f6b579a6", ...]
parameters: {"transient_lastDdlTime": "1466403208"}
viewOriginalText: null
viewExpandedText: null
tableType: "MANAGED_TABLE"
temporary: false
從上面的例子可以注意到以下幾點:
-
作為 Class Type 實例的每個實體都由唯一標識符 GUID 標識。此 GUID 由 Atlas 服務器在定義對象時生成,並在實體的整個生命周期內保持不變。在任何時間點,可以使用其 GUID 來訪問該特定實體。
-
在本示例中,默認數據庫中的 "customers" 表由GUID "9ba387dd-fa76-429c-b791-ffc338d3c91f" 唯一標識
-
-
實體具有給定類型,並且類型的名稱與實體定義一起提供。
-
在這個例子中,"customers" 表是一個 "hive_table"。
-
-
此實體的值是所有屬性名稱及其在 hive_table 類型定義中定義的屬性的值的映射。
-
屬性值將根據屬性的元類型。
-
基本元類型:整數,字符串,布爾值。例如。 'name'='customers','Temporary'='false'
-
集合元類型:包含元類型的值的數組或映射。例如。 parameters = {"transient_lastDdlTime":"1466403208"}
-
復合元類型:對於類,值將是與該特定實體具有關系的實體。例如。hive 表 "customers" 存在於稱為 "default" 的數據庫中。
-
表和數據庫之間的關系通過 "db" 屬性捕獲。因此,"db" 屬性的值將是一個唯一標識 hive_db 實體的 GUID,稱為 "default"對於實體的這個想法,我們現在可以看到 Class 和 Struct 元類型之間的區別。類和結構體都組成其他類型的屬性。但是,類類型的實體具有 Id 屬性(具有GUID值)並且可以從其他實體引用(如 hive_db 實體從 hive_table 實體引用)。 Struct 類型的實例沒有自己的身份,Struct 類型的值是在實體本身內嵌入的屬性的集合。
Attributes
我們已經看到屬性在復合元類型(如 Class 和 Struct)中定義。 但是我們簡單地將屬性稱為具有名稱和元類型值。 然而, Atlas 中的屬性還有一些屬性,定義了與類型系統相關的更多概念。
屬性具有以下屬性:
name: string,
dataTypeName: string,
isComposite: boolean,
isIndexable: boolean,
isUnique: boolean,
multiplicity: enum,
reverseAttributeName: string
以上屬性具有以下含義:
-
name - 屬性的名稱
-
dataTypeName - 屬性的元類型名稱(本機,集合或復合)
-
isComposite - 是否復合
-
此標志指示建模的一個方面。如果一個屬性被定義為復合,它意味着它不能有一個生命周期與它所包含的實體無關。這個概念的一個很好的例子是構成 hive 表一部分的一組列。由於列在 hive 表之外沒有意義,它們被定義為組合屬性。
-
必須在 Atlas 中創建復合屬性及其所包含的實體。即,必須與 hive 表一起創建 hive 列。
-
-
isIndexable - 是否索引
-
此標志指示此屬性是否應該索引,以便可以使用屬性值作為謂詞來執行查找,並且可以有效地執行查找。
-
-
isUnique - 是否唯一
-
此標志再次與索引相關。如果指定為唯一,這意味着為 Titan 中的此屬性創建一個特殊索引,允許基於等式的查找。
-
具有此標志的真實值的任何屬性都被視為主鍵,以將此實體與其他實體區分開。因此,應注意確保此屬性在現實世界中模擬獨特的屬性。
-
例如,考慮 hive_table 的 name 屬性。孤立地,名稱不是 hive_table 的唯一屬性,因為具有相同名稱的表可以存在於多個數據庫中。如果 Atlas 在多個集群中存儲 hive 表的元數據,即使一對(數據庫名稱,表名稱)也不是唯一的。只有集群位置,數據庫名稱和表名稱可以在物理世界中被視為唯一。
-
-
-
multiplicity - 指示此屬性是(必需的/可選的/還是可以是多值)的。如果實體的屬性值的定義與類型定義中的多重性聲明不匹配,則這將是一個約束違反,並且實體添加將失敗。因此,該字段可以用於定義元數據信息上的一些約束。
使用上面的內容,讓我們擴展下面的 hive 表的屬性之一的屬性定義。讓我們看看稱為 "db" 的屬性,它表示 hive 表所屬的數據庫:
db:
"dataTypeName": "hive_db",
"isComposite": false,
"isIndexable": true,
"isUnique": false,
"multiplicity": "required",
"name": "db",
"reverseAttributeName": null
注意多重性的 "multiplicity" = "required" 約束。 如果沒有 db 引用,則不能發送表實體。
columns:
"dataTypeName": "array<hive_column>",
"isComposite": true,
"isIndexable": true,
“isUnique": false,
"multiplicity": "optional",
"name": "columns",
"reverseAttributeName": null
請注意列的 "isComposite" = true 值。通過這樣做,我們指示定義的列實體應該始終綁定到它們定義的表實體。
從這個描述和示例中,您將能夠意識到屬性定義可以用於影響 Atlas 系統要執行的特定建模行為(約束,索引等)。
系統特定類型及其意義
Atlas 提供了一些預定義的系統類型。我們在前面的章節中看到了一個例子(DataSet)。在本節中,我們將看到所有這些類型並了解它們的意義。
Referenceable:此類型表示可使用名為 qualifiedName 的唯一屬性搜索的所有實體。
Asset:此類型包含名稱,說明和所有者等屬性。名稱是必需屬性(multiplicity = required),其他是可選的。可引用和資源的目的是為定型器提供在定義和查詢其自身類型的實體時強制一致性的方法。擁有這些固定的屬性集允許應用程序和用戶界面基於約定基於默認情況下他們可以期望的屬性的假設。
Infrastructure:此類型擴展了可引用和資產,通常可用於基礎設施元數據對象(如群集,主機等)的常用超類型。
DataSet:此類型擴展了可引用和資產。在概念上,它可以用於表示存儲數據的類型。在 Atlas 中,hive表,Sqoop RDBMS表等都是從 DataSet 擴展的類型。擴展 DataSet 的類型可以期望具有模式,它們將具有定義該數據集的屬性的屬性。例如, hive_table 中的 columns 屬性。另外,擴展 DataSet 的實體類型的實體參與數據轉換,這種轉換可以由 Atlas 通過 lineage(或 provenance)生成圖形。
Process:此類型擴展了可引用和資產。在概念上,它可以用於表示任何數據變換操作。例如,將原始數據的 hive 表轉換為存儲某個聚合的另一個 hive 表的 ETL 過程可以是擴展過程類型的特定類型。流程類型有兩個特定的屬性,輸入和輸出。輸入和輸出都是 DataSet 實體的數組。因此,Process 類型的實例可以使用這些輸入和輸出來捕獲 DataSet 的 lineage 如何演變。
Search
Atlas 支持以下 2 種方式搜索元數據:
-
Search using DSL
-
Full-text search
Hive Model
默認 hive 建模在 org.apache.atlas.hive.model.HiveDataModelGenerator 中可用。 它定義以下類型:
hive_db(ClassType) - super types [Referenceable] - attributes [name, clusterName, description, locationUri, parameters, ownerName, ownerType]
hive_storagedesc(ClassType) - super types [Referenceable] - attributes [cols, location, inputFormat, outputFormat, compressed, numBuckets, serdeInfo, bucketCols, sortCols, parameters, storedAsSubDirectories]
hive_column(ClassType) - super types [Referenceable] - attributes [name, type, comment, table]
hive_table(ClassType) - super types [DataSet] - attributes [name, db, owner, createTime, lastAccessTime, comment, retention, sd, partitionKeys, columns, aliases, parameters, viewOriginalText, viewExpandedText, tableType, temporary]
hive_process(ClassType) - super types [Process] - attributes [name, startTime, endTime, userName, operationType, queryText, queryPlan, queryId]
hive_principal_type(EnumType) - values [USER, ROLE, GROUP]
hive_order(StructType) - attributes [col, order]
hive_serde(StructType) - attributes [name, serializationLib, parameters]
使用唯一的限定名稱創建和去重復實體。它們提供命名空間,也可以用於 query/lineage。請注意,dbName,tableName 和 columnName 應為小寫。 clusterName 解釋如下。
-
hive_db - attribute qualifiedName - <dbName>@<clusterName>
-
hive_table - attribute qualifiedName - <dbName>.<tableName>@<clusterName>
-
hive_column - attribute qualifiedName - <dbName>.<tableName>.<columnName>@<clusterName>
-
hive_process - attribute name - <queryString> - 小寫的修剪查詢字符串
導入 Hive Metadata
org.apache.atlas.hive.bridge.HiveMetaStoreBridge 使用 org.apache.atlas.hive.model.HiveDataModelGenerator 中定義的模型將 Hive 元數據導入 Atlas。 import-hive.sh 命令可以用來方便這一點。腳本需要 Hadoop 和 Hive 類路徑 jar。 對於 Hadoop jar,請確保環境變量 HADOOP_CLASSPATH 已設置。另一種方法是將 HADOOP_HOME 設置為指向 Hadoop 安裝的根目錄同樣,對於 Hive jar,將 HIVE_HOME 設置為 Hive 安裝的根目錄將環境變量 HIVE_CONF_DIR 設置為 Hive 配置目錄復制 ${atlas-conf}/atlas-application.properties 到 hive conf 目錄
Usage: <atlas package>/hook-bin/import-hive.sh
日志位於 ${atlas package}/logs/import-hive.log
如果要在 kerberized 集群中導入元數據,則需要運行以下命令:
<atlas package>/hook-bin/import-hive.sh -Dsun.security.jgss.debug=true -Djavax.security.auth.useSubjectCredsOnly=false -Djava.security.krb5.conf=[krb5.conf location] -Djava.security.auth.login.config=[jaas.conf location]
-
krb5.conf is typically found at /etc/krb5.conf
-
for details about jaas.conf and a suggested location see the atlas security documentation
Hive Hook
Hive 在使用 hive hook 的 hive 命令執行上支持偵聽器。 這用於在 Atlas 中使用 org.apache.atlas.hive.model.HiveDataModelGenerator 中定義的模型添加/更新/刪除實體。 hive hook 將請求提交給線程池執行器,以避免阻塞命令執行。 線程將實體作為消息提交給通知服務器,並且服務器讀取這些消息並注冊實體。 按照 hive 設置中的這些說明為 Atlas 添加 hive hook :
-
Set-up atlas hook in hive-site.xml of your hive configuration:
<property>
<name>hive.exec.post.hooks</name>
<value>org.apache.atlas.hive.hook.HiveHook</value>
</property>
<property>
<name>atlas.cluster.name</name>
<value>primary</value>
</property>
-
Add 'export HIVE_AUX_JARS_PATH=<atlas package>/hook/hive' in hive-env.sh of your hive configuration
-
Copy <atlas-conf>/atlas-application.properties to the hive conf directory.
在<atlas-conf> /atlas-application.properties中的以下屬性控制線程池和通知詳細信息:
-
atlas.hook.hive.synchronous - boolean,true來同步運行鈎子。 默認false。 建議設置為false,以避免 hive 查詢完成中的延遲。
-
atlas.hook.hive.numRetries - 通知失敗的重試次數。 默認值 3
-
atlas.hook.hive.minThreads - 核心線程數。 默認值 5
-
atlas.hook.hive.maxThreads - 最大線程數。 默認值 5
-
atlas.hook.hive.keepAliveTime - 保持活動時間以毫秒為單位。 默認 10
-
atlas.hook.hive.queueSize - 線程池的隊列大小。 默認 10000
參考 Configuration 通知相關配置
Column Level Lineage
從 atlas-0.8-incubating 版本開始,在 Atlas 中捕獲列 lineage
Model
-
ColumnLineageProcess 類型是 Process 的子類
-
這將輸出列與一組輸入列或輸入表相關聯
-
Lineage 還捕獲 Dependency 的類型:當前的值是 SIMPLE,EXPRESSION,SCRIPT
-
SIMPLE依賴: 意味着輸出列具有與輸入相同的值
-
EXPRESSION依賴: 意味着輸出列被輸入列上的運行時中的一些表達式(例如Hive SQL表達式)轉換。
-
SCRIPT依賴: 表示輸出列由用戶提供的腳本轉換。
-
-
在 EXPRESSION 依賴的情況下,表達式屬性包含字符串形式的表達式
-
由於 Process 鏈接輸入和輸出 DataSet,我們使 Column 成為 DataSet 的子類
Examples
對於下面的簡單 CTAS:
create table t2 as select id, name from T1
lineage 為
Extracting Lineage from Hive commands
-
HiveHook 將 HookContext 中的 LineageInfo 映射到 Column lineage 實例
-
Hive 中的 LineageInfo 為最終的 FileSinkOperator 提供 Column lineage ,將它們鏈接到 Hive 查詢中的輸入列
NOTE
在將 HIVE-13112 的補丁應用於 Hive 源之后,列級別 lineage 與 Hive 版本1.2.1配合使用
Limitations
-
由於數據庫名,表名和列名在 hive 中不區分大小寫,因此實體中的對應名稱為小寫。 因此,任何搜索 API 都應該在查詢實體名稱時使用小寫
-
以下 hive 操作由 hive hook 當前捕獲
-
create database
-
create table/view, create table as select
-
load, import, export
-
DMLs (insert)
-
alter database
-
alter table (skewed table information, stored as, protection is not supported)
-
alter view
-
Sqoop Atlas Bridge
Sqoop Model
默認的 Sqoop 建模在 org.apache.atlas.sqoop.model.SqoopDataModelGenerator 中可用。 它定義以下類型:
sqoop_operation_type(EnumType) - values [IMPORT, EXPORT, EVAL]
sqoop_dbstore_usage(EnumType) - values [TABLE, QUERY, PROCEDURE, OTHER]
sqoop_process(ClassType) - super types [Process] - attributes [name, operation, dbStore, hiveTable, commandlineOpts, startTime, endTime, userName]
sqoop_dbdatastore(ClassType) - super types [DataSet] - attributes [name, dbStoreType, storeUse, storeUri, source, description, ownerName]
使用唯一的限定名稱創建和去重復實體。 它們提供命名空間,也可以用於查詢:sqoop_process - attribute name - sqoop-dbStoreType-storeUri-endTime sqoop_dbdatastore - attribute name - dbStoreType-connectorUrl-source
Sqoop Hook
Sqoop 添加了一個 SqoopJobDataPublisher,在完成導入作業后將數據發布到 Atlas。 現在 sqoopHook 只支持hiveImport。 這用於使用 org.apache.atlas.sqoop.model.SqoopDataModelGenerator 中定義的模型在 Atlas 中添加實體。 按照 sqoop 設置中的以下說明在 ${sqoop-conf}/sqoop-site.xml 中為 Atlas 添加 sqoop 鈎子:
-
Sqoop Job publisher class. Currently only one publishing class is supported
sqoop.job.data.publish.class org.apache.atlas.sqoop.hook.SqoopHook
-
Atlas cluster name
atlas.cluster.name
-
復制 ${atlas-conf}/atlas-application.properties 到 sqoop 的配置文件夾 ${sqoop-conf}/
-
Link ${atlas-home}/hook/sqoop/*.jar in sqoop libRefer Configuration for notification related configurations
Limitations
-
目前 sqoop hook 只支持 hiveImport 這一種 sqoop 操作
Falcon Atlas Bridge
Falcon Model
默認的falcon建模在 org.apache.atlas.falcon.model.FalconDataModelGenerator. 它可以定義以下類型:
falcon_cluster(ClassType) - super types [Infrastructure] - attributes [timestamp, colo, owner, tags]
falcon_feed(ClassType) - super types [DataSet] - attributes [timestamp, stored-in, owner, groups, tags]
falcon_feed_creation(ClassType) - super types [Process] - attributes [timestamp, stored-in, owner]
falcon_feed_replication(ClassType) - super types [Process] - attributes [timestamp, owner]
falcon_process(ClassType) - super types [Process] - attributes [timestamp, runs-on, owner, tags, pipelines, workflow-properties]
為 falcon 進程定義的每個集群創建一個 falcon_process 實體。
使用唯一的 qualifiedName 屬性創建和去重復實體。 它們提供命名空間,也可以用於查詢/沿襲。 唯一的屬性是:
-
falcon_process - <process name>@<cluster name>
-
falcon_cluster - <cluster name>
-
falcon_feed - <feed name>@<cluster name>
-
falcon_feed_creation - <feed name>
-
falcon_feed_replication - <feed name>
Falcon Hook
Falcon 支持在 falcon 實體提交上的偵聽器。 這用於在 Atlas 中使用 org.apache.atlas.falcon.model.FalconDataModelGenerator 中定義的模型添加實體。 hook 將請求提交給線程池執行器,以避免阻塞命令執行。 線程將實體作為消息提交給通知服務器,並且服務器讀取這些消息並注冊實體。
-
Add 'org.apache.atlas.falcon.service.AtlasService' to application.services in ${falcon-conf}/startup.properties
-
Link falcon hook jars in falcon classpath - 'ln -s atlas−home/hook/falcon/∗{falcon-home}/server/webapp/falcon/WEB-INF/lib/'
-
In ${falcon_conf}/falcon-env.sh, set an environment variable as follows:
export FALCON_SERVER_OPTS="<atlas_home>/hook/falcon/*:$FALCON_SERVER_OPTS"
The following properties in ${atlas-conf}/atlas-application.properties control the thread pool and notification details:
-
atlas.hook.falcon.synchronous - boolean, true to run the hook synchronously. default false
-
atlas.hook.falcon.numRetries - number of retries for notification failure. default 3
-
atlas.hook.falcon.minThreads - core number of threads. default 5
-
atlas.hook.falcon.maxThreads - maximum number of threads. default 5
-
atlas.hook.falcon.keepAliveTime - keep alive time in msecs. default 10
-
atlas.hook.falcon.queueSize - queue size for the threadpool. default 10000
Refer Configuration for notification related configurations
Limitations
-
在 falcon 集群實體中,使用的集群名稱應該跨諸如 hive,falcon,sqoop 等組件是統一的。如果與 ambari 一起使用,則應該使用 ambari 集群名稱用於集群實體
Storm Atlas Bridge
Introduction
Apache Storm 是一個分布式實時計算系統。 Storm 使得容易可靠地處理無界的數據流,為實時處理 Hadoop 對批處理所做的工作。 該過程實質上是節點的 DAG,其被稱為 topology。
Apache Atlas 是一個元數據存儲庫,支持端到端數據沿襲,搜索和關聯業務分類。
這種集成的目的是推動操作 topology 元數據以及基礎數據源,目標,推導過程和任何可用的業務上下文,以便 Atlas 可以捕獲此 topology 的 lineage。
在此過程中有2個部分詳述如下:
-
Data model to represent the concepts in Storm
-
Storm Atlas Hook to update metadata in Atlas
Storm Data Model
數據模型在 Atlas 中表示為 Types。 它包含 topology 圖中各種節點的描述,例如 spouts 和 bolts 以及相應的生產者和消費者類型。
在Atlas中添加以下類型。
-
storm_topology - 表示粗粒度拓撲。storm_topology 來自於 Atlas 過程類型,因此可用於通知 Atlas 關於 lineage。
-
添加以下數據集 - kafka_topic,jms_topic,hbase_table,hdfs_data_set。 這些都來自Atlas Dataset類型,因此形成譜系圖的端點。
-
storm_spout - 具有輸出的數據生產者,通常為Kafka,JMS
-
storm_bolt - 具有輸入和輸出的數據使用者,通常為Hive,HBase,HDFS等。
Storm Atlas hook自動注冊依賴模型,如Hive數據模型,如果它發現這些是不為Atlas服務器所知。
每個類型的數據模型在類定義org.apache.atlas.storm.model.StormDataModel中描述。
Storm Atlas Hook
當在 Storm 中成功注冊新 topology 時,通知 Atlas。 Storm 在 Storm 客戶端提供了一個鈎子,backtype.storm.ISubmitterHook,用於提交一個 Storm topology。
Storm Atlas hook 攔截 hook 后執行,並從 topology 中提取元數據,並使用定義的類型更新 Atlas。 Atlas 在org.apache.atlas.storm.hook.StormAtlasHook 中實現了 Storm 客戶端 hook 接口。
Limitations
以下內容適用於集成的第一個版本。
-
只有新的 topology 提交已注冊到 Atlas,任何生命周期變化都不會反映在 Atlas 中。
-
當為要捕獲的元數據提交 Storm topology 時,Atlas 服務器需要在線。
-
hook 目前不支持捕獲自定義 spouts 和 bolts 的 lineage。
Installation
Storm Atlas Hook 需要在客戶端手動安裝在 Storm 在:$ATLAS_PACKAGE/hook/storm
Storm Atlas Hook 需要復制到 $STORM_HOME/extlib。 使用 storm 安裝路徑替換 STORM_HOME。
在將安裝了 atlas hook 到 Storm 后重新啟動所有守護進程。
Configuration
Storm Configuration
Storm Atlas Hook 需要在 Storm 客戶端 $STORM_HOME/conf/storm.yaml 進行配置:
storm.topology.submission.notifier.plugin.class: "org.apache.atlas.storm.hook.StormAtlasHook"
還設置一個 "集群名稱",將用作在 Atlas 中注冊的對象的命名空間。 此名稱將用於命名 Storm topology,spouts 和 bolts。
其他對象(如 Dataset)應該理想地用生成它們的組件的集群名稱來標識。 例如, Hive 表和數據庫應該使用在 Hive 中設置的集群名稱來標識。 如果 Hive 配置在客戶端上提交的 Storm topology jar 中可用,並且在那里定義了集群名稱,Storm Atlas hook 將選擇此選項。 對於 HBase 數據集,這種情況類似。 如果此配置不可用,將使用在 Storm 配置中設置的集群名稱。
atlas.cluster.name: "cluster_name"
在 $STORM_HOME/conf/storm_env.ini 中, 設置以下環境變量:
STORM_JAR_JVM_OPTS:"-Datlas.conf=$ATLAS_HOME/conf/"
將 ATLAS_HOME 指向 ATLAS 的安裝目錄.
你也可以通過程序對 Storm 進行如下配置:
Config stormConf = new Config();
...
stormConf.put(Config.STORM_TOPOLOGY_SUBMISSION_NOTIFIER_PLUGIN,
org.apache.atlas.storm.hook.StormAtlasHook.class.getName());
容錯和高可用
簡介
Apache Atlas 使用各種系統並與其交互,為數據管理員提供元數據管理和數據 lineage。 通過適當地選擇和配置這些依賴關系,可以使用 Atlas 實現高度的服務可用性。 本文檔介紹了 Atlas 的高可用性支持狀態,包括其功能和當前限制,以及實現此級別高可用性所需的配置。
Atlas Web Service
目前,Atlas Web 服務有一個限制,它一次只能有一個活動實例。在早期版本的 Atlas 中,可以配置和保持備份實例。但是,需要手動故障轉移才能使此備份實例處於活動狀態。
從這個版本開始,Atlas 將支持帶有自動故障轉移的 主動/被動 配置中的 Atlas Web 服務的多個實例。這意味着用戶可以在不同的物理主機上同時部署和啟動 Atlas Web 服務的多個實例。其中一個實例將被自動選擇為 "活動" 實例來為用戶請求提供服務。其他人將自動被視為 "被動"。如果 "活動" 實例由於故意停止或由於意外故障而變得不可用,則其他實例之一將自動選為 "活動" 實例,並開始為用戶請求提供服務。
"活動" 實例是能夠正確響應用戶請求的唯一實例。它可以創建,刪除,修改或響應元數據對象上的查詢。 "被動" 實例將接受用戶請求,但會使用 HTTP 重定向將其重定向到當前已知的 "活動" 實例。具體來說,被動實例本身不會響應對元數據對象的任何查詢。但是,所有實例(包括主動和被動)都將響應返回有關該實例的信息的管理請求。
當配置為高可用性模式時,用戶可以獲得以下操作優勢:
-
在維護間隔期間不間斷服務:如果需要停用 Atlas Web 服務的活動實例進行維護,則另一個實例將自動變為活動狀態並可以為請求提供服務。
-
在意外故障事件中的不間斷服務:如果由於軟件或硬件錯誤,Atlas Web 服務的活動實例失敗,另一個實例將自動變為活動狀態並可以為請求提供服務。
在以下小節中,我們將介紹為 Atlas Web 服務設置高可用性所需的步驟。 我們還描述了如何設計部署和客戶端以利用此功能。 最后,我們描述一些底層實現的細節。
Setting up the High Availability feature in Atlas
設置高可用性功能必須滿足以下先決條件。
-
確保在一組計算機上安裝 Apache Zookeeper(建議至少使用3台服務器進行生產)。
-
選擇 2 個或更多物理機以在其上運行 Atlas Web Service 實例。這些機器定義了我們稱為 Atlas 的 "服務器集合"。
要在 Atlas 中設置高可用性,必須在 atlas-application.properties 文件中定義一些配置選項。雖然配置項的完整列表在配置頁中定義,但本節列出了幾個主要選項。
-
高可用性是 Atlas 的可選功能。因此,必須通過將配置選項 atlas.server.ha.enabled 設置為 true 來啟用。
-
接下來,定義標識符列表,為您為 Atlas Web Service 實例選擇的每個物理機器分配一個標識符。這些標識符可以是簡單的字符串,如id1,id2等。它們應該是唯一的,不應包含逗號。
-
將這些標識符的逗號分隔列表定義為選項 atlas.server.ids 的值。
-
對於每個物理機,請列出IP地址/主機名和端口作為配置 atlas.server.address.id 的值,其中 id 指的是此物理機的標識符字符串。
-
例如,如果您選擇了 2 台主機名為 http://host1.company.com 和 http://host2.company.com 的計算機,則可以如下定義配置選項:
atlas.server.ids=id1,id2 atlas.server.address.id1=host1.company.com:21000 atlas.server.address.id2=host2.company.com:21000
-
-
定義使用的 Zookeeper 為 Atlas 提供高可用性功能
atlas.server.ha.zookeeper.connect=zk1.company.com:2181,zk2.company.com:2181,zk3.company.com:2181
-
您可以查看為高可用性功能定義的其他配置選項,並根據需要在 atlas-application.properties 文件中進行設置。
-
對於生產環境,Atlas 所依賴的組件也必須在高可用性模式下設置。 這將在以下部分中詳細描述。 按照這些說明設置和配置它們。
-
在選定的物理機器上安裝 Atlas 軟件。
-
將使用上述步驟創建的 atlas-application.properties 文件復制到所有計算機的配置目錄。
-
啟動相關組件。
-
啟動 Atlas Web 服務的每個實例。
要驗證高可用性是否正常工作,請在安裝了 Atlas Web Service 的每個實例上運行以下腳本。
$ATLAS_HOME/bin/atlas_admin.py -status
此腳本可以打印以下值之一作為響應:
-
ACTIVE:此實例處於活動狀態,可以響應用戶請求。
-
PASSIVE:此實例為 PASSIVE。它會將它收到的任何用戶請求重定向到當前活動實例。
-
BECOMING_ACTIVE:如果服務器正在轉換為 ACTIVE 實例,則將打印此消息。在此狀態下,服務器無法處理任何元數據用戶請求。
-
BECOMING_PASSIVE:如果服務器正在轉換為 PASSIVE 實例,則將打印此消息。在此狀態下,服務器無法處理任何元數據用戶請求。
在正常操作情況下,只有其中一個實例應該打印 ACTIVE 值作為對腳本的響應,而其他實例將打印 PASSIVE。
配置客戶端以使用高可用性功能
Atlas Web 服務可以通過兩種方式訪問:
-
使用 Atlas Web UI:這是一個基於瀏覽器的客戶端,可用於查詢存儲在Atlas中的元數據。
-
使用 Atlas REST API:由於 Atlas 公開了一個 RESTful API,因此可以使用任何標准的 REST 客戶端,包括其他應用程序中的庫。事實上,Atlas 附帶了一個名為 AtlasClient 的客戶端,可以用作創建 REST 客戶端訪問的示例。
為了利用客戶端中的高可用性功能,可以有兩個選項。
使用中間代理
啟用高可用性訪問 Atlas 的最簡單的解決方案是安裝和配置一些中間代理,其具有基於狀態透明地切換服務的能力。一個這樣的代理解決方案是 HAProxy。
下面是一個可以使用的 HAProxy 配置示例。注意,這只是為了說明,而不是作為推薦的生產配置。為此,請參閱 HAProxy文檔以獲取相應的說明。
frontend atlas_fe
bind *:41000
default_backend atlas_be
backend atlas_be
mode http
option httpchk get /api/atlas/admin/status
http-check expect string ACTIVE
balance roundrobin
server host1_21000 host1:21000 check
server host2_21000 host2:21000 check backup
listen atlas
bind localhost:42000
以上配置綁定 HAProxy 偵聽端口 41000 傳入客戶端連接。然后根據 HTTP 狀態檢查將連接路由到主機 host1 或 host2 中的任一個。狀態檢查是使用 REST URL / api / atlas / admin / status 上的 HTTP GET 完成的,只有當 HTTP 響應包含字符串ACTIVE 時,才認為成功。
使用活動實例的自動檢測
如果不想設置和管理單獨的代理,則使用高可用性功能的另一個選項是構建能夠檢測狀態和重試操作的客戶端應用程序。在這樣的設置中,可以使用形成集合的所有 Atlas Web 服務實例的 URL 啟動客戶端應用程序。然后,客戶端應調用其中每一個上的 REST URL / api / atlas / admin / status,以確定哪個是活動實例。來自 Active 實例的響應將具有 {Status:ACTIVE}的形式。此外,當客戶端在操作過程中遇到任何異常時,它應該再次確定哪些剩余的URL是活動的並重試該操作。
Atlas 附帶的 AtlasClient 類可以用作一個示例客戶端庫,它實現了使用集合並選擇正確的Active服務器實例的邏輯。
Atlas 中的實用程序(如quick_start.py和import-hive.sh)可以配置為使用多個服務器URL運行。當在此模式下啟動時,AtlasClient 自動選擇並使用當前活動實例。如果在之間設置了代理,則可以在運行 quick_start.py 或 import-hive.sh 時使用其地址。
實現 Atlas 高可用
Atlas 高可用性工作在主 JIRA ATLAS-510 下進行跟蹤。根據其提交的 JIRA 具有關於高可用性功能如何實現的詳細信息。在高級別可以調出以下幾點:
-
活動實例的自動選擇以及到新的活動實例的自動故障轉移通過領導者選擇算法發生。
-
對於領導選舉,我們使用 Apache Curator 的 Leader Latch Recipe。
-
Active 實例是唯一一個在后端存儲中初始化,修改或讀取狀態以保持它們一致的實例。
-
此外,當實例被選為活動時,它會刷新后端存儲中的任何緩存信息以獲取最新信息。
-
servlet 過濾器確保只有活動的實例服務用戶請求。如果被動實例接收到這些請求,它會自動將它們重定向到當前活動實例。
Metadata Store
如上所述,Atlas 使用 Titan 來存儲它管理的元數據。默認情況下,Atlas 使用獨立的 HBase 實例作為 Titan 的后備存儲。為了為元數據存儲提供 HA,我們建議將 Atlas 配置為使用分布式 HBase 作為 Titan 的后備存儲。這意味着您可以從 HBase 提供的 HA 保證中受益。為了將 Atlas 配置為在 HA 模式下使用 HBase,請執行以下操作:
-
選擇在HA模式中設置的現有 HBase 集群以在 Atlas(OR)中配置在 HA模式 下設置新的 HBase 集群。
-
如果為 Atlas 設置 HBase,請按照 Installation Steps 中列出的用於設置 HBase 的說明進行操作。
-
-
我們建議在使用 Zookeeper 協調的不同物理主機上的集群中使用多個 HBase 主機(至少2個),以提供 HBase的 冗余和高可用性。
-
有關在 atlas.properties 中配置的選項的 Configuration page ,請參考配置頁面,以便使用 HBase 設置 Atlas。
-
Index Store
如上所述,Atlas 通過 Titan 索引元數據以支持全文搜索查詢。 為了為索引存儲提供 HA,我們建議將 Atlas 配置為使用 Solr作為 Titan 的后備索引存儲。 為了將 Atlas 配置為在 HA 模式下使用 Solr,請執行以下操作:
-
在 HA 模式下選擇現有的 SolrCloud 群集設置以在 Atlas(OR)中配置設置新的 SolrCloud 群集。
-
確保 Solr 在至少 2 個物理主機上啟動以實現冗余,並且每個主機運行 Solr 節點。
-
我們建議將冗余數設置為至少 2。
-
-
創建 Atlas 所需的 SolrCloud 集合,如安裝步驟中所述
-
請參閱配置頁面以了解在 atlas.properties 中配置的選項,以使用 Solr 設置 Atlas。
Notification Server
來自 Hook 的元數據通知事件通過寫入到名為 ATLAS_HOOK 的 Kafka topic 發送到 Atlas 。類似地,從 Atlas 到其他集成組件(如Ranger)的事件寫入名為 ATLAS_ENTITIES 的 Kafka topic。由於 Kafka 會保留這些消息,即使消費者在發送事件時失敗,事件也不會丟失。此外,我們建議 Kafka 也設置容錯,以便它具有更高的可用性保證。為了配置 Atlas 在 HA 模式下使用 Kafka,請執行以下操作:
-
選擇在 HA 模式中設置的現有 Kafka 集群以在 Atlas(OR)中配置設置新的 Kafka 集群。
-
我們建議在不同物理主機上的群集中有多個 Kafka 代理,它們使用 Zookeeper 協調,以提供 Kafka 的冗余和高可用性。
-
設置至少 2 個物理主機以實現冗余,每個托管一個 Kafka 代理。
-
-
為 Atlas 使用設置 Kafka 主題:
-
ATLAS 主題的分區數應設置為1(numPartitions)
-
確定 Kafka 主題的副本數量:將此值設置為至少 2 以進行冗余。
-
運行以下命令:
$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper <list of zookeeper host:port entries> --topic ATLAS_HOOK --replication-factor <numReplicas> --partitions 1 $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper <list of zookeeper host:port entries> --topic ATLAS_ENTITIES --replication-factor <numReplicas> --partitions 1 Here KAFKA_HOME points to the Kafka installation directory.
-
在 atlas-application.properties 中進行如下配置:
atlas.notification.embedded=false atlas.kafka.zookeeper.connect=<comma separated list of servers forming Zookeeper quorum used by Kafka> atlas.kafka.bootstrap.servers=<comma separated list of Kafka broker endpoints in host:port form> - Give at least 2 for redundancy.
-
Known Issues
-
如果托管 Atlas 'titan' HTable 的 HBase region servers 停機,Atlas 將無法在 HBase 恢復聯機之前從 HBase 存儲或檢索元數據。
網易有數:企業級大數據可視化分析平台。面向業務人員的自助式敏捷分析平台,采用PPT模式的報告制作,更加易學易用,具備強大的探索分析功能,真正幫助用戶洞察數據發現價值。可點擊這里免費試用。
了解 網易雲 :
網易雲官網:https://www.163yun.com/
新用戶大禮包:https://www.163yun.com/gift
網易雲社區:https://sq.163yun.com/