Hadoop的元數(shù)據(jù)治理--Apache Atlas
Apache Atlas是Hadoop社區(qū)為解決Hadoop生態(tài)系統(tǒng)的元數(shù)據(jù)治理問題而產(chǎn)生的開源項(xiàng)目,它為Hadoop集群提供了包括數(shù)據(jù)分類、集中策略引擎、數(shù)據(jù)血緣、安全和生命周期管理在內(nèi)的元數(shù)據(jù)治理核心能力。
Apache Atlas目前是Apache下的孵化項(xiàng)目,最新版本為Apache Atlas 0.8:

本文將分以下部分為大家介紹Atlas的架構(gòu)和核心功能:
- 概述
- 核心特性
- 架構(gòu)與組件
- 部署與配置
- 類型系統(tǒng)
- 元數(shù)據(jù)搜索與血緣
- 基于標(biāo)簽的安全策略
- 集成Apache Falcon
概述
面對海量且持續(xù)增加的各式各樣的數(shù)據(jù)對象,你是否有信心知道哪些數(shù)據(jù)從哪里來以及它如何隨時(shí)間而變化?采用Hadoop必須考慮數(shù)據(jù)管理的實(shí)際情況,元數(shù)據(jù)與數(shù)據(jù)治理成為企業(yè)級數(shù)據(jù)湖的重要部分。
為尋求數(shù)據(jù)治理的開源解決方案,Hortonworks 公司聯(lián)合其他廠商與用戶于2015年發(fā)起數(shù)據(jù)治理倡議,包括數(shù)據(jù)分類、集中策略引擎、數(shù)據(jù)血緣、安全和生命周期管理等方面。Apache Atlas 項(xiàng)目就是這個(gè)倡議的結(jié)果,社區(qū)伙伴持續(xù)的為該項(xiàng)目提供新的功能和特性。該項(xiàng)目用于管理共享元數(shù)據(jù)、數(shù)據(jù)分級、審計(jì)、安全性以及數(shù)據(jù)保護(hù)等方面,努力與Apache Ranger整合,用于數(shù)據(jù)權(quán)限控制策略。
Apache Atlas是hadoop的數(shù)據(jù)治理和元數(shù)據(jù)框架,它提供了一個(gè)可伸縮和可擴(kuò)展的核心基礎(chǔ)數(shù)據(jù)治理服務(wù)集,使得 企業(yè)可以有效的和高效的滿足Hadoop中的合規(guī)性要求,并允許與整個(gè)企業(yè)的數(shù)據(jù)生態(tài)系統(tǒng)集成:

核心特性
Apache Atlas為Hadoop的元數(shù)據(jù)治理提供了以下特性:
- 數(shù)據(jù)分類
? - 為元數(shù)據(jù)導(dǎo)入或定義業(yè)務(wù)導(dǎo)向的分類注釋
? - 定義,注釋,以及自動(dòng)捕獲數(shù)據(jù)集和底層元素之間的關(guān)系
? - 導(dǎo)出元數(shù)據(jù)到第三方系統(tǒng)
- 集中審計(jì)
? - 捕獲與所有應(yīng)用,過程以及與數(shù)據(jù)交互的安全訪問信息
? - 捕獲執(zhí)行,步驟,活動(dòng)等操作的信息
- 搜索與血緣
? - 預(yù)定義的導(dǎo)航路徑用來探索數(shù)據(jù)分類以及審計(jì)信息
? - 基于文本的搜索特性來快速和準(zhǔn)確的定位相關(guān)聯(lián)的數(shù)據(jù)和審計(jì)事件
? - 對數(shù)據(jù)集血緣關(guān)系的可視化瀏覽使用戶可以下鉆到操作,安全以及數(shù)據(jù)起源相關(guān)的信息
- 安全與策略引擎
? - 基于數(shù)據(jù)分類模式,屬性以及角色的運(yùn)行時(shí)合理合規(guī)策略
? - 基于分類-預(yù)測的高級策略定義以防止數(shù)據(jù)推導(dǎo)
? - 基于cell的屬性和值的行/列級別的masking
Apache Atlas的架構(gòu)如下圖所示:

Atlas的組件可以分為以下幾個(gè)部分:
- Core
此類別包含實(shí)現(xiàn) Atlas 功能核心的組件,包括:
? - Type System: Atlas 允許用戶為他們想要管理的元數(shù)據(jù)對象定義一個(gè)模型。該模型由稱為 "類型" 的定義組成。"類型" 的 實(shí)例被稱為 "實(shí)體" 表示被管理的實(shí)際元數(shù)據(jù)對象。類型系統(tǒng)是一個(gè)組件,允許用戶定義和管理類型和實(shí)體。由 Atlas 管理的所有元數(shù)據(jù)對象(例如Hive表)都使用類型進(jìn)行建模,并表示為實(shí)體。要在 Atlas 中存儲新類型的元數(shù)據(jù),需要了解類型系統(tǒng)組件的概念。
? - Ingest/Export:Ingest 組件允許將元數(shù)據(jù)添加到 Atlas。類似地,Export 組件暴露由 Atlas 檢測到的元數(shù)據(jù)更改,以作為事件引發(fā),消費(fèi)者可以使用這些更改事件來實(shí)時(shí)響應(yīng)元數(shù)據(jù)更改。
? - Graph Engine:在內(nèi)部,Atlas 通過使用圖形模型管理元數(shù)據(jù)對象。以實(shí)現(xiàn)元數(shù)據(jù)對象之間的巨大靈活性和豐富的關(guān)系。圖形引擎是負(fù)責(zé)在類型系統(tǒng)的類型和實(shí)體之間進(jìn)行轉(zhuǎn)換的組件,以及基礎(chǔ)圖形模型。除了管理圖形對象之外,圖形引擎還為元數(shù)據(jù)對象創(chuàng)建適當(dāng)?shù)乃饕?,以便有效地搜索它們?/p>
? - Titan:目前,Atlas 使用 Titan 圖數(shù)據(jù)庫來存儲元數(shù)據(jù)對象。 Titan 使用兩個(gè)存儲:默認(rèn)情況下元數(shù)據(jù)存儲配置為 HBase ,索引存儲配置為 Solr。也可以通過構(gòu)建相應(yīng)的配置文件使用BerkeleyDB存儲元數(shù)據(jù)存儲 和使用ElasticSearch存儲 Index。元數(shù)據(jù)存儲用于存儲元數(shù)據(jù)對象本身,索引存儲用于存儲元數(shù)據(jù)屬性的索引,其允許高效搜索。
- Integration
用戶可以使用兩種方法管理 Atlas 中的元數(shù)據(jù):
? - API: Atlas 的所有功能都可以通過 REST API 提供給最終用戶,允許創(chuàng)建,更新和刪除類型和實(shí)體。它也是查詢和發(fā)現(xiàn)通過 Atlas 管理的類型和實(shí)體的主要方法。
? - Messaging:除了 API 之外,用戶還可以選擇使用基于 Kafka 的消息接口與 Atlas 集成。這對于將元數(shù)據(jù)對象傳輸?shù)?Atlas 以及從 Atlas 使用可以構(gòu)建應(yīng)用程序的元數(shù)據(jù)更改事件都非常有用。如果希望使用與 Atlas 更松散耦合的集成,這可以允許更好的可擴(kuò)展性,可靠性等,消息傳遞接口是特別有用的。Atlas 使用 Apache Kafka 作為通知服務(wù)器用于鉤子和元數(shù)據(jù)通知事件的下游消費(fèi)者之間的通信。事件由鉤子(hook)和 Atlas 寫到不同的 Kafka 主題:
? ? - ATLAS_HOOK: 來自 各個(gè)組件的Hook 的元數(shù)據(jù)通知事件通過寫入到名為 ATLAS_HOOK 的 Kafka topic 發(fā)送到 Atlas
? ? - ATLAS_ENTITIES:從 Atlas 到其他集成組件(如Ranger)的事件寫入到名為 ATLAS_ENTITIES 的 Kafka topic
- Metadata source
Atlas 支持與許多元數(shù)據(jù)源的集成,將來還會(huì)添加更多集成。目前,Atlas 支持從以下數(shù)據(jù)源獲取和管理元數(shù)據(jù):
? - Hive:通過hive bridge, atlas可以接入Hive的元數(shù)據(jù),包括hive_db/hive_table/hive_column/hive_process
? - Sqoop:通過sqoop bridge,atlas可以接入關(guān)系型數(shù)據(jù)庫的元數(shù)據(jù),包括sqoop_operation_type/ sqoop_dbstore_usage/sqoop_process/sqoop_dbdatastore
? - Falcon:通過falcon bridge,atlas可以接入Falcon的元數(shù)據(jù),包括falcon_cluster/falcon_feed/falcon_feed_creation/falcon_feed_replication/ falcon_process
? - Storm:通過storm bridge,atlas可以接入流式處理的元數(shù)據(jù),包括storm_topology/storm_spout/storm_bolt
? Atlas集成大數(shù)據(jù)組件的元數(shù)據(jù)源需要實(shí)現(xiàn)以下兩點(diǎn):
? - 首先,需要基于atlas的類型系統(tǒng)定義能夠表達(dá)大數(shù)據(jù)組件元數(shù)據(jù)對象的元數(shù)據(jù)模型(例如Hive的元數(shù)據(jù)模型實(shí)現(xiàn)在org.apache.atlas.hive.model.HiveDataModelGenerator);
? - 然后,需要提供hook組件去從大數(shù)據(jù)組件的元數(shù)據(jù)源中提取元數(shù)據(jù)對象,實(shí)時(shí)偵聽元數(shù)據(jù)的變更并反饋給atlas;
- Applications
? - Atlas Admin UI: 該組件是一個(gè)基于 Web 的應(yīng)用程序,允許數(shù)據(jù)管理員和科學(xué)家發(fā)現(xiàn)和注釋元數(shù)據(jù)。Admin UI提供了搜索界面和 類SQL的查詢語言,可以用來查詢由 Atlas 管理的元數(shù)據(jù)類型和對象。Admin UI 使用 Atlas 的 REST API 來構(gòu)建其功能。
? - Tag Based Policies: Apache Ranger 是針對 Hadoop 生態(tài)系統(tǒng)的高級安全管理解決方案,與各種 Hadoop 組件具有廣泛的集成。通過與 Atlas 集成,Ranger 允許安全管理員定義元數(shù)據(jù)驅(qū)動(dòng)的安全策略,以實(shí)現(xiàn)有效的治理。 Ranger 是由 Atlas 通知的元數(shù)據(jù)更改事件的消費(fèi)者。
? - Business Taxonomy:從元數(shù)據(jù)源獲取到 Atlas 的元數(shù)據(jù)對象主要是一種技術(shù)形式的元數(shù)據(jù)。為了增強(qiáng)可發(fā)現(xiàn)性和治理能力,Atlas 提供了一個(gè)業(yè)務(wù)分類界面,允許用戶首先定義一組代表其業(yè)務(wù)域的業(yè)務(wù)術(shù)語,并將其與 Atlas 管理的元數(shù)據(jù)實(shí)體相關(guān)聯(lián)。業(yè)務(wù)分類法是一種 Web 應(yīng)用程序,目前是 Atlas Admin UI 的一部分,并且使用 REST API 與 Atlas 集成。
? ? - 在HDP2.5中,Business Taxonomy是提供了Technical Preview版本,需要在Atlas > Configs > Advanced > Custom application-properties中添加atlas.feature.taxonomy.enable=true并重啟atlas服務(wù)來開啟
部署與配置
在HDP集群中,可以通過Ambari快速部署Apache atlas服務(wù):

Ambari會(huì)部署啟動(dòng)Atlas metadata server和Atlas Metadata Client,并將自動(dòng)配置hive/sqoop/falcon/storm等服務(wù)的atlas hook(以Hive為例):

Apache Atlas需要依賴以下HDP組件:
- HBase:Titan默認(rèn)使用HBase存儲元數(shù)據(jù)
- Ambari infra/Solr:Titan默認(rèn)使用Solr存儲元數(shù)據(jù)索引
- Kafka:Apache Atlas使用Kafka作為消息隊(duì)列,實(shí)現(xiàn)hook和元數(shù)據(jù)通知事件的消費(fèi)者之間的通信
部署完Apache Atlas之后,可以通過腳本導(dǎo)入Atlas自帶的示例數(shù)據(jù):

Apache Atlas支持配置多個(gè)Atlas Web服務(wù)實(shí)例來實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移(failover),多個(gè)服務(wù)實(shí)例之間采取主動(dòng)/被動(dòng)模式。其中一個(gè)實(shí)例將被自動(dòng)選擇為 “活動(dòng)” 實(shí)例來為用戶請求提供服務(wù)。其他人將自動(dòng)被視為 “被動(dòng)”。如果 “活動(dòng)” 實(shí)例由于故意停止或由于意外故障而變得不可用,則其他實(shí)例之一將自動(dòng)選為 “活動(dòng)” 實(shí)例,并開始為用戶請求提供服務(wù)。
“活動(dòng)” 實(shí)例是能夠正確響應(yīng)用戶請求的唯一實(shí)例,其可以創(chuàng)建,刪除,修改或響應(yīng)元數(shù)據(jù)對象上的查詢。 “被動(dòng)” 實(shí)例將接受用戶請求,但會(huì)使用 HTTP 重定向?qū)⑵渲囟ㄏ虻疆?dāng)前已知的 “活動(dòng)” 實(shí)例。
多個(gè)Apache Atlas Web服務(wù)實(shí)例之間使用Zookeeper進(jìn)行協(xié)調(diào)。
當(dāng)配置為高可用性模式時(shí),具有以下優(yōu)勢:
- 在維護(hù)間隔期間不間斷服務(wù):如果需要停用 Atlas Web 服務(wù)的活動(dòng)實(shí)例進(jìn)行維護(hù),則另一個(gè)實(shí)例將自動(dòng)變?yōu)榛顒?dòng)狀態(tài)并可以為請求提供服務(wù)。
- 在意外故障事件中的不間斷服務(wù):如果由于軟件或硬件錯(cuò)誤,Atlas Web 服務(wù)的活動(dòng)實(shí)例失敗,另一個(gè)實(shí)例將自動(dòng)變?yōu)榛顒?dòng)狀態(tài)并可以為請求提供服務(wù)。
Apache Atlas的高可用性目前只支持手動(dòng)配置,Ambari尚不支持添加新的Atlas Metadata Server。
類型系統(tǒng)
Atlas 允許用戶為他們想要管理的元數(shù)據(jù)對象定義一個(gè)模型。該模型由稱為 “類型” (type)的定義組成。被稱為 “實(shí)體” (entities)的 “類型” 實(shí)例表示被管理的實(shí)際元數(shù)據(jù)對象。由 Atlas 管理的所有元數(shù)據(jù)對象(例如Hive表)都使用類型進(jìn)行建模,并表示為實(shí)體。
- Type:Atlas中的 “類型” 定義了如何存儲和訪問特定類型的元數(shù)據(jù)對象。類型表示了所定義元數(shù)據(jù)對象的一個(gè)或多個(gè)屬性集合。具有開發(fā)背景的用戶可以將 “類型” 理解成面向?qū)ο蟮木幊陶Z言的 “類” 定義的或關(guān)系數(shù)據(jù)庫的 “表模式”。類型具有元類型,元類型表示 Atlas 中此模型的類型:
? - 基本元類型: Int,String,Boolean等
? - 枚舉元類型
? - 集合元類型:例如Array,Map
? - Class,Struct,Trait
- Entities:Atlas中的 “實(shí)體” 是類 “類型” 的特定值或?qū)嵗?,因此表示真?shí)世界中的特定元數(shù)據(jù)對象。 回顧我們的面向?qū)ο缶幊陶Z言的類比,“實(shí)例” 是某個(gè) “類” 的 “對象”。
- Attributes:Atlas 中的屬性還有一些屬性,其定義了與類型系統(tǒng)相關(guān)的更多概念,包括:
? - isComposite - 是否復(fù)合
? - isIndexable - 是否索引
? - isUnique - 是否唯一
? - multiplicity - 指示此屬性是(必需的/可選的/還是可以是多值)的
Atlas 提供了一些預(yù)定義的系統(tǒng)類型:
- Referenceable:此類型表示可使用名為 qualifiedName 的唯一屬性搜索的所有實(shí)體
- Asset:此類型包含名稱,說明和所有者等屬性
- Infrastructure:此類型擴(kuò)展了Referenceable和Asset ,通??捎糜诨A(chǔ)設(shè)施元數(shù)據(jù)對象(如群集,主機(jī)等)的常用超類型
- DataSet:此類型擴(kuò)展了Referenceable和Asset 。在概念上,它可以用于表示存儲數(shù)據(jù)的類型。在 Atlas 中,hive表,Sqoop RDBMS表等都是從 DataSet 擴(kuò)展的類型。擴(kuò)展 DataSet 的類型可以期望具有模式,它們將具有定義該數(shù)據(jù)集的屬性的屬性。例如, hive_table 中的 columns 屬性。另外,擴(kuò)展 DataSet 的實(shí)體類型的實(shí)體參與數(shù)據(jù)轉(zhuǎn)換,這種轉(zhuǎn)換可以由 Atlas 通過 lineage(或 provenance)生成圖形。
- Process:此類型擴(kuò)展了Referenceable和Asset 。在概念上,它可以用于表示任何數(shù)據(jù)變換操作。例如,將原始數(shù)據(jù)的 hive 表轉(zhuǎn)換為存儲某個(gè)聚合的另一個(gè) hive 表的 ETL 過程可以是擴(kuò)展過程類型的特定類型。流程類型有兩個(gè)特定的屬性,輸入和輸出。
元數(shù)據(jù)搜索與血緣
Atlas 支持使用以下 2 種方式搜索元數(shù)據(jù):
- Search using DSL

- Full-text search
? - Atlas也支持lucene風(fēng)格的全文檢索
Apache atlas的其中一個(gè)核心特性就是可以追溯數(shù)據(jù)湖(Data Lake)中數(shù)據(jù)的血緣關(guān)系并以可視化的方式呈現(xiàn),使用戶能夠快速了解數(shù)據(jù)的生命周期,并能夠知曉自己的數(shù)據(jù)時(shí)從那里來以及和數(shù)據(jù)湖中的那些數(shù)據(jù)具有關(guān)聯(lián)關(guān)系。
參考下面的例子,創(chuàng)建兩張hive表,然后通過表的join創(chuàng)建一張新表:
- 創(chuàng)建一張hive表存儲以數(shù)組形式存儲tweet文本中的單詞
? CREATE TABLE words_array AS SELECT tweet_id AS id, split(text,' ') AS words FROM tweets;
- 創(chuàng)建一張hive表將文本中的數(shù)組切分成單獨(dú)的單詞
? CREATE TABLE tweet_word AS SELECT id AS id, word FROM words_array LATERAL VIEW explode(words) w as word;
- 通過對上述表的Join操作創(chuàng)建新的表
? CREATE TABLE word_join AS SELECT tweet_word.id, tweet_word.word, sentiment_dictionary.rating FROM tweet_word LEFT OUTER JOIN sentiment_dictionary ON (tweet_word.word=sentiment_dictionary.word);
在Atlas中,上述操作生成的word_join表的血緣關(guān)系圖如下所示:

基于標(biāo)簽的安全策略
Atlas通過與Ranger集成,為Hadoop提供了基于標(biāo)簽(Tag)的動(dòng)態(tài)訪問權(quán)限控制,通過控制與資源關(guān)聯(lián)的標(biāo)簽而非資源本身可以為權(quán)限控制模型提供諸多便利:
- 將資源分類從權(quán)限控制中分離出來,不同Hadoop組件的資源(比如HDFS目錄,Hive表,HBase表)中的同一類數(shù)據(jù)(比如社保賬號/信用卡帳號)可以被打上同一個(gè)標(biāo)簽,以統(tǒng)一的權(quán)限來控制訪問
- 如果Hadoop資源被打上標(biāo)簽,那么與標(biāo)簽相關(guān)的權(quán)限將被自動(dòng)賦予該資源
- 單獨(dú)的訪問控制策略可以應(yīng)用于不同的Hadoop組件的資源,而不再需要為每一個(gè)組件的資源都創(chuàng)建單獨(dú)的策略
Ranger 0.6版本引入了一個(gè)新的服務(wù)(ranger-tagsync)用來同步Atlas的tag,ranger-tagsync通過監(jiān)聽Kafka topic(ATLAS_ENTITIES)的消息變更來接受來自Atlas的tag(以及Taxonomy Terms)詳細(xì)信息;當(dāng)Atlas的tag(以及Taxonomy Terms)在atlas里被增加,修改或刪除時(shí),ranger-tagsync會(huì)接受來自Kafka的通知并更新Ranger的數(shù)據(jù)庫(ranger.x_tag*)。

通用Ranger Admin UI創(chuàng)建基于標(biāo)簽的策略需要如下步驟:
- 創(chuàng)建tag服務(wù)實(shí)例(tag服務(wù)實(shí)例可以創(chuàng)建多個(gè)以歸類不同集群的基于標(biāo)簽策略)
? - Login to Ranger Admin
? - Select menu: Access Manager è Tag Based Policies
? - Click the + icon next to TAG
? - In ‘Service Name’ field, enter tagdev and click ‘Add’

- Ranger的各個(gè)組件的服務(wù)實(shí)例需要被更新以實(shí)施指定的tag服務(wù)實(shí)例所提供的基于標(biāo)簽的訪問控制策略,以hive為例:
? - Login to Ranger Admin
? - Select menu: Access Manager è Resource Based Policies
? - Click on the edit icon next to your hive service instance, like hdp_hive,
? - In ‘Select Tag Service’ field, select tag-test and click ‘Save’

- 在”Tag Based Policies”頁面創(chuàng)建基于策略的訪問控制策略,例如:

集成Apache Falcon
? - Atlas可以提供對Falcon元數(shù)據(jù)(cluster/feed/process)的存儲和搜索
? ? - Atlas的Falcon Hook監(jiān)聽Falcon的元數(shù)據(jù)變更(比如falcon feed/process的創(chuàng)建,更改,刪除)并將這些元數(shù)據(jù)變更詳細(xì)信息寫入Kafka的topic中,Atlas metadata server從Kafka接收到Falcon的元數(shù)然后作為entity更新到Titan數(shù)據(jù)庫中
? ? - 用戶通過Atlas Admin UI可以通過DSL或全文方式去搜索Falcon的元數(shù)據(jù)

- Atlas可以對Falcon元數(shù)據(jù)進(jìn)行分類(tag/taxonomy)

- Atlas可以展示Falcon元數(shù)據(jù)的血緣關(guān)系

總結(jié)
Apache Atlas為Hadoop集群提供了包括數(shù)據(jù)分類、集中策略引擎、數(shù)據(jù)血緣、安全和生命周期管理在內(nèi)的元數(shù)據(jù)治理核心能力,其與Apache Falcon,Apache Ranger相互整合可以形成完整的數(shù)據(jù)治理解決方案。但是Atlas目前還是Apache孵化項(xiàng)目,尚未成熟,有待發(fā)展。
Atlas目前還存在以下一些需要改進(jìn)之處:
- 缺乏對元數(shù)據(jù)的全局視圖,對元數(shù)據(jù)的血緣追溯只能夠展示具體某張表或某個(gè)SQL的生命周期(其前提是用戶必須對Hadoop的元數(shù)據(jù)結(jié)構(gòu)十分清楚,才能夠通過Atlas的查詢語句去定位自己需要了解的表)
- 0.8以前的版本,對元數(shù)據(jù)只能進(jìn)行只讀操作,例如只能展示Hive的表但是不能創(chuàng)建新表
- 與Hadoop各組件的集成尚待完善,例如Atlas對Hive的元數(shù)據(jù)變更操作的捕獲只支持hive CLI,不支持beeline/JDBC
Reference
- http://atlas.apache.org/
- https://zh.hortonworks.com/apache/atlas/