餓了麼元數據管理實踐之路

大數據挑戰

餓了麼元數據管理實踐之路

Challenge

多種執行、存儲引擎,分鐘、小時、天級的任務調度,怎樣梳理數據的時間線變化?

任務、表、列、指標等數據,如何進行檢索、複用、清理、熱度Top計算?

怎樣對錶、列、指標等進行權限控制,任務治理以及上下游依賴影響分析?

元數據定義、價值

元數據打通數據源、數據倉庫、數據應用,記錄了數據從產生到消費的完整鏈路。元數據包含靜態的表、列、分區信息(也就是MetaStore);動態的任務、表依賴映射關係;數據倉庫的模型定義、數據生命週期;以及ETL任務調度信息、輸入輸出等

元數據是數據管理、數據內容、數據應用的基礎。例如可以利用元數據構建任務、表、列、用戶之間的數據圖譜;構建任務DAG依賴關係,編排任務執行序列;構建任務畫像,進行任務質量治理;數據分析時,使用數據圖譜進行字典檢索;根據表名查看錶詳情,以及每張表的來源、去向,每個字段的加工邏輯;提供個人或BU的資產管理、計算資源消耗概覽等

開源解決方案

餓了麼元數據管理實踐之路

WhereHows


WhereHows是LinkedIn開源的元數據治理方案。Azkaban調度器抓取job執行日誌,也就是Hadoop的JobHistory,Log Parser後保存DB,並提供REST查詢。WhereHows太重,需要部署Azkaban等調度器,以及只支持表血緣,功能侷限

餓了麼元數據管理實踐之路

Atlas


Atlas是Apache開源的元數據治理方案。Hook執行中採集數據(比如HiveHook),發送Kafka,消費Kafka數據,生成Relation關係保存圖數據庫Titan,並提供REST接口查詢功能,支持表血緣,列級支持不完善

餓了麼元數據系統架構

餓了麼元數據管理實踐之路

架構

  • DB保存任務的sql數據、任務基礎信息、執行引擎上下文信息
  • Extract循環抽取sql並解析成表、列級血緣Lineage
  • DataSet包含Lineage關係數據+任務信息+引擎上下文
  • 將DataSet數據集保存到Neo4j,並提供關係查詢;保存ES,提供表、字段等信息檢索

SQL埋點、採集

餓了麼元數據管理實踐之路

SQL埋點


餓了麼的sql數據,以執行中採集為主+保存前submit為輔。因為任務的sql可能包含一些時間變量,比如dt、hour,以及任務可能是天調度、小時調度。執行中採集sql實時性更高,也更容易處理

EDW是餓了麼的調度系統,類比開源的AirFlow。調度系統執行任務,並將任務相關的信息,比如appId、jobId、owner、sql等信息存入DB

計算引擎實現相關的監聽接口,比如Hive實現ExecuteWithHookContext接口;Spark實現SparkListener接口;Presto實現EventListener接口。將計算引擎相關的上下文Context、元數據MetaData、統計Statistics等信息存入DB

SQL解析

餓了麼元數據管理實踐之路

SQL Parse


解析sql的方案,以hive為例。先定義詞法規則和語法規則文件,然後使用Antlr實現sql的詞法和語法解析,生成AST語法樹,遍歷AST語法樹完成後續操作

但對於SELECT *、CTAS等操作,直接遍歷AST,不去獲取Schema信息來檢查表名、列名,就無法判定sql的正確性,導致數據汙染

綜上所述,餓了麼的SQL解析方案,直接參考Hive的底層源碼實現。上面的圖片是個簡單示例,先經過SemanticAnalyzerFactory類進行語法分析,再根據Schema生成執行計劃QueryPlan。關於表、列的血緣,可以從LineageInfo、LineageLogger類中獲得解決方案

當然,你需要針對部分類型sql設置HiveConf,比如“開啟動態分區非嚴格模式”。對於CTAS類型,需要設置Context。UDF函數需要修改部分hive源碼,避免UDF Registry檢查

餓了麼元數據管理實踐之路

Operation


餓了麼解析血緣的sql支持的操作有:Query(包含select\\insert into\\insert overwrite)、CreateTable、CreateTableAsSelect、DropTable、CreateView、AlterView。基本覆蓋餓了麼生產環境99%+的sql語法

栗子

<code>create table temp.lineage_test as select coalesce(name, count(id)) lineage_name from default.dual group by id, name
/<code>

舉個栗子,根據上面的sql,分別產生表、列血緣結構。input是表、列輸入值,output是表、列輸出值,operation代表操作類型。比如表A+B通過insert,生成表C,則延展成A insert C; B insert C

列式也一樣
input: name, operation: coalesce(name, count(id)), output: lineage_name;
input: id, operation: coalesce(name, count(id)), output: lineage_name

表血緣結構

餓了麼元數據管理實踐之路

Table Lineage

列血緣結構

餓了麼元數據管理實踐之路

Column Lineage

圖存儲

餓了麼元數據管理實踐之路

Gremlin


有了input、operation、output關係,將input、output保存為圖節點,operation保存為圖邊。圖數據庫選用Gremlin+Neo4j。Gremlin是圖語言,存儲實現方案比較多,Cypher查詢不太直觀,且只能Neo4j使用。社區版Neo4j只能單機跑,我們正在測試OrientDB

餓了麼部分使用場景

下面是餓了麼在元數據應用上的部分場景:

餓了麼元數據管理實踐之路

MetaStore


靜態的Hive MetaStore表,比如DBS、TBLS、SDS、COLUMNS_V2、TABLE_PARAMS、PARTITIONS,保存表、字段、分區、Owner等基礎信息,便於表、字段的信息檢索功能

餓了麼元數據管理實踐之路

LineageInfo


提供動態的表依賴血緣關係查詢。節點是表基礎信息,節點之間的邊是Operation信息,同時附加任務執行Id、執行時間等屬性。列血緣結構展示等同表血緣結構

餓了麼元數據管理實踐之路

Job DAG


根據SQL的input、output構建表的依賴關係,進一步構建任務的DAG依賴結構。可以對任務進行DAG調度,重新編排任務執行序列


作者:炮灰向前衝啦
鏈接:https://www.jianshu.com/p/f60b2111e414
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


分享到:


相關文章: