1. 運(yùn)行分析型數(shù)據(jù)轉(zhuǎn)換
1.1. 確保ETL期間的數(shù)據(jù)質(zhì)量
1.1.1. ETL即“提取-轉(zhuǎn)換-加載”
-
1.1.2. 步驟
-
1.1.2.1. 在提取步驟中,原始數(shù)據(jù)從一些上游數(shù)據(jù)源中導(dǎo)出沫勿,并將其移動(dòng)到暫存區(qū)
1.1.2.1.1. MySQL
1.1.2.1.2. NoSQL服務(wù)器
1.1.2.1.3. CRM系統(tǒng)
1.1.2.1.4. 數(shù)據(jù)湖中的原始文件
1.1.2.2. 暫存區(qū)中的數(shù)據(jù)按照數(shù)據(jù)工程師的要求規(guī)范進(jìn)行組合和處理
1.1.2.3. 在加載步驟中,我們將轉(zhuǎn)換后的數(shù)據(jù)移出暫存區(qū)并移至其目的地,該目的地通常是數(shù)據(jù)倉(cāng)庫(kù)中的一個(gè)特定表
-
1.2. 確保轉(zhuǎn)換期間的數(shù)據(jù)質(zhì)量
-
1.2.1. ETL是指先將數(shù)據(jù)加載到暫存服務(wù)器,然后再加載到目標(biāo)系統(tǒng)的過(guò)程
- 1.2.1.1. ETL為數(shù)據(jù)工程師提供了在數(shù)據(jù)投入生產(chǎn)前對(duì)其進(jìn)行驗(yàn)證的機(jī)會(huì)
-
1.2.2. ELT要求將數(shù)據(jù)直接加載到目標(biāo)系統(tǒng)中
- 1.2.2.1. ELT則加快了處理速度草雕,但如果沒(méi)有恰當(dāng)?shù)剡M(jìn)行測(cè)試和監(jiān)控,就會(huì)降低數(shù)據(jù)質(zhì)量
-
1.2.3. 轉(zhuǎn)換源數(shù)據(jù)的原因
1.2.3.1. 只是對(duì)字段進(jìn)行重命名固以,以匹配目標(biāo)位置的模式需求
1.2.3.2. 通過(guò)篩選墩虹、聚合、匯總憨琳、去重等方式對(duì)源數(shù)據(jù)進(jìn)行清洗和整合
1.2.3.3. 同時(shí)進(jìn)行類型轉(zhuǎn)換和單位轉(zhuǎn)換
1.2.3.4. 為了滿足行業(yè)規(guī)定或法規(guī)诫钓,你可以在此步驟對(duì)敏感數(shù)據(jù)字段進(jìn)行加密
1.2.3.5. 進(jìn)行數(shù)據(jù)治理審計(jì)或數(shù)據(jù)質(zhì)量檢查
2. 警報(bào)和測(cè)試
2.1. dbt(數(shù)據(jù)構(gòu)建工具)、WhereScape或Informatica等ETL系統(tǒng)也容易出現(xiàn)故障
- 2.1.1. 需要一個(gè)強(qiáng)大的測(cè)試和警報(bào)系統(tǒng)以便在大批量數(shù)據(jù)生產(chǎn)環(huán)境中運(yùn)行這些程序
2.2. 數(shù)據(jù)測(cè)試是在生產(chǎn)之前或期間驗(yàn)證組織對(duì)數(shù)據(jù)假設(shè)的過(guò)程
-
2.2.1. 空值
- 2.2.1.1. 是否有任何值是未知的(為空值)篙螟?
-
2.2.2. 容量
2.2.2.1. 有沒(méi)有收到任何的數(shù)據(jù)菌湃?
2.2.2.2. 收到的數(shù)據(jù)是太多了還是太少了?
-
2.2.3. 分布
2.2.3.1. 數(shù)據(jù)是否在可接受的范圍內(nèi)闲擦?
2.2.3.2. 值是否在給定列的范圍內(nèi)慢味?
-
2.2.4. 獨(dú)特性
- 2.2.4.1. 獨(dú)特性
-
2.2.5. 已知的不變量
- 2.2.5.1. 兩個(gè)對(duì)象是否從根本上不同
2.3. 數(shù)據(jù)測(cè)試的兩個(gè)最佳工具分別是dbt測(cè)試和Great Expectation
2.3.1. Great Expectations更為通用
-
2.3.2. dbt本身并不是一個(gè)測(cè)試解決方案
- 2.3.2.1. 如果你已經(jīng)在使用該框架對(duì)數(shù)據(jù)進(jìn)行建模和轉(zhuǎn)換了,那么其開(kāi)箱即用的測(cè)試效果非常好
2.4. 要運(yùn)行數(shù)據(jù)質(zhì)量測(cè)試
2.4.1. 將轉(zhuǎn)換后的數(shù)據(jù)加載到臨時(shí)的暫存表/數(shù)據(jù)集中
2.4.2. 運(yùn)行測(cè)試以確保暫存表中的數(shù)據(jù)落在生產(chǎn)所需的閾值范圍內(nèi)
2.5. 如果數(shù)據(jù)質(zhì)量測(cè)試失敗了墅冷,則會(huì)向負(fù)責(zé)該數(shù)據(jù)資產(chǎn)的數(shù)據(jù)工程師或分析師發(fā)送警報(bào)纯路,而數(shù)據(jù)管道也不會(huì)運(yùn)行
2.5.1. 數(shù)據(jù)工程師能夠在影響最終用戶或系統(tǒng)之前發(fā)現(xiàn)意料之外的數(shù)據(jù)質(zhì)量問(wèn)題
2.5.2. 數(shù)據(jù)測(cè)試可以在轉(zhuǎn)換過(guò)程的任何步驟之前或之后進(jìn)行
2.5.3. 測(cè)試是數(shù)據(jù)質(zhì)量工作流中的一個(gè)重要組成部分,但它并不是團(tuán)隊(duì)在解決數(shù)據(jù)質(zhì)量問(wèn)題時(shí)應(yīng)該采取的唯一主動(dòng)措施
2.6. dbt單元測(cè)試
2.6.1. 現(xiàn)代ELT最受歡迎的選擇之一
2.6.2. 工具擴(kuò)展了向被轉(zhuǎn)換的表添加單元測(cè)試的能力
2.6.3. dbt模型是獨(dú)立的SQL語(yǔ)句寞忿,它們接收輸入數(shù)據(jù)驰唬,對(duì)其進(jìn)行轉(zhuǎn)換,并將轉(zhuǎn)換的一些結(jié)果加載到目標(biāo)表中
-
2.6.4. 單項(xiàng)測(cè)試
2.6.4.1. 可以在不同模型上重復(fù)使用的“模板化”測(cè)試
2.6.4.2. 采用參數(shù)化的SQL查詢形式腔彰,因此可以接收參數(shù)
2.6.4.3. unique測(cè)試的是在特定列中的值是不是唯一的
2.6.4.4. not_null測(cè)試的是特定列中的值是否為空值
2.6.4.5. accepted_values確保一列中的所有值都是有限集中的一個(gè)
-
2.6.4.6. relationships檢查了表之間的“引用完整性”
2.6.4.6.1. 確保如id在內(nèi)的關(guān)鍵字段是一一對(duì)應(yīng)的
2.6.5. dbt測(cè)試通常是很好的測(cè)試標(biāo)準(zhǔn)
-
2.6.6. dbt測(cè)試是由你組織中的開(kāi)發(fā)人員以代碼形式手動(dòng)維護(hù)的
2.6.6.1. 復(fù)雜的測(cè)試可以確保獲得高質(zhì)量的數(shù)據(jù)
2.6.6.2. 會(huì)浪費(fèi)工程資源的時(shí)間消耗叫编,所花費(fèi)的時(shí)間也接近于開(kāi)發(fā)模型本身所需的時(shí)間
2.6.7. 測(cè)試失敗必須有意義才能有效
-
2.6.8. 測(cè)試失敗仍然是表明出現(xiàn)錯(cuò)誤的良好信號(hào),盡管它并不能提供快速修復(fù)
- 2.6.8.1. 需要深入研究棧來(lái)消除錯(cuò)誤霹抛,因?yàn)槟愕腅LT測(cè)試方案不是正確的端到端測(cè)試
2.7. Great Expectations單元測(cè)試
2.7.1. 一個(gè)開(kāi)源工具搓逾,它以單元測(cè)試的形式提供了另一種從數(shù)據(jù)中“斷言你所期望”的方法
-
2.7.2. 比dbt測(cè)試更具可擴(kuò)展性
- 2.7.2.1. 用Python編寫(xiě)的,它可以被用于各種ETL/ELT解決方案
2.7.3. 允許單元測(cè)試在一系列不同的數(shù)據(jù)量上運(yùn)行杯拐,從單個(gè)小批量數(shù)據(jù)到完整的數(shù)據(jù)轉(zhuǎn)換
2.7.4. 作為Python包發(fā)布霞篡,擴(kuò)展了有用的命令行界面世蔗,并使用Jupyter等工具進(jìn)行數(shù)據(jù)驗(yàn)證
-
2.7.5. Slack集成
- 2.7.5.1. 設(shè)置高度可配置的Slack警報(bào)
-
2.7.6. 僅限于Python
- 2.7.6.1. 是一個(gè)Python工具
2.7.7. 一個(gè)完全獨(dú)立的工具,具有不同的學(xué)習(xí)曲線
2.8. Deequ單元測(cè)試
2.8.1. 一個(gè)由AWS構(gòu)建的開(kāi)源庫(kù)朗兵,用于運(yùn)行數(shù)據(jù)單元測(cè)試
2.8.2. 構(gòu)建在Apache Spark上污淋,因此在格式方面具有很大的靈活性
2.8.3. Deequ的工作方式是斷言測(cè)試條件并返回失敗的數(shù)據(jù)行或批數(shù)據(jù)
2.8.4. Deequ測(cè)試套件的入口點(diǎn)是VerificationSuite類
-
2.8.5. 優(yōu)點(diǎn)
-
2.8.5.1. 與AWS集成
2.8.5.1.1. 很容易與AWS Glue進(jìn)行集成,并且在技術(shù)博客中進(jìn)行了詳細(xì)的在線記錄
-
2.8.5.2. 高可擴(kuò)展性
2.8.5.2.1. 可以利用Scala作業(yè)編排和并行的優(yōu)勢(shì)余掖,使其更加高效
2.8.5.2.2. 數(shù)據(jù)存儲(chǔ)在Scala的數(shù)據(jù)框架中寸爆,這是針對(duì)大數(shù)據(jù)生態(tài)系統(tǒng)及其挑戰(zhàn)而專門(mén)構(gòu)建的
-
2.8.5.3. 有狀態(tài)計(jì)算
2.8.5.3.1. 可以計(jì)算指標(biāo)的元數(shù)據(jù),將所述元數(shù)據(jù)存儲(chǔ)在適當(dāng)?shù)奈恢醚纹郏缓笤诮邮崭鄶?shù)據(jù)時(shí)重新計(jì)算關(guān)鍵指標(biāo)
-
2.8.5.4. 內(nèi)置的異常檢測(cè)
2.8.5.4.1. 允許對(duì)運(yùn)行指標(biāo)的平均值和偏差進(jìn)行檢測(cè)
-
-
2.8.6. 缺點(diǎn)
2.8.6.1. 對(duì)于數(shù)據(jù)工程領(lǐng)域以外的人來(lái)說(shuō)赁豆,Scala并不是一種友好的語(yǔ)言
-
2.8.6.2. 對(duì)集成測(cè)試的適用性有限
2.8.6.2.1. 與dbt測(cè)試按模型運(yùn)行并自然地跨ELT管道集成了測(cè)試斷言所不同,Deequ可以靈活地運(yùn)行在你所提供的任何一批數(shù)據(jù)上
-
2.8.6.3. 缺乏直觀的用戶界面
2.8.6.3.1. 軟件非常簡(jiǎn)單且功能十分強(qiáng)大
2.9. Deequ單元測(cè)試
2.9.1. 一個(gè)由AWS構(gòu)建的開(kāi)源庫(kù)冗美,用于運(yùn)行數(shù)據(jù)單元測(cè)試
2.9.2. 構(gòu)建在Apache Spark上歌憨,因此在格式方面具有很大的靈活性
2.9.3. Deequ的工作方式是斷言測(cè)試條件并返回失敗的數(shù)據(jù)行或批數(shù)據(jù)
2.9.4. Deequ測(cè)試套件的入口點(diǎn)是VerificationSuite類
-
2.9.5. 優(yōu)點(diǎn)
-
2.9.5.1. 與AWS集成
2.9.5.1.1. 很容易與AWS Glue進(jìn)行集成,并且在技術(shù)博客中進(jìn)行了詳細(xì)的在線記錄
-
2.9.5.2. 高可擴(kuò)展性
2.9.5.2.1. 可以利用Scala作業(yè)編排和并行的優(yōu)勢(shì)墩衙,使其更加高效
2.9.5.2.2. 數(shù)據(jù)存儲(chǔ)在Scala的數(shù)據(jù)框架中务嫡,這是針對(duì)大數(shù)據(jù)生態(tài)系統(tǒng)及其挑戰(zhàn)而專門(mén)構(gòu)建的
-
2.9.5.3. 有狀態(tài)計(jì)算
2.9.5.3.1. 可以計(jì)算指標(biāo)的元數(shù)據(jù),將所述元數(shù)據(jù)存儲(chǔ)在適當(dāng)?shù)奈恢闷岣模缓笤诮邮崭鄶?shù)據(jù)時(shí)重新計(jì)算關(guān)鍵指標(biāo)
-
2.9.5.4. 內(nèi)置的異常檢測(cè)
2.9.5.4.1. 允許對(duì)運(yùn)行指標(biāo)的平均值和偏差進(jìn)行檢測(cè)
-
-
2.9.6. 缺點(diǎn)
2.9.6.1. 對(duì)于數(shù)據(jù)工程領(lǐng)域以外的人來(lái)說(shuō)心铃,Scala并不是一種友好的語(yǔ)言
-
2.9.6.2. 對(duì)集成測(cè)試的適用性有限
2.9.6.2.1. 與dbt測(cè)試按模型運(yùn)行并自然地跨ELT管道集成了測(cè)試斷言所不同,Deequ可以靈活地運(yùn)行在你所提供的任何一批數(shù)據(jù)上
-
2.9.6.3. 缺乏直觀的用戶界面
2.9.6.3.1. 軟件非常簡(jiǎn)單且功能十分強(qiáng)大
3. Apache Airflow
3.1. Apache Airflow挫剑、Luigi去扣、Matillion和Stitch等工具讓團(tuán)隊(duì)能夠更好地管理編排層的數(shù)據(jù)質(zhì)量,該層以編程方式編寫(xiě)樊破、調(diào)度和監(jiān)控?cái)?shù)據(jù)管道中的工作流
3.2. “檢查點(diǎn)”
- 3.2.1. 通常被稱為有向無(wú)環(huán)圖(Directed Acylic Graph愉棱,DAG)
3.3. Apache Airflow(和其他編排工具)有向無(wú)環(huán)圖最常見(jiàn)的數(shù)據(jù)宕機(jī)類型是質(zhì)量變低的查詢和錯(cuò)誤的Python代碼
3.4. 滿是錯(cuò)誤的代碼可能是人為錯(cuò)誤(例如令人討厭的縮進(jìn)錯(cuò)誤)引起的,而當(dāng)Apache Airflow作業(yè)運(yùn)行所花費(fèi)的時(shí)間比預(yù)期更長(zhǎng)時(shí)哲戚,查詢的質(zhì)量會(huì)降低
3.5. 調(diào)度程序的SLA
3.5.1. 在編排層防止數(shù)據(jù)事故的另一種流行方法是將“斷路器”方法用于數(shù)據(jù)管道的運(yùn)行
3.5.2. 斷路意味著當(dāng)數(shù)據(jù)不符合一組質(zhì)量閾值時(shí)奔滑,數(shù)據(jù)管道將停止運(yùn)行
3.5.3. 斷路器是CI/CD工作流程中的常見(jiàn)做法,也是一種防止系統(tǒng)因新軟件部署而發(fā)生中斷的手段顺少,許多相同的概念都可以應(yīng)用于數(shù)據(jù)管道
3.5.4. 團(tuán)隊(duì)可以在測(cè)試和CI/CD流程中的其他步驟(如版本控制)之上集成斷路器
3.5.5. 可以在指標(biāo)更新完成后實(shí)施一個(gè)有用的斷路器朋其,在允許任何下游作業(yè)執(zhí)行前先運(yùn)行完整性測(cè)試
3.5.6. 如果發(fā)現(xiàn)輸送到管道中的上游數(shù)據(jù)不準(zhǔn)確,則暫停管道中間的數(shù)據(jù)工作流
-
3.5.7. 斷路器可以防止數(shù)據(jù)產(chǎn)品將高質(zhì)量和低質(zhì)量的數(shù)據(jù)混合脆炎,從而確泵吩常可用數(shù)據(jù)的可靠性
3.5.7.1. 線路閉合:數(shù)據(jù)正在流經(jīng)管道
3.5.7.2. 線路開(kāi)啟:數(shù)據(jù)沒(méi)有流經(jīng)管道
-
3.5.8. 核心解決方案
3.5.8.1. 數(shù)據(jù)沿襲
3.5.8.2. 跨管道的數(shù)據(jù)分析
3.5.8.3. 能夠通過(guò)分析發(fā)現(xiàn)的問(wèn)題來(lái)自動(dòng)觸發(fā)線路
3.5.9. 斷路器被用于防止豎井式數(shù)據(jù)管道的新鮮度、容量和分布問(wèn)題秒裕,但類似的原理也可以應(yīng)用于大規(guī)模自動(dòng)化
3.6. 為Apache Airflow DAG安裝斷路器是防止數(shù)據(jù)質(zhì)量問(wèn)題的一種更為積極主動(dòng)的方法袱蚓,如果數(shù)據(jù)不滿足新鮮度、容量和模式閾值的要求几蜻,則可以在編排層停止數(shù)據(jù)管道
3.7. 斷路是一種有價(jià)值且節(jié)省成本的工具喇潘,但它通常僅用于最關(guān)鍵的數(shù)據(jù)宕機(jī)事件
- 3.7.1. 斷路不僅可以防止不良數(shù)據(jù)破壞原本完美的管道爽撒,而且還可以確保在運(yùn)行具有(難以發(fā)現(xiàn)的)數(shù)據(jù)質(zhì)量問(wèn)題的DAG時(shí)不會(huì)產(chǎn)生回填成本
3.8. SQL檢查運(yùn)算符
3.8.1. 可驗(yàn)證給定DAG的內(nèi)容是否與多個(gè)關(guān)鍵元素(包括值、間隔和閾值)的預(yù)期相一致
3.8.2. 將允許你運(yùn)行自定義的SQL檢查運(yùn)算符响蓉,這些運(yùn)算符從給定的SQL查詢中返回單行,以檢查該行中的任何返回值是否為False
3.9. 如果沒(méi)有戰(zhàn)略化地審慎實(shí)施哨毁,斷路器和SQL檢查運(yùn)算符可能會(huì)阻止整個(gè)數(shù)據(jù)管道運(yùn)行那些與問(wèn)題無(wú)關(guān)且高質(zhì)量的作業(yè)枫甲,從而阻止分析型數(shù)據(jù)流向下游系統(tǒng)
4. 要點(diǎn)
4.1. 解決數(shù)據(jù)宕機(jī)不只是在下游儀表板中出現(xiàn)空值時(shí)對(duì)相關(guān)方做出回應(yīng),或者當(dāng)你在收到CEO發(fā)來(lái)關(guān)于“丟失數(shù)據(jù)”的瘋狂電子郵件時(shí)重新訪問(wèn)你的Snowflake查詢
4.2. 數(shù)據(jù)宕機(jī)應(yīng)該能夠通過(guò)在數(shù)據(jù)管道的各個(gè)階段集成數(shù)據(jù)質(zhì)量檢查來(lái)進(jìn)行主動(dòng)預(yù)防
- 4.2.1. 從最初的數(shù)據(jù)倉(cāng)庫(kù)或數(shù)據(jù)湖中接收數(shù)據(jù)扼褪,到最終在商業(yè)智能層中的實(shí)際應(yīng)用
4.3. 雖然數(shù)據(jù)質(zhì)量問(wèn)題不能單靠技術(shù)來(lái)解決想幻,但收集、清洗话浇、接收脏毯、處理和編排數(shù)據(jù)時(shí)考慮數(shù)據(jù)可靠性一定會(huì)對(duì)數(shù)據(jù)質(zhì)量的提高有所幫助
4.4. 即使有最嚴(yán)格的SQL檢查,那些“未知的未知”也可能會(huì)被遺漏
4.5. 數(shù)據(jù)永遠(yuǎn)不會(huì)完全可靠幔崖,而我們最好可以盡早接受這一事實(shí)