數倉搬遷:從方法到實踐,帶你解決資料一致性對比
摘要:資料倉庫建設過程中,總是會涉及到不同平臺、同一平臺物理環境搬遷,由於資料倉庫資料量龐大,往往資料搬遷不可能在一個短週期內完成,會涉及資料同步、校驗、追批並跑、再校驗過程。
本文主要闡述資料校驗過程設計,供相關人員借鑑。
資料一致性校驗最核心內容項
校驗手段
根據常見資料儲存型別,主要完成物件級記錄一致性校驗,欄位級數值、時間、字元型別的資料一致性校驗,即常規提到的表級count、欄位級數值的sum、時間型別差值sum、字元型別的checksum。
下文以TD搬遷GaussDB(DWS)為例,
1. 記錄數
a) 表級count(*)
2. 資料型別
a) 彙總Sum(cola)
b) 平均Avg(cola)
c) 例外,針對float型別這種存在精度缺失場景,或直接不校驗,或比對兩個平臺差異小於5%範圍即可接受;
d) 注意事項,不同平臺可能存在sum放大小數點位數問題,可通過指定小數點位置,讓兩個平臺數值完全一致;
3. 時間型別
a) 彙總Sum(時間轉換數字)
b) Date型別實現樣式
i. DWS:select extract(epoch from '20200819'::date);
ii. TD:sel (date'2020-08-19'-date'1970-01-01')*86400;
c) Time型別實現樣式
i. DWS:select extract(epoch from '12:12:12'::time);
ii. TD:sel extract(hour from time'12:12:12')*3600+extract(minute from time'12:12:12')*60+extract(second from time'12:12:12');
d) TimeStamp型別實現
i. DWS:select extract(epoch from '2020-08-19 12:12:12'::timestamp);
ii. TD:sel ( (timestamp'2020-08-19 12:12:12'(date))-date'1970-01-01')*86400+extract(hour from timestamp'2020-08-19 12:12:12')*3600+extract(minute from timestamp'2020-08-19 12:12:12')*60+extract(second from timestamp'2020-08-19 12:12:12');
e) 即將兩個平臺將採用同一週期進行時間型別彙總,保證資料求和一致性;
4. 字元型別
a) 整體思路是將字串在同一字符集條件下計算MD5值,再進行MD5串切分、異或(XOR),得到相對較小數值,再進行數值sum求和;
注,若兩個平臺均支援自定義聚合函式,可以直接進行每個字串MD5值計算,再進行全部MD5值異或操作,得到最終值,用於識別資料一致性;
b) DWS實現邏輯
建立自定義函式,
Create or replace function xor_md5(text) returns bigint immutable as $$ select ('x'||lpad(substr(md5($1),1,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5($1),9,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5($1),17,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5($1),25,8),16,'0'))::bit(64)::bigint; $$ language sql; create function xor_md5_latin(text) returns bigint immutable as $$ select ('x'||lpad(substr(md5(convert($1,'GB18030')),1,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5(convert($1,'GB18030')),9,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5(convert($1,'GB18030')),17,8),16,'0'))::bit(64)::bigint # ('x'||lpad(substr(md5(convert($1,'GB18030')),25,8),16,'0'))::bit(64)::bigint; $$ language sql;
c) TD實現邏輯
i. 方式一:建立SQL自定義函式
replace function xor_md5(inpt varchar(32000)) returns bigint language sql deterministic contains sql sql SECURITY DEFINER collation INVOKER INLINE TYPE 1 return bitxor( bitxor ( bitxor ( cast(from_bytes(to_bytes( translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),1,8) using latin_to_unicode),'base16'),'base10') as bigint) ,cast(from_bytes(to_bytes( translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),9,8) using latin_to_unicode),'base16'),'base10') as bigint)) ,cast(from_bytes(to_bytes( translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),17,8) using latin_to_unicode),'base16'),'base10') as bigint)) ,cast(from_bytes(to_bytes( translate(substr(hash_md5(udf_utf16to8(udf_w936to16(inpt,''))),25,8) using latin_to_unicode),'base16'),'base10') as bigint));
注,TD通常實踐中以Latin儲存GBK中文資料,而GaussDB(DWS)一般推薦採用主流UTF8字符集儲存資料,則雙方進行字元md5計算時,需轉換成同一個字符集,其中涉及hash_md5、udf_utf16to8、udf_w936to16三個非TD內建函式,需要https://downloads.teradata.com/查詢下載
ii. 方式二:建立C自定義函式
replace function xor_md5_latin ( arg varchar(32000) character set latin) returns bigint language c no sql external name 'ci:md5:md5.h:cs:xor_md5:xor_md5_latin.c:cs:md5:md5.c:F:xor_md5' parameter style td_general; replace function xor_md5(inpt varchar(32000)) returns bigint language sql deterministic contains sql sql SECURITY DEFINER collation INVOKER INLINE TYPE 1 return xor_md5_latin(udf_utf16to8(udf_w936to16(inpt,'')));
C程式碼若有需要私聊留言
d) 測試資料如下
i. TD執行情況
Select xor_md5(‘a’); ------------------------ 2491710610 Select xor_md5_latin(‘中國’); ------------------------ 66934228 Select xor_md5(‘中國’); ------------------------ 1004201695 ii. GS執行情況 Select xor_md5(‘a’); ------------------------ 2491710610 Select xor_md5_latin(‘中國’); ------------------------ 66934228 Select xor_md5(‘中國’); ------------------------ 1004201695
校驗資料範圍
根據資料倉庫資料特性,進行切片粒度資料收集,除記錄數統計之外,其它均以欄位級粒度收集資料,即一個切片一個欄位產生一條記錄資訊。
注:針對VA型別,存在多日流水資料發生變化場景,將最新變化流水資料打包成一個切片進行校驗;
通過以上切片粒度,實現資料增量校驗;而每隔一個週期,再進行全量校驗,保障資料完整、一致;
校驗方式
根據資料倉庫特性,可以分為常規批量校驗和自定義校驗;
通常,可以將校驗嵌入批量過程中,即對應作業的資料表發生變化後,直接觸發相關資料表校驗,這樣實現資料準實時校驗,保證兩個平臺並跑期間資料一致性;另外,在確保兩個平臺數據穩定前提下,可以固定時間段或使用者直接發起實時校驗,用於核對平臺一致性;
校驗策略
可進行資料表分級分類,將有限校驗計算資源投入到資料一致性校驗中,可參照以下分類,
自動化服務
以上闡述了相關實現的方法論,最後再探討一下如何實踐;
自動化校驗框架,建議常駐rest服務,用於接收客戶端觸發的校驗請求,分發各資料平臺執行校驗採集工作,利用rest服務實現跨伺服器互動問題;採用一個portal展現介面,用於使用者錄入自定義校驗規則以及檢視資料校驗情況。