數(shù)據(jù)倉庫系統(tǒng)建設中的工作流及優(yōu)化
文章作者:翟東波、邢汝峰 搜狐
編輯整理:Hoh
內(nèi)容來源:作者授權
出品平臺:DataFunTalk
注:歡迎轉(zhuǎn)載,轉(zhuǎn)載請留言。
01
數(shù)據(jù)倉庫建設
1. 數(shù)據(jù)倉庫基本概念
數(shù)據(jù)倉庫的概念在 1991 年被美國著名的信息工程專家 William Inmon 博士首次提出,它是數(shù)據(jù)庫技術發(fā)展到一定階段的產(chǎn)物。數(shù)據(jù)倉庫是面向主題的、集成的、穩(wěn)定的和隨時間變化的數(shù)據(jù)集合,是一個數(shù)據(jù)分析處理過程,而不僅僅是一個數(shù)據(jù)存儲軟件或產(chǎn)品。
OLAP ( On-line Analytical Processing,聯(lián)機分析處理 ) 是數(shù)據(jù)倉庫中最經(jīng)常使用的數(shù)據(jù)處理和分析技術,最早由關系數(shù)據(jù)庫之父 E.F.Codd 于 1993 年提出。OLAP 委員會對聯(lián)機分析處理的定義為:使分析人員、管理人員或執(zhí)行人員能夠從多種角度對從原始數(shù)據(jù)中轉(zhuǎn)化出來的、能夠真正為用戶所理解的、并真實反映企業(yè)特性的信息進行快速、一致、交互的存取,從而獲得對數(shù)據(jù)更深入了解的一類軟件技術。簡單來說,OLAP 就是幫助用戶更好的從多個角度去理解現(xiàn)有的數(shù)據(jù)。
多維模型 ( Multidimensional Model ) 是 OLAP 的數(shù)據(jù)存儲和組織范型,是 OLAP 操作的核心技術。OLAP 基于多維模型定義了一些常見的數(shù)據(jù)操作,包括下鉆 ( Drill-down )、 上卷 ( Roll-up )、切片 ( Slice )、切塊 ( Dice ) 以及旋轉(zhuǎn) ( Pivot ) 使決策者、分析者對數(shù)據(jù)進行各種分析操作。
維度建模 ( Dimensional Modeling ) 是數(shù)據(jù)倉庫建設中的一種數(shù)據(jù)建模方法,將數(shù)據(jù)結(jié)構(gòu)化的邏輯設計方法,它將客觀世界劃分為度量和上下文,由 Kimball 最先提出這一概念。維度建模屬于一種關系建模方法,即將多維模型映射到關系模型,將關系模型中的表分為維度表 ( dimension table ) 和事實表 ( fact table ) 兩種,其中維度表表示對分析主題所屬類型的描述,而事實表表示對分析主題的度量。
2. 數(shù)據(jù)倉庫建設主要工作
數(shù)據(jù)倉庫體系架構(gòu)的核心組件有三個:原始數(shù)據(jù)層,數(shù)據(jù)倉庫,前端應用。如下圖所示:

整體來看,數(shù)據(jù)倉庫系統(tǒng)對業(yè)務數(shù)據(jù)和 server 日志等原始數(shù)據(jù)進行匯聚,數(shù)據(jù)分析處理后,提供給前端應用系統(tǒng)進行使用,包括 BI ( Business Intelligence )、搜索、推薦等各類應用場景。
在數(shù)據(jù)倉庫系統(tǒng)內(nèi)部,需要對數(shù)據(jù)進行分層,主要有如下好處:
防止煙囪式開發(fā),減少重復開發(fā),開發(fā)通用中間層數(shù)據(jù),減少重復計算;
將復雜問題簡單化,將復雜任務的多個步驟分解到各個層次中,每一層只處理較少的步驟,使單個任務更容易理解;
可進行數(shù)據(jù)血緣追蹤,便于快速定位問題;
整個數(shù)據(jù)層次清晰,每個層次的數(shù)據(jù)都有職責定位,便于使用和理解。
數(shù)據(jù)倉庫主要分為 STG、ODS、DWD、DWS、ADS 和 DIM 共 6 個層次,數(shù)據(jù)從底層開始,向上層進行傳遞、轉(zhuǎn)換、重組等操作,可以理解為,根據(jù)數(shù)據(jù)分析業(yè)務的需要,對原有的 OLAP 多維數(shù)據(jù),進行維度和指標的重新組合。層次的具體描述如下:
STG原始數(shù)據(jù)層:用來表示原始數(shù)據(jù)在數(shù)據(jù)倉庫的落地,數(shù)據(jù)結(jié)構(gòu)和原始系統(tǒng)發(fā)送上來的保持一致。
ODS數(shù)據(jù)操作層:用于原始數(shù)據(jù)在數(shù)據(jù)平臺的落地。數(shù)據(jù)從數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)之間的邏輯關系上都與原始數(shù)據(jù)層基本保持一致。在源數(shù)據(jù)裝入這一層時,要進行諸如業(yè)務字段提取或去掉不用字段、臟數(shù)據(jù)處理等等。
DWD數(shù)據(jù)明細層:用于源系統(tǒng)數(shù)據(jù)在數(shù)據(jù)平臺中的永久存儲。它用以支撐 DWS 層和 ADS 層無法覆蓋的需求,比如像用戶購買詳單類業(yè)務需求。這一層主要解決一些數(shù)據(jù)質(zhì)量問題和數(shù)據(jù)的完整度問題。
DWS數(shù)據(jù)服務層:數(shù)據(jù)匯總層,該層會在 DWD 層的數(shù)據(jù)基礎上。對數(shù)據(jù)做輕度的聚合操作,生成一系列的中間表,提升公共指標的復用性,減少重復加工。按照業(yè)務劃分,如流量、產(chǎn)品、用戶等,生成字段比較多的寬表,用于提供后續(xù)的業(yè)務查詢,OLAP 分析,數(shù)據(jù)分發(fā)等。
ADS應用數(shù)據(jù)層:該層存放數(shù)據(jù)產(chǎn)品個性化的統(tǒng)計指標數(shù)據(jù),一般以某個業(yè)務應用為出發(fā)點進行建設, ADS 層只關心自己需要的數(shù)據(jù),不會全盤考慮企業(yè)整體的數(shù)據(jù)架構(gòu)和應用。面向?qū)嶋H的業(yè)務數(shù)據(jù)需求,以 DWD 或者 DWS 層的數(shù)據(jù)為基礎,組成各種統(tǒng)計報表。
DIM維度層:主要存儲公共的屬性數(shù)據(jù),比如產(chǎn)品類別、地理位置、時間詳情等信息。綜上所述,數(shù)據(jù)倉庫建設的主要工作,就是對原始業(yè)務數(shù)據(jù)進行匯聚,進行分層次的數(shù)據(jù)處理,生成業(yè)務需要的數(shù)據(jù),提供給前端業(yè)務使用。
根據(jù)數(shù)據(jù)層次和數(shù)據(jù)分析維度,工作流節(jié)點通過數(shù)據(jù)流向依賴在一起;
對于規(guī)模稍大的數(shù)據(jù)倉庫,可涉及到多位數(shù)開發(fā)人員的工作協(xié)調(diào);
可以根據(jù)數(shù)據(jù)處理或數(shù)據(jù)分析工作需要,隨時增加工作流節(jié)點。





綜合來看,目前應用于數(shù)據(jù)倉庫建設場景的工作流管理系統(tǒng),主要存在以下幾個問 題:
都是以工作流為單位進行編輯、管理和發(fā)布部署,但是在實際的數(shù)據(jù)倉庫建設過程中,經(jīng)常是多個數(shù)據(jù)開發(fā)工程師協(xié)同完成整個工作流的開發(fā)部署工作,每個人只負責部分工作流任務節(jié)點,不同開發(fā)者的任務相互依賴,現(xiàn)有的工作流管理系統(tǒng)不能很好滿足多人的開發(fā)協(xié)同工作。
針對一些復雜的任務依賴,比如兩個任務都是小時調(diào)度,小時調(diào)度之間存在某種對應關系,現(xiàn)有工作流管理系統(tǒng)都是按任務進行依賴配置,不能做到每個任務不同調(diào)度時間之間的依賴配置,或者要寫大量的輔助代碼實現(xiàn),給用戶帶來極大的使用不便。
對于新增或修改 ( 如發(fā)現(xiàn)某個統(tǒng)計指標計算有錯 ) 的任務節(jié)點,經(jīng)常需要針對這樣的任務節(jié)點及其子任務節(jié)點進行歷史數(shù)據(jù)修補,以工作流為單位進行調(diào)度的系統(tǒng),不太適合這種場景的處理。
計算機系統(tǒng)中軟件體系結(jié)構(gòu)采用一種分層的結(jié)構(gòu),有句名言:"計算機科學領域的 任何問題都可以通過增加一個間接的中間層來解決"。結(jié)合數(shù)據(jù)倉庫建設工作的特點,本文所優(yōu)化的工作流管理系統(tǒng),將數(shù)據(jù)倉庫建設工作流中的節(jié)點,抽象成任務和實例兩個層次:數(shù)據(jù)開發(fā)人員專注于單個任務的設計,配置任務的依賴和周期等調(diào)度屬性,構(gòu)建任務的工作流;根據(jù)任務的依賴和周期屬性,工作流管理系統(tǒng)自動生成任務對應的實例,構(gòu)建實例的工作流。這樣可以解決上節(jié)中提到的現(xiàn)有開源工作流管理系統(tǒng)的問題,提升開發(fā)協(xié)同、減少重復性工作。
1. 工作流層次
工作流管理系統(tǒng)將數(shù)據(jù)倉庫建設中的數(shù)據(jù)處理工作流分成任務和實例兩個層次,任務是對實例的抽象,實例是對任務的具化,任務是數(shù)據(jù)處理的本體,負責創(chuàng)建實例,而實例是具體的執(zhí)行單元。這樣系統(tǒng)就包含兩個相互獨立又相互關聯(lián)的工作流,即任務工作流和實例工作流。
① 任務工作流
任務工作流層面,用戶根據(jù)數(shù)據(jù)分析的需要,手動增加或修改單個任務。任務除了包括數(shù)據(jù)處理內(nèi)容 ( 如 Shell、HIVE SQL、Spark 等代碼 ),還要包括依賴和周期等任務屬性。通過依賴屬性,所有任務可以形成任務工作流 DAG,用戶只需定義本任務依賴的父任務 ( 也可依賴自身 ),工作流管理系統(tǒng)會進行相關校驗,保證 DAG 屬性 ( 如無環(huán)等 ) 不被破壞等;通過周期屬性,確定任務一天中被調(diào)度的次數(shù)和時間。
只需要配置依賴和周期屬性,便能滿足任務依賴自身上一次運行結(jié)果或一天中多個時間點要被調(diào)度等復雜配置場景,極大簡化了任務配置難度。
② 實例工作流
實例工作流層面,工作流管理系統(tǒng)根據(jù)任務工作流的任務屬性等信息,按照預定的生成規(guī)則 ( 規(guī)則具體說明參見后面章節(jié) ),創(chuàng)建出任務對應的實例,形成實例工作流。
工作流管理系統(tǒng)根據(jù)實例工作流,按照 DAG 方式進行調(diào)度,當實例滿足如下兩個條件時,才能被調(diào)度執(zhí)行:
該實例所有的父實例節(jié)點都已完成調(diào)度執(zhí)行;
到達本實例的調(diào)度時間。
③ 兩者關聯(lián)
任務工作流是一個靜態(tài)的工作流,不會被系統(tǒng)調(diào)度;實例工作流是任務工作流在某 一時刻的鏡像,會被系統(tǒng)調(diào)度執(zhí)行,完成數(shù)據(jù)處理工作。
工作流管理系統(tǒng)一般按天為單位,在固定時間點生成所有任務一天的所有實例信息, 即依據(jù)任務工作流構(gòu)建實例工作流;也可以按照其他時間間隔單位生成實例,比如以小時為單位,在每個小時的某個時間點,生成所有任務在對應小時時間段的實例信息。
下面兩張圖為具體的任務工作流和實例工作流,其中左圖為任務工作流,右圖為實例工作流。

圖中 parent 的任務節(jié)點,周期屬性為天,每天 8 點被調(diào)度;依賴屬性為自身依賴,即依賴上一天的執(zhí)行結(jié)果。
圖中 child 的任務節(jié)點,周期屬性為小時,從 0 點開始,每隔 4 小時調(diào)度一次;依賴屬性,parent 為其依賴的父任務節(jié)點,即父任務 parent 執(zhí)行完后,child 任務節(jié)點才可以被調(diào)度執(zhí)行。
2. 任務屬性
任務屬性,主要包括周期屬性和依賴屬性,工作流管理系統(tǒng)根據(jù)這兩個屬性,將任務工作流轉(zhuǎn)換成實例工作流。
① 周期屬性
周期屬性用于指定任務的調(diào)度周期及具體的調(diào)度時間。
調(diào)度周期,可以設置為月、周、日、小時等 ( 一般不考慮分鐘級別,分鐘級別的數(shù)據(jù)處理任務可以使用 Storm、Flink 或 Spark Streaming 等實時數(shù)據(jù)處理系統(tǒng) )。一般設置為日級別周期,即每天都被調(diào)度一次;對于月、周級別,需要制定每個月或周的哪幾天進行調(diào)度,即不是每天都被調(diào)度;對于小時級別,需要設定一天當中哪幾個小時進行調(diào)度,即每天被調(diào)度多次。
調(diào)度時間,設置任務具體的執(zhí)行時間。對于月、周、日級別任務,設置一個調(diào)度時間即可;對于小時級別任務,需要設置對應的多個調(diào)度時間。
② 依賴屬性
依賴屬性分為任務間依賴和任務自身依賴:
任務間依賴,用于指定任務的父任務,即上游任務。例如 DWD 層的任務 A,需要用到 ODS 層的任務 B 和 C 產(chǎn)出的數(shù)據(jù),在配置任務 A 的任務間依賴屬性時,就要設置依賴任務 B 和 C。針對天級別任務依賴小時級別任務的場景,還可以設置就近依賴屬性,則子任務調(diào)度執(zhí)行依賴父任務中第一個不小于子任務調(diào)度執(zhí)行時間的調(diào)度執(zhí)行。
任務自身依賴,用于指定任務各周期之間的依賴,當前的調(diào)度執(zhí)行,依賴上一次的調(diào)度執(zhí)行結(jié)果。例如某個天級別任務,當天的調(diào)度執(zhí)行就依賴昨天的調(diào)度執(zhí)行結(jié)果;某個小時級別任務,每天 8 點和 16 點執(zhí)行,當天 8 點的調(diào)度執(zhí)行就依賴昨天 16 點的調(diào)度執(zhí)行,當天 16 點的調(diào)度執(zhí)行就依賴當天 8 點的調(diào)度執(zhí)行。
3. 實例生成
工作流管理系統(tǒng),在設定的時間,根據(jù)各個任務的周期和依賴屬性,結(jié)合預定義的生成規(guī)則,生成任務對應的實例,形成實例工作流,用于實際的數(shù)據(jù)處理任務執(zhí)行。
① 生成規(guī)則
生成規(guī)則受到任務的周期和依賴屬性影響:
首先根據(jù)周期屬性生成實例,比如天級任務,根據(jù)調(diào)度時間每天生成一個實例;小時級任務,根據(jù)調(diào)度時間,每天生成一個或多個實例;月和周任務,根據(jù)調(diào)度時間,在對應日期生成一個實例。
然后就是根據(jù)依賴屬性,構(gòu)建實例間的依賴關系,具體如下圖所示。

實例數(shù)相同:基于調(diào)度時間分別排序當前任務和父任務實例,當前任務實例依賴父任務中與之排序序號相同的實例。例如下圖,節(jié)點 A 中實例 A1 是第一個實例節(jié)點,則節(jié)點 B 中第一個實例節(jié)點實例 B1 就依賴于實例 A1。

實例數(shù)不同:當前任務實例只依賴父任務實例中第一個不大于本任務實例調(diào)度時間的實例。例如下圖中,在自身實例數(shù)大于父節(jié)點實例數(shù)時,節(jié)點 B 中的實例 B1 和實例 B2 都依賴于節(jié)點 A 中的 A1,在自身實例數(shù)小于父節(jié)點實例數(shù)時,節(jié)點 B 中的實例 B1 會依賴于節(jié)點 A 中的實例 A1。


小時任務依賴天任務:
小時任務依賴于天任務即所有小時實例的都依賴于當天執(zhí)行的天實例。

天任務依賴小時任務:
天任務依賴小時任務也可以分為兩種,一是天實例依賴父任務生成的全部小時實例,二是天實例就近依賴其自身執(zhí)行時間節(jié)點前父任務執(zhí)行的最近的一個小時實例。
依賴全部小時實例:
天實例依賴全部小時實例的依賴情況

就近依賴小時實例

任務自身依賴:
任務自身依賴可以與任務間依賴一起作用構(gòu)建實例間依賴關系,任務實例依賴本任務上一次調(diào)度執(zhí)行的實例。例如下圖節(jié)點 A 為小時任務,且配置自身依賴屬性,則 2019-11-21 的實例 1 依賴于 2019-11-20 的實例 24,21 號的實例 2 依賴于 21 號的實例 1。

4. 優(yōu)化效果
通過上述的方案,將數(shù)據(jù)倉庫建設中的工作流節(jié)點,抽象成任務和實例兩個層次,可達到以下的優(yōu)化效果:
配置工作流任務節(jié)點時,無需變更整個工作流配置信息,只需配置當前任務節(jié)點的周期和依賴屬性等內(nèi)容,提升工作流配置靈活性;
通過任務的周期和依賴屬性,可以生成復雜的實例依賴關系,降低工作流節(jié)點依賴配置的復雜度;
能夠以某個任務節(jié)點為根節(jié)點,構(gòu)造子工作流 ( 包含此任務節(jié)點,及其子任務節(jié)點、孫子任務節(jié)點等 ),覆蓋歷史數(shù)據(jù)修復等場景。
本文主要根據(jù)數(shù)據(jù)倉庫建設過程中的 workflow 相關特點,將 workflow 中的節(jié)點抽象成任務和實例兩個層次,用戶只需要定義任務的周期屬性和依賴屬性,workflow 管理系統(tǒng)根據(jù)任務的這些屬性自動轉(zhuǎn)換成實例間的依賴,提升數(shù)據(jù)倉庫工作流管理系統(tǒng)的易用性。當然,數(shù)據(jù)倉庫工作流管理系統(tǒng)不僅僅包含本文描述的任務依賴和調(diào)度管理,還包括數(shù)據(jù)質(zhì)量監(jiān)控、數(shù)據(jù)處理任務追蹤、數(shù)據(jù)處理流程優(yōu)化等等,需要深入融合 workflow 和數(shù)據(jù)倉庫兩個技術領域,提升數(shù)據(jù)倉庫建設工作的效率。
