通過講述Data Integration資料同步的原理機制,理解資料同步的過程,進而對資料同步的執行效果有判斷能力,判斷資料同步效果具體包括:資料同步的資料量、目標端資料實際數量等。本文將為您列舉一些常見資料品質方面的情境,方便您排查是否存在符合的情境,根據對應解決方案解決資料同步品質問題。
同步原理
DataWorksData Integration採用平行處理和外掛程式化架構,以實現高效、穩定的資料同步。
並存執行模型(Job與Task)
為最大化資料輸送量,同步任務採用兩級運行結構:
作業 (Job):一個執行中的同步任務執行個體。
任務 (Task):Job的最小執行單元。一個Job會被切分為多個Task,這些Task可在單機或多機上並發執行。
每個Task負責處理一個獨立的資料分區。通過這種平行處理機制,可顯著提升整體資料同步的效率。
外掛程式化資料流(Reader與Writer)
每個Task內部的資料流由讀Reader外掛程式和Writer外掛程式通過一個記憶體緩衝區串連而成:
Reader外掛程式:負責串連來源資料儲存,讀取資料並將其推送至內部緩衝區。
Writer外掛程式:負責從緩衝區消費資料,並將其寫入目標資料存放區。
Reader和Writer外掛程式嚴格遵循各自資料來源的原生讀寫協議與資料約束(如資料類型、主鍵限制等)。因此,最終的同步效果和資料一致性行為,直接取決於源端和目標端的具體實現規則。
寫入端資料一致性排查
Data Integration的Writer外掛程式用來將源端讀取到的資料寫入至資料目標端,每一個目標資料來源類型都會有對應的Writer外掛程式,Writer外掛程式會根據使用者配置的資料寫入模式(包括衝突替換策略),使用JDBC或者對應資料來源SDK最終將資料提交給目標儲存。
資料實際在目標端寫入效果和資料內容,寫入模式、目標資料表條件約束資訊有關。
如果資料同步任務執行完成後,對於資料同步品質(資料條數、資料內容)有相關疑問,在寫入端可以嘗試從下列常見情況對照排查:
原因 | 問題描述 | 解決方案 | |
寫入模式配置不當 | Writer外掛程式會使用選擇的寫入模式將源頭資料在目標端執行重放,如果源頭資料和目標表結構出現資料約束,會對應導致資料插入失敗(髒資料)、資料插入忽略、資料插入替換等行為。 | 根據業務需求選擇正確的寫入模式。詳情請參見附表:關係型資料庫寫入模式詳解。 | |
髒資料閾值觸發 | 因資料類型不匹配、內容超長等原因產生的髒資料超出任務配置的閾值,導致任務失敗,部分資料未寫入。 | 確認髒資料出現的原因,並解決髒資料問題,或者確認可否容忍忽略髒資料。 | |
資料查詢時機過早 | 在同步任務完成前進行資料查詢。部分資料來源(如Hive、MaxCompute(可配))的資料在任務結束前可能部分或完全不可見。 | 始終在確認同步任務執行個體成功運行後,再對目標表進行資料查詢和校正。 | |
節點依賴缺失 | 下遊分析任務與上遊同步任務未配置明確的DAG依賴,導致下遊任務在資料同步完成前開始執行,讀到不完整的資料。 | 在DataStudio中為上下遊任務配置明確的父子節點依賴關係。避免使用 | |
目標表、分區有多個同步任務同時在執行,併產生了幹擾 | 不合理的同步任務並發執行。
|
| |
任務配置不能等冪執行 | 任務設計不具備等冪性(即多次運行結果不同),在重跑後導致資料重複插入或錯誤覆蓋。 | 1. 優先將任務設計為等冪(如使用 | |
分區運算式錯誤 | 以MaxCompute為例,大多數情況下資料表都是分區表,分區值是DataWorks調度參數如$bizdate,常見的錯誤:
| 檢查資料同步任務的Variant 運算式,即調度參數配置是否符合預期,同時,查看任務執行個體的執行參數是否符合預期。 | |
資料類型或時區不匹配 | 源端與目標端的資料類型或時區設定不一致,導致資料在寫入時被截斷、轉換錯誤,或在比對時出現差異。 |
| |
目標端資料發生變化 | 目標資料來源若被其他應用並發寫入,將導致其內容與源端資料不一致。 | 確保在同步視窗內,目標表不被其他進程寫入。若並發寫入是預期行為,則需接受資料差異。 | |
附表:關係型資料庫寫入模式詳解
協議類型 | 寫入模式 | 行為描述(當資料衝突時) | 行為描述(當資料不衝突時) | 主要適用情境 |
通用/MySQL協議 |
| 寫入失敗,產生髒資料。 | 正常插入新資料。 | 全量或增量追加,不希望覆蓋或修改現有資料。 |
| 替換舊行。先刪除舊行,再插入新行。 | 正常插入新資料。 | 需要用最新資料完全覆蓋舊記錄的情境。 | |
| 更新舊行。保留舊行,僅用新資料更新指定欄位。 | 正常插入新資料。 | 需要更新記錄部分欄位,同時保留其他欄位(如建立時間)的情境。 | |
| 忽略新行,不寫入也不報錯。 | 正常插入新資料。 | 只希望插入不存在的資料,對於已存在的記錄不做任何操作。 | |
PostgreSQL |
| 忽略新行,不寫入也不報錯。 | 正常插入新資料。 | 只希望插入不存在的資料,對於已存在的記錄不做任何操作。 |
| 更新舊行。使用新資料更新衝突行中的指定欄位。 | 正常插入新資料。 | 更新記錄的部分欄位,同時保留其他欄位(如建立時間)。 | |
| 丟棄衝突行。使用高效能 | 正常批量插入新資料。 | 大批量資料的高效追加,允許跳過已存在的重複記錄。 | |
| 更新衝突行。使用 | 正常批量插入新資料。 | 大批量資料的高效同步,需要用最新資料完全覆蓋舊記錄。 | |
- |
| 不支援。 | ||
讀取端資料一致性排查
Data Integration的Reader外掛程式用來串連具體的源頭資料存放區,抽取出待同步的資料並投遞給同步寫端。每一個儲存類型都會有對應的Reader外掛程式,Reader外掛程式會根據使用者配置的資料幫浦模式(包括資料過濾條件、表、分區、列等),使用JDBC或者對應資料來源SDK最終將資料幫浦出來。
資料實際讀出效果和資料同步機制、源頭資料是否變化、任務配置等有關。
如果資料同步任務執行完成後,對於資料同步品質(資料條數、資料內容)有相關疑問,在讀取端您可以嘗試從下列常見情況對照排查:
問題 | 問題描述 | 解決方案 |
源端資料並發變更 |
| 接受此行為作為高輸送量資料同步的正常預期。多次運行任務,其結果可能因源端資料的即時變化而存在差異。 |
錯誤的查詢檢查條件 |
| 檢查資料同步任務的調度Variant 運算式,即調度參數配置是否符合預期,調度時參數替換值是否符合預期。 |
讀端髒資料 | 讀取源頭資料時發生解析失敗。這在結構化資料庫中很少見,但在半結構化資料來源(如OSS/HDFS中的CSV、JSON檔案)中,可能因格式錯誤導致部分資料無法讀取。 |
|
環境資訊排查
問題 | 解決方案 |
查詢資料時,資料來源、表、分區選擇錯誤 |
|
依賴產出未完成 | 如果是周期產出的資料(周期的資料同步任務、周期的全增量資料融合Merge任務等),需要檢查下對應的依賴的資料產出任務是否正常執行並完成。 |
通用排查在您遇到資料品質方面的疑惑時,您可以嘗試多次運行任務觀察比對資料同步效果,也可以嘗試切換源或者對目標資料來源做對比測試,通過多次對比測試可以協助您縮小問題排查範圍。