各行業(yè)使用不同的數(shù)據(jù)庫語言編寫代碼,一方面需要明確加工邏輯與業(yè)務(wù)邏輯的一致性,另一方面也增加了數(shù)據(jù)表字段加工帶來的數(shù)據(jù)復(fù)雜性,這種復(fù)雜性會(huì)導(dǎo)致系統(tǒng)維護(hù)數(shù)據(jù)表字段關(guān)系過多,層級過深,進(jìn)而難以追溯和定位數(shù)據(jù)表字段出現(xiàn)問題的根本原因。本文旨在研究一種自動(dòng)化生成數(shù)據(jù)血緣關(guān)系方法,根據(jù)加工批量腳本中出現(xiàn)的數(shù)據(jù)表各個(gè)字段的語法分析結(jié)果,對數(shù)據(jù)表字段關(guān)系進(jìn)行血緣分析,這樣既可以實(shí)現(xiàn)對加工表字段進(jìn)行來源表字段或目標(biāo)表字段關(guān)系的存儲(chǔ),又可以降低對來源表字段和目標(biāo)表字段追溯和定位的成本,同時(shí),血緣分析算法與數(shù)據(jù)庫加工批量存儲(chǔ)、計(jì)算和查詢邏輯松耦合,使得血緣分析算法具有可替換性、可更新性。
一、數(shù)據(jù)血緣分析概述
數(shù)據(jù)血緣分析可以對數(shù)據(jù)表字段間關(guān)系進(jìn)行追溯,進(jìn)而分析上下游加工表數(shù)據(jù)發(fā)生變化時(shí)的影響。在數(shù)據(jù)編織方面,也可以通過數(shù)據(jù)血緣分析將數(shù)據(jù)中大量有價(jià)值的信息有邏輯地提取和分析。然而,對于大量的后臺(tái)加工批量腳本而言,數(shù)據(jù)庫數(shù)據(jù)表及字段間血緣關(guān)系仍然需要通過研究算法和生產(chǎn)實(shí)踐來進(jìn)行捕獲和驗(yàn)證,尤其對于涉及到作業(yè)調(diào)度管理的批量服務(wù)系統(tǒng)而言,自動(dòng)化生成數(shù)據(jù)血緣關(guān)系則可以動(dòng)態(tài)記錄數(shù)據(jù)表及字段間血緣關(guān)系。目前針對業(yè)務(wù)查詢后臺(tái)加工批量系統(tǒng)而言,自動(dòng)化生成數(shù)據(jù)血緣關(guān)系面臨以下挑戰(zhàn)。
一是后臺(tái)加工批量數(shù)量大,血緣分析周期長。
二是表加工方式多樣,一些表僅需要分析來源表字段關(guān)系,一些表則需要分析多個(gè)子查詢多個(gè)關(guān)聯(lián)表字段關(guān)系,還有一些表需要分析包含UNION關(guān)鍵字的加工表字段關(guān)系。
三是SQL代碼中字段所屬表不夠具體,基于文本級別的血緣分析對于不寫或漏寫表別名的來源字段,無法定位該字段的來源表歸屬,進(jìn)而無法進(jìn)行血緣分析。
四是血緣分析需要驗(yàn)證數(shù)據(jù)表字段的真實(shí)存在性,但數(shù)據(jù)表被刪除則無法進(jìn)行驗(yàn)證。
五是血緣分析過程需保證不影響后臺(tái)加工批量服務(wù)的連續(xù)性。
二、行業(yè)實(shí)踐情況
針對數(shù)據(jù)血緣分析存在的這些難題,國內(nèi)諸多行業(yè)企業(yè)設(shè)計(jì)并搭建數(shù)據(jù)血緣分析系統(tǒng)和平臺(tái),以解決數(shù)據(jù)規(guī)模大、數(shù)據(jù)質(zhì)量差、數(shù)據(jù)檢測難等問題。
在互聯(lián)網(wǎng)行業(yè),字節(jié)跳動(dòng)在數(shù)據(jù)血緣建設(shè)過程中遇到了數(shù)據(jù)源種類多、數(shù)據(jù)處理邏輯復(fù)雜、數(shù)據(jù)規(guī)模大等問題,對此,其通過設(shè)計(jì)合理的數(shù)據(jù)血緣模型和優(yōu)化方案實(shí)現(xiàn)了數(shù)據(jù)血緣的存儲(chǔ)和導(dǎo)出,并提供了多種數(shù)據(jù)血緣的具體用例,例如數(shù)據(jù)質(zhì)量監(jiān)控、數(shù)據(jù)安全審計(jì)、數(shù)據(jù)價(jià)值評估等。
在物流行業(yè),滿幫集團(tuán)采用了先采集后解析的方案,對各個(gè)計(jì)算引擎的SQL進(jìn)行血緣解析,并使用圖數(shù)據(jù)庫進(jìn)行血緣存儲(chǔ)和檢索。滿幫集團(tuán)使用數(shù)據(jù)血緣技術(shù)實(shí)現(xiàn)了全鏈路數(shù)據(jù)治理,提升了數(shù)據(jù)質(zhì)量、數(shù)據(jù)安全和數(shù)據(jù)價(jià)值。
在銀行業(yè),微眾銀行為了對全局?jǐn)?shù)據(jù)的來源及影響范圍進(jìn)行實(shí)時(shí)檢測和深度分析,目前全行AIOps都已經(jīng)接入NebulaGraph平臺(tái)用于數(shù)據(jù)血緣治理。
三、相關(guān)技術(shù)
1.詞法分析
詞法分析是計(jì)算機(jī)科學(xué)中將字符序列轉(zhuǎn)換為單詞Token序列的過程,序列可以是關(guān)鍵字、標(biāo)識(shí)符、運(yùn)算符、標(biāo)點(diǎn)符號(hào)等。詞法分析階段是編譯過程的第一個(gè)階段,從左到右逐個(gè)字符進(jìn)行掃描,然后根據(jù)構(gòu)詞規(guī)則識(shí)別單詞。單詞可以直接匹配,也可以使用正則表達(dá)式進(jìn)行定義后匹配。對于復(fù)雜單詞序列,當(dāng)定義好單詞對應(yīng)的正則表達(dá)式,就可以通過掃描并進(jìn)行正則表達(dá)式匹配來獲取程序中所有單詞序列。數(shù)據(jù)庫語言進(jìn)行詞法分析的流程示意如圖1所示。

圖1 數(shù)據(jù)庫語言詞法分析流程示意
2.語法分析
語法分析是編譯過程的一個(gè)邏輯階段。通過語法分析,程序代碼段被解析成若干個(gè)語法分析樹,樹節(jié)點(diǎn)包含了所有單詞序列的上下級關(guān)系。數(shù)據(jù)庫語言語法分析按照分號(hào)劃分代碼段,每個(gè)代碼段中的所有單詞都會(huì)被解析并賦予類型,例如SELECT就是DML語言Keyword關(guān)鍵字,而字段名和表名則為Identifier。SQL語法分析過程樣例如圖2所示。

圖2 SQL語法分析過程樣例
3.血緣分析
(1)基于文本級的SQL血緣分析方法
基于文本級的SQL血緣分析方法依舊可以獲得絕大部分的數(shù)據(jù)表字段關(guān)系,甚至可以設(shè)計(jì)出適用于絕大部分SQL語言的血緣分析方法,具有便捷性和高準(zhǔn)確性。基于文本級的SQL血緣分析方法流程示意如圖3所示。

圖3 基于文本級的SQL血緣分析方法流程示意
(2)基于底層編譯的SQL血緣分析方法
數(shù)據(jù)庫系統(tǒng)根據(jù)SQL底層編譯執(zhí)行邏輯維護(hù)一系列血緣關(guān)系表,通過SQL程序編譯邏輯直接獲取表字段關(guān)系,具有高效性和高準(zhǔn)確性。但因?yàn)閿?shù)據(jù)庫系統(tǒng)設(shè)計(jì)閉源,此方法并非主流的血緣分析方法。基于底層編譯的SQL血緣分析方法流程示意圖如圖4所示。

圖4 基于底層編譯的SQL血緣分析方法流程示意
4.有向圖
有向圖是一幅具有方向性的圖,每條方向的邊都連接著一對有序的頂點(diǎn)。在血緣關(guān)系圖中,有方向的邊代表數(shù)據(jù)流向,與之對應(yīng)的有序頂點(diǎn)分別代表了來源數(shù)據(jù)表或字段和目標(biāo)數(shù)據(jù)表或字段。有向圖和血緣關(guān)系有向圖樣例如圖5所示。

圖5 有向圖和血緣關(guān)系有向圖樣例
其中圖(a)為1到9節(jié)點(diǎn)構(gòu)成的有向圖,圖(b)為數(shù)據(jù)血緣關(guān)系圖,字母代表數(shù)據(jù)表或者數(shù)據(jù)表字段,其中A為來源表或來源字段,B到E為中間表或中間字段,F(xiàn)到I為目標(biāo)表或目標(biāo)字段,數(shù)據(jù)流向如箭頭指向所示。
四、整體架構(gòu)設(shè)計(jì)
本文提出的自動(dòng)化生成數(shù)據(jù)血緣關(guān)系總體流程分為以下四個(gè)方面。
一是程序代碼語法分析,根據(jù)后臺(tái)加工批量腳本中存在的數(shù)據(jù)表及其各個(gè)字段的語法分析結(jié)果,將其中加工表間邏輯、字段加工方式等信息進(jìn)行結(jié)構(gòu)化存儲(chǔ)。
二是數(shù)據(jù)表字段血緣分析,根據(jù)語法分析生成的結(jié)果將需要解析的數(shù)據(jù)表字段進(jìn)行提取和計(jì)算拓?fù)潢P(guān)系后存儲(chǔ)到有向圖中。
三是血緣關(guān)系存儲(chǔ),將需要存儲(chǔ)的數(shù)據(jù)表字段血緣關(guān)系按照圖數(shù)據(jù)庫存儲(chǔ)方式寫回元數(shù)據(jù)庫中。
四是血緣分析調(diào)用,根據(jù)后臺(tái)加工批量的調(diào)度邏輯,將需要血緣分析的數(shù)據(jù)表字段進(jìn)行動(dòng)態(tài)存儲(chǔ)后,返回上層應(yīng)用。
五是血緣關(guān)系可視化,通過構(gòu)建前臺(tái)可視化查詢界面,大幅度提升開發(fā)人員查找加工表與上游表鏈路關(guān)系和上游數(shù)據(jù)表來源的效率。
1.程序代碼語法分析
(1)設(shè)計(jì)詞法分析表
語法分析通過詞法分析將程序中出現(xiàn)的字母數(shù)字等符號(hào)組合的單詞序列進(jìn)行解析,構(gòu)建單詞序列和單詞類型的“詞法分析表”。對于關(guān)鍵字匹配,可直接通過字符串掃描得到程序代碼中的關(guān)鍵字,例如AND、FROM、LIKE等。對于數(shù)字、標(biāo)點(diǎn)符號(hào)和運(yùn)算符而言,則需要通過正則表達(dá)式進(jìn)行匹配。自主設(shè)計(jì)的詞法分析表見表1。
表1 詞法分析表

(2)切割存在關(guān)鍵字UNION的代碼段
UNION關(guān)鍵字用于合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集,UNION內(nèi)部的SELECT語句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型,同時(shí)每條SELECT語句中列的順序必須相同。對于UNION ALL語法而言,UNION結(jié)果集中的列名總是等于UNION中第一個(gè)SELECT語句中的列名。基于以上概念,在血緣分析之前,可以根據(jù)UNION數(shù)量切割SQL代碼段,拆分成若干個(gè)單一的代碼段,以便進(jìn)行語法分析。以UNION ALL語法的切割樣例如圖6所示。

圖6 UNION ALL語法的切割樣例
(3)自動(dòng)填充加工字段所屬表別名
無表別名字段的SQL代碼樣例如圖7所示。

圖7 無表別名字段的SQL代碼樣例
自動(dòng)填充字段所屬表別名需要處理兩種情況,一是數(shù)據(jù)庫數(shù)據(jù)表的字段表別名填充,二是子查詢的字段表別名填充。數(shù)據(jù)庫數(shù)據(jù)表的字段表別名填充只需要查詢數(shù)據(jù)表的字段結(jié)構(gòu)即可確定加工表字段所屬數(shù)據(jù)表關(guān)系,而子查詢的字段表別名填充則需要對子查詢中的數(shù)據(jù)表進(jìn)行別名映射,同樣需要查詢數(shù)據(jù)表的字段結(jié)構(gòu)。如果子查詢中包含子查詢,則需要進(jìn)行數(shù)據(jù)表遞歸映射,可構(gòu)建對應(yīng)的數(shù)據(jù)結(jié)構(gòu)遍歷所有數(shù)據(jù)表。由于子查詢中可能存在多個(gè)數(shù)據(jù)表或嵌套子查詢,因此數(shù)據(jù)表字段映射關(guān)系需要逐層進(jìn)行傳遞,進(jìn)而填充最外層的字段所屬數(shù)據(jù)表別名。以上這些情況處理相對復(fù)雜,實(shí)現(xiàn)難度較大。
2.數(shù)字表字段血緣分析
數(shù)據(jù)表字段血緣分析流程如圖8所示。

圖8 數(shù)據(jù)表字段血緣分析流程
其中,①表示通過語法分析提取程序代碼中每個(gè)代碼段包含的表字段信息,并構(gòu)建對應(yīng)的有向圖。
②表示在有向圖中,根據(jù)入度為0和出度為0分別得到多個(gè)來源點(diǎn)和多個(gè)目標(biāo)點(diǎn),它們之間存在著互相連接的有向邊,代表當(dāng)前代碼段的表字段間關(guān)系。
③表示在有向圖中,通過尋找源點(diǎn)到目標(biāo)點(diǎn)的所有簡單路徑的算法,得到每個(gè)代碼段中所有表字段間血緣關(guān)系路徑。
④表示通過合并每個(gè)代碼段出現(xiàn)的相同表字段所在路徑,簡化得到最終的血緣分析路徑。
(1)生成數(shù)據(jù)表字段關(guān)系有向圖
生成數(shù)據(jù)表字段關(guān)系有向圖前,通過語法分析過程,可以得到當(dāng)前程序中每個(gè)代碼段對應(yīng)的語法分析樹,并通過提取表字段信息,構(gòu)建每個(gè)代碼段對應(yīng)的有向圖。有向圖中每個(gè)點(diǎn)代表當(dāng)前代碼段中每個(gè)數(shù)據(jù)表字段,根據(jù)入度為0和出度為0分別得到多個(gè)來源點(diǎn)和多個(gè)目標(biāo)點(diǎn)。數(shù)據(jù)表字段關(guān)系有向圖樣例如圖9所示。

圖9 數(shù)據(jù)表字段關(guān)系有向圖樣例
(2)合并數(shù)據(jù)表字段血緣分析路徑
通過尋找源點(diǎn)到目標(biāo)點(diǎn)的所有簡單路徑的算法,可以得到當(dāng)前代碼段中所有表字段間血緣關(guān)系路徑,其中簡單路徑是沒有重復(fù)節(jié)點(diǎn)的路徑,因此可以通過集合的并集操作合并代碼段中出現(xiàn)相同表字段所在路徑,得到最終的血緣分析路徑,目的是提煉和簡化血緣分析結(jié)果。
3.血緣關(guān)系存儲(chǔ)
血緣分析關(guān)系存儲(chǔ)需要設(shè)計(jì)血緣分析表。血緣分析表示例見表2。
表2 血緣分析表示例

以上表格中顯示的血緣路徑示例為:

在存儲(chǔ)表字段級兩點(diǎn)間血緣關(guān)系前,還需要進(jìn)行血緣路徑遞歸校驗(yàn),防止存儲(chǔ)的點(diǎn)對點(diǎn)路徑出現(xiàn)錯(cuò)誤或者遺漏。數(shù)據(jù)表字段血緣關(guān)系存儲(chǔ)流程如圖10所示。

圖10 數(shù)據(jù)表字段血緣關(guān)系存儲(chǔ)流程
其中,①表示根據(jù)血緣分析路徑結(jié)果,通過訪問數(shù)據(jù)庫得到表字段類型名稱,如果血緣路徑中表和字段名無法對應(yīng),則排除該血緣分析結(jié)果。
②表示血緣分析路徑中表字段與字段類型名稱以及批量名稱共同作為一組血緣關(guān)系數(shù)據(jù),并按照“目標(biāo)-來源”表字段關(guān)系方式進(jìn)行數(shù)據(jù)存儲(chǔ)。
③表示在存儲(chǔ)表字段級兩點(diǎn)間血緣關(guān)系前,還需要進(jìn)行血緣路徑遞歸校驗(yàn),防止存儲(chǔ)的點(diǎn)對點(diǎn)路徑出現(xiàn)錯(cuò)誤或者遺漏。
④表示將校驗(yàn)正確的血緣關(guān)系數(shù)據(jù)存儲(chǔ)至元數(shù)據(jù)庫中,作為元數(shù)據(jù)進(jìn)行管理。
4.血緣關(guān)系調(diào)用
血緣分析算法與數(shù)據(jù)庫加工批量存儲(chǔ)、計(jì)算和查詢邏輯松耦合。血緣分析算法可以在批量編譯執(zhí)行完成后執(zhí)行,即使數(shù)據(jù)表在之后的加工批量中被刪除,也可以記錄到數(shù)據(jù)表字段類型信息,保證數(shù)據(jù)表血緣關(guān)系數(shù)據(jù)的完整性。數(shù)據(jù)表字段血緣分析調(diào)用的流程如圖11所示。

圖11 數(shù)據(jù)表字段血緣分析調(diào)用流程
5.血緣關(guān)系可視化
基于以上架構(gòu)設(shè)計(jì),編寫代碼實(shí)現(xiàn)了一種自動(dòng)化生成數(shù)據(jù)血緣關(guān)系的應(yīng)用。到目前為止,通過以上方式構(gòu)建了大部分?jǐn)?shù)據(jù)表字段血緣關(guān)系,并通過構(gòu)建前臺(tái)可視化查詢界面,大幅度提升開發(fā)人員查找加工表與上游表鏈路關(guān)系的效率,同時(shí)也極大方便了業(yè)務(wù)人員查詢上游數(shù)據(jù)表來源。在可視化查詢結(jié)果圖中,節(jié)點(diǎn)代表加工表或者字段,點(diǎn)與點(diǎn)之間的箭頭代表表間或者字段間存在血緣加工關(guān)系,顏色越深表示數(shù)據(jù)來源層級越高,顏色越淺代表數(shù)據(jù)加工層次越高。數(shù)據(jù)表字段血緣關(guān)系可視化查詢效果示例如圖12所示。

圖12 數(shù)據(jù)表字段血緣關(guān)系可視化查詢效果示例
五、總結(jié)與未來展望
為有效解決實(shí)際生產(chǎn)中難以追溯數(shù)據(jù)表字段血緣關(guān)系的問題,本文提出了一種自動(dòng)化生成數(shù)據(jù)血緣關(guān)系的方法。本文首先介紹了當(dāng)前傳統(tǒng)血緣分析方法的技術(shù)原理,隨后結(jié)合行內(nèi)的后臺(tái)加工批量的具體情況,著力描述了血緣分析的解析過程和血緣關(guān)系的存儲(chǔ)方法,然后針對研究與探索出的方案,詳細(xì)闡述關(guān)鍵部分的實(shí)現(xiàn)方式。
未來,將從以下幾個(gè)方面,繼續(xù)深化對“血緣分析”的應(yīng)用實(shí)踐:
一是數(shù)據(jù)血緣分析可以將大數(shù)據(jù)和機(jī)器學(xué)習(xí)相結(jié)合,自動(dòng)分析和優(yōu)化數(shù)據(jù),解決數(shù)據(jù)質(zhì)量的問題。
二是數(shù)據(jù)血緣分析與區(qū)塊鏈技術(shù)相結(jié)合,完善數(shù)據(jù)交換和數(shù)據(jù)共享機(jī)制。
三是對UNION關(guān)鍵字的代碼重構(gòu)血緣分析方法,使得新的血緣分析方法可以處理更為復(fù)雜的UNION關(guān)鍵字代碼。
四是加強(qiáng)對代碼規(guī)范的提示作用,可以根據(jù)血緣關(guān)系自動(dòng)填充和更新血緣路徑中數(shù)據(jù)表字段元數(shù)據(jù)。
(部分內(nèi)容來源網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系刪除)