天天看點

數倉字段血緣解析實作—hive版

【本文大綱】

1、字段血緣分析的意義

2、實作方案選擇

3、實作過程

4、總結

字段血緣分析的意義

數倉經常會碰到的兩類問題:

1、兩個資料報表進行對比,結果差異很大,需要人工核對分析名額的次元資訊,比如從頭分析資料名額從哪裡來,處理條件是什麼,最後才能分析出問題原因 ——資料回溯問題

2、基礎資料表因某種原因需要修改字段,需要評估其對數倉的影響,費時費力,然後在做方案 —— 影響分析問題

這兩類問題都屬于資料血緣分析問題,資料血緣分析還有其它的積極意義,比如:

  • 問題定位分析

    類似于影響分析,當程式運作出錯時,可以友善找到問題的節點,并判斷出問題的原因以及後續的影響

  • 名額波動分析

    當某個名額出現較大的波動時,可進行溯源分析,判斷是由哪條資料發生變化所導緻的

  • 資料體檢

    判定系統和資料的健康情況,是否存在大量的備援資料、無效資料、無來源資料、重複計算、系統資源浪費等問題

  • 資料評估

    通過血緣分析和中繼資料,可以從資料的集中度、分布、備援度、資料熱度、重要性等多角度進行評估分析,進而初步判斷資料的價值

實作方案選擇

經過調研,目前業界有一些優秀的架構,比如druid ,内部已經實作了大部分的解析功能,可以用來解析sql,但是它的缺點是支援mysql天衣無縫,但對hive sql卻是有心無力,不能照顧到所有的文法,會導緻有一部分sql不能很好的解析。

也有一些同學選擇自己解析asttree來實作,但sql的文法千變萬化,自己去解析難度還是很大的,尤其是一旦hive版本更新了,就得去關注新版本又更新了哪些文法,然後自己的代碼也得跟進,很辛苦呀~~

我的想法是:利用hive内部解析的方法來解析sql,這樣,凡是能在hive中執行的sql,都能夠全面解析到字段依賴。

這個方法就要求我們 要對hive的解析過程非常了解,沒關系呀,這個我完全擅長,通過對hive編譯子產品源碼的透析,早已熟悉了各個子產品在哪個資料結構裡,掘地三尺,也是能把這些給挖出來的。

這個方法的主要難點就是該從什麼地方切入呢,畢竟源碼相關的,都是hive内部的結構,最好不要對源碼做侵入性的修改。

在看源碼時,發現hive 有個很牛逼的彩蛋:hive hooks 。hive hooks綁定了hive内部的工作機制,提供了使用hive擴充和內建外部功能的能力,可用于在查詢處理的各個步驟中注入一些代碼,而無需重新編譯hive。

接下來就看該在哪個階段注入代碼了,根據鈎子的類型,它可以在查詢處理期間的不同點調用:

  • Pre-semantic-analyzer hooks:在Hive在查詢字元串上運作語義分析器之前調用。
  • Post-semantic-analyzer hooks:在Hive在查詢字元串上運作語義分析器之後調用。
  • Pre-driver-run hooks:在driver執行查詢之前調用。
  • Post-driver-run hooks:在driver執行查詢之後調用。
  • Pre-execution hooks:在執行引擎執行查詢之前調用。
  • Post-execution hooks:在查詢執行完成之後以及将結果傳回給使用者之前調用。
  • Failure-execution hooks:當查詢執行失敗時調用。

實作過程

整個實作過程比較簡單,是因為發現hive的api案例中已經實作了類似的功能,我們要做的就是把這個稍做改造。

代碼

研究hive hooks 的api時,發現hive已經實作了一個血緣關系的hook:

數倉字段血緣解析實作—hive版

隻是這個hook 是把相關的依賴寫在了 log裡:

數倉字段血緣解析實作—hive版

下面,我們需要做一些設計,比如設計一張mysql表t_table_column_dependency來存放字段依賴的關系:

數倉字段血緣解析實作—hive版

如上,要有依賴關系的建立時間和更新時間,友善及時清理已經過期的依賴

部分寫入代碼如下 :

數倉字段血緣解析實作—hive版

部署

添加參數
vim $HIVE_HOME/conf/hive-site.xml           

複制

數倉字段血緣解析實作—hive版
建立auxlib
cd $HIVE_HOME/
mkdir auxlib ## 這個目錄主要存放使用者自定義jar包,将編譯好的jar上傳至該目錄           

複制

這樣部署就完成了,執行hive sql會自動調用該方法,将依賴關系寫入資料庫,前端頁面從資料庫中讀取資訊展示

效果

測試案例:

--建立三張表
CREATE TABLE IF NOT EXISTS EXPOSURE (
session_id string COMMENT 'session_id',
kv map<string,string>
)
PARTITIONED BY (
day string
);
create table tmp_test_a (s1 string, s2 int);
create table tmp_test_b (s1 string, s2 int);

--insert語句
insert into table tmp_test_a
select
tmp.ss,
tmpb.s2
from
(
select session_id,kv['CC'] as ss from EXPOSURE where day=20190101
) tmp left join tmp_test_b tmpb on tmp.session_id=tmpb.s1           

複制

結果:

數倉字段血緣解析實作—hive版

總結

利用hive hooks有以下優點:

1、sql執行完後自動更新依賴關系

2、寫入依賴關系子產品的執行狀态不會影響線上的任務,即如果依賴關系由于一些原因寫入失敗,不會影響線上任務的正常運作