深入理解數倉開發(二)數據技術篇之數據同步

1、數據同步

????????數據同步我們之前在數倉當中使用了多種工具,比如使用 Flume 將日志文件從服務器采集到 Kafka,再通過 Flume 將 Kafka 中的數據采集到 HDFS。使用 MaxWell 實時監聽 MySQL 的 binlog 日志,并將采集到的變更日志(json 格式)保存到 Kafka,同樣再由一個 Flume 同步到 HDFS。使用 DataX 每天 0 點將需要全量同步的數據全量采集到 HDFS。

????????數據同步主要的作用就是實現不同數據源的數據流轉,對于大數據系統來說,包含把數據從業務系統同步進入數據倉庫和把數據從數據倉庫當中同步進入數據服務和數據應用兩個方面。

1.1、三種同步方式

1.1.1、直連同步

????????直連同步是指通過定義好的規范接口 API 和基于動態鏈接庫的方式直接連接業務數據庫,比如 ODBC/JDBC 等規定了統一規范的標準接口,不同數據庫廠商基于這套接口實現了自己的驅動,支持完全相同的函數調用和 SQL 實現。

? ? ? ? 直連同步就是通過 JDBC/ODBC 連接數據庫來往數倉進行寫入,但是這種方式對數據庫系統的性能影響比較大,尤其是執行大批量的數據同步可能會嚴重拖垮業務系統的性能。如果業務系統采用主備策略,則可以從備庫抽取數據,避免對業務系統產生性能影響。但是終究這不是一種好辦法。

1.1.2、數據文件同步

? ? ? ? 通過約定好的文件編碼、大小、格式等,直接從源系統生成數據的文本文件(比如把數據庫的二進制文件轉為文本文件),由專門的文件服務器傳輸到目標系統,對于常見的關系型數據庫,這種方式比較簡單實用。

? ? ? ? 另外,對于互聯網日志數據,通常是以文本文件形式保存的,所以也適合這種方式。

1.1.3、數據庫日志解析同步

? ? ? ? 現在大多數主流的數據庫都已經實現了使用日志文件進行系統恢復,比如 MySQL 的 binlog,通過數據庫日志可以實現增量同步的需求,不僅延遲可以控制在毫秒級別,而且對數據庫性能影響也比較小,目前這種方式也是廣泛應用于從業務系統到數倉的增量同步應用中的。

? ? ? ? 通過數據庫日志解析同步的效率雖然高,但是依然存在一些問題:

  • 數據延遲。當業務系統做批量補錄時可能會使數據更新量超出系統處理的峰值,導致數據延遲。
  • 投入較大。需要在業務數據庫和數倉之間部署一個專門用來實時同步的系統(比如 MaxWell,Cannal,這倒是也不算太大問題)。
  • 數據漂移和遺漏。數據漂移一般是對于增量表而言的。具體解決方案下面會專門介紹。

1.2、阿里數據倉庫的同步方式?

?????????關于阿里云數據倉庫的同步方式這里簡單介紹,對于批量數據同步,阿里云使用的就是人家自研的 DataX;而關于實時數據同步,我們之前使用的是 MaxWell,而阿里云使用的是自家的 TT(TimeTunnel),具有高性能、實時性、高可用、可擴展等特點,被阿里巴巴廣泛應用于日志收集、數據監控、廣告反饋、量子統計、數據庫同步等領域。TT 是一種基于生產者、消費者和 Topic 的消息中間件(基于 HBase),不管是日志服務器中的日志還是業務系統中的數據都可以通過 TT 來進行同步到 MaxCompute。

1.3、數據同步中的問題與決絕方案

這里主要介紹數據漂移

1.3.1、數據漂移問題

????????數據漂移一般是對增量表而言的,它指的是數據在同步到數倉(ODS 層)過程中,由于網絡延遲或者系統壓力的原因,導致上一個分區的數據進入了下一個分區(今天的數據到了明天)。

? ? ? ? 由于 ODS 層有著面向歷史的細節數據查詢需求,這就要求數據采集到 ODS 層后必須按照時間進行分區存儲(離線數倉基本都是按天進行分區)

說明

????????盡管離線數倉一般是以天為單位來進行數據分析,但并不是說我們就等到每天 0 點才開始同步前一整天的數據。

????????事實上,數據同步策略分為全量/增量同步,對于訂單表這種本身就非常大,而且變化也特別大的表一般都是采用實時同步策略(增量)。阿里巴巴采用 TT(TimeTunnel)來實現對業務數據庫的實時數據同步(原理就是監聽 binlog),但是一般并不是一條數據同步一次,而是累積一定時間間隔進行同步(比如每 15 分鐘)

????這里使用訂單表來說明數據漂移是怎么發生的,對于我們的業務數據表,它并不會像我們在數倉建表那樣為每個業務過程建立一張表,而是通過 update 操作來實現業務過程的變化,比如當 order_status 為已下單時,proc_time 就代表下單時間;當 order_status 為待支付時,modified_time 就代表狀態變化為待支付的時間。

idorder_idproc_timeorder_statusmodified_time
11001下單時間已下單/支付中/支付成功狀態修改時間

?通常,用于分區的時間戳字段分為四種:

  • 業務表中用于標識數據記錄更新的時間戳字段(modified_time,比如訂單表中當訂單狀態變化為待支付、支付成功的識貨,modified_time 就會發生變化)
  • 數據庫日志(binlog)當中用于標識數據記錄更新的時間戳字段(log_time)
  • 業務表中用于記錄業務過程發生時間的時間戳字段(proc_time,比如下單時間、支付時間)
  • 數據被抽取到的時間戳字段(extract_time, Flume 中的數據在寫入到?Kafka 之后,如果沒有 Event Header ,那么數據的時間默認就是寫入到 Kafka 的時間)

理論上,這幾個時間應該是一致的,但是在現實中,四個時間戳的大小關系為:proc_time<log_time<modified_time<extract_time,造成這些差異的原因有:

  • 數據抽取是需要時間的而且得在數據產生之后,所以 extract_time 往往比另外三個時間都晚。
  • 關系型數據庫采用預寫日志方式來更新數據,所以更新時間modified_time會晚于log_time
  • 業務不能保證 modified_time 一定被更新。
  • 由于網絡或系統壓力問題,會導致數據延遲寫入/數據延遲更新。log_time或者modified_time會晚于proc_time

? ? ? ? 通常的做法是選擇其中一個字段來進行分區,這就導致了數據漂移。下面是數據漂移常見的幾種場景:

  • 根據 extract_time 進行分區。這種情況下最容易出現數據漂移。(比如 Flume 經過一定延遲把數據寫入到?Kafka 之后,如果沒有 Event Header,那么當 Kafka 的數據被轉為 Flume 格式時,Header 中默認的 timestamp 就是寫入到 Kafka 的時間?)
  • 根據 modified_time 進行分區。但是業務不能保證 modified_time 一定被更新。
  • 根據 log_time 進行分區。由于網絡或者系統壓力,可能會出現延遲。
  • 根據 proc_time 進行分區。如果根據 proc_time 進行分區,我們得到的數據就遺漏了業務過程的變化(比如對于待支付、支付成功這些業務過程都是需要通過 modified_time 和 order_status 來確定的)。

數據漂移問題的解決方案(面試題)

1、多獲取后一天的數據

????????在每個 ODS 表時間分區中多冗余一部分數據,保證數據只多不少,畢竟即使網絡延遲再高,很小概率會超過 15 分鐘,所以我們可以向后冗余 15 分鐘的數據。但是這種方式會有一些誤差,比如我 1 號 0 點之前下單,2 號 1 點取消訂單,那么對于 1 號,我的數據狀態應該是已下單狀態,但是由于我把 2 號的部分數據頁拉到我的分區了,所以就可能導致記錄的狀態為訂單已關閉。所以對于記錄狀態更新頻繁的場景,我們可以創建拉鏈表,用時間(起始時間和結束時間)來約束獲取記錄的狀態。

2、多個時間戳字段限制

① 根據 modified_time 獲取后一天 15 分鐘的數據,并限制多個和業務過程的時間戳(下單、支付、成功)都是當天,然后根據這些數據按照 modified_time 升序排序,獲取每個數據(每個訂單,可以用 order_id 唯一區分)首次數據變更的那條記錄
② 根據 log_time 分別冗余前一天最后15分鐘的數據和后一天凌晨開始15分鐘的數據,并用 modified_time 過濾非當天數據,并針對每個訂單按照 log_time 進行降序排序,取每個訂單當天最后一次數據變更的那條記錄
③ 將兩部分數據根據 order_id 做full join 全外連接,將漂移數據回補到當天數據中。

? ? ? ? 總之,數據漂移是不可能杜絕的,畢竟大數據場景下網絡延遲和系統壓力不可避免,所以只能通過一些規則限制獲得相對準確的數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16463.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【二叉樹】:LeetCode:100.相同的數(分治)

&#x1f381;個人主頁&#xff1a;我們的五年 &#x1f50d;系列專欄&#xff1a;初階初階結構刷題 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 1.問題描述&#xff1a; 2.問題分析&#xff1a; 二叉樹是區分結構的&#xff0c;即左右子樹是不一…

[JDK工具-6] jmap java內存映射工具

文章目錄 1. 介紹2. 主要選項3. 生成java堆轉儲快照 jmap -dump4. 顯示堆詳細信息 jmap -heap pid5. 顯示堆中對象統計信息 jmap -histo pid jmap(Memory Map for Java) 1. 介紹 位置&#xff1a;jdk\bin 作用&#xff1a; jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Mem…

PySide6升級導致的Fatal Python error: could not initialize part 2問題及其解決方法

問題出現 把PySide6從6.6.1升級到6.7.1&#xff0c;結果運行程序的時候就報如下錯誤&#xff1a; Traceback (most recent call last): File "signature_bootstrap.py", line 77, in bootstrap File "signature_bootstrap.py", line 93, in find_inc…

Kafka SASL_SSL集群認證

背景 公司需要對kafka環境進行安全驗證,目前考慮到的方案有Kerberos和SSL和SASL_SSL,最終考慮到安全和功能的豐富度,我們最終選擇了SASL_SSL方案。處于知識積累的角度,記錄一下kafka SASL_SSL安裝部署的步驟。 機器規劃 目前測試環境公搭建了三臺kafka主機服務,現在將詳…

H3CNE-7-TCP和UDP協議

TCP和UDP協議 TCP&#xff1a;可靠傳輸&#xff0c;面向連接 -------- 速度慢&#xff0c;準確性高 UDP&#xff1a;不可靠傳輸&#xff0c;非面向連接 -------- 速度快&#xff0c;但準確性差 面向連接&#xff1a;如果某應用層協議的四層使用TCP端口&#xff0c;那么正式的…

智能家居完結 -- 整體設計

系統框圖 前情提要: 智能家居1 -- 實現語音模塊-CSDN博客 智能家居2 -- 實現網絡控制模塊-CSDN博客 智能家居3 - 實現煙霧報警模塊-CSDN博客 智能家居4 -- 添加接收消息的初步處理-CSDN博客 智能家居5 - 實現處理線程-CSDN博客 智能家居6 -- 配置 ini文件優化設備添加-CS…

【MySQL】聊聊count的相關操作

在平時的操作中&#xff0c;經常使用count進行操作&#xff0c;計算統計的數據。那么具體的原理是如何的&#xff1f;為什么有時候執行count很慢。 count的實現方式 select count(*) from student;對于MyISAM引擎來說&#xff0c;會把一個表的總行數存儲在磁盤上&#xff0c;…

Linux下Vision Mamba環境配置+多CUDA版本切換

上篇文章大致講了下Vision Mamba的相關知識&#xff0c;網上關于Vision Mamba的配置博客太多&#xff0c;筆者主要用來整合下。 筆者在Win10和Linux下分別嘗試配置相關環境。 Win10下配置 失敗 \textcolor{red}{失敗} 失敗&#xff0c;最后出現的問題如下&#xff1a; https://…

基于物聯網架構的電子小票服務系統

1.電子小票物聯網架構 采用感知層、網絡層和應用層的3層物聯網體系架構模型&#xff0c;電子小票物聯網的架構見圖1。 圖1 電子小票物聯網架構 感知層的小票智能硬件能夠取代傳統的小票打印機&#xff0c;在不改變商家原有收銀系統的前提下&#xff0c;采集收音機待打印的購物…

react中的數據驅動視圖,useState()的使用

前端開發如今有一個很重要的思想就是數據驅動視圖&#xff0c;數據發生變化使ui發生變化&#xff0c;比如一個變量count&#xff0c;為0顯示三個按鈕&#xff0c;為1顯示一個按鈕&#xff0c;為2顯示兩個按鈕。這就是一個簡單的數據驅動視圖。 import { useState } from reactf…

修改 ant design tour 漫游式導航的彈窗邊框樣式

一 說明 應項目要求&#xff0c;調整ant design tour 彈窗邊框的樣式。tour 原本樣式是有遮罩層&#xff0c;因此沒有邊框看起來也不突兀。原圖如下&#xff1a; 但是UI設計是取消遮罩層&#xff0c;并設置邊框樣式。當 取消 了遮罩層&#xff0c;沒有設置邊框樣式的圖片如下&a…

python考試成績管理與分析:從列表到方差

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、考試成績的輸入與列表管理 二、成績的總分與平均成績計算 三、成績方差的計算 四、成…

雙指針用法練習題(2024/5/26)

1三數之和 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請 你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元…

人工智能場景下的網絡負載均衡技術

AI技術驅動智能應用井噴&#xff0c;智能算力增速遠超通用算力。IDC預測&#xff0c;未來五年&#xff0c;我國智能算力規模年復合增長率將超50%&#xff0c;開啟數據中心算力新紀元。隨著需求激增&#xff0c;數據中心或智算網絡亟需擴容、增速、減時延&#xff0c;確保網絡穩…

rockylinux 利用nexus 搭建私服yum倉庫

簡單說下為啥弄這個私服&#xff0c;因為自己要學習一些東西&#xff0c;比如新版的k8s等&#xff0c;其中會涉及到一些yum的安裝&#xff0c;為了防止因網絡問題導致yum安裝失敗&#xff0c;和重復下載&#xff0c;所以弄個私服&#xff0c;當然也有為了意外保障的想法&#x…

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解-類的聲明周期-加載器 1 初識JVM1.1 什么是JVM1.2 JVM的功能1.2.1 即時編譯 1.3 常見JVM 2 字節碼文件詳解2.1 Java虛擬機的組成2.2 字節碼文件的組成2.2.1 正確打開字節碼文件2.2.2 字節碼組成2.2.3 基礎信息2.2.3.1 魔數2.2.3.1 主副…

【C++】右值引用 移動語義

目錄 前言一、右值引用與移動語義1.1 左值引用和右值引用1.2 右值引用使用場景和意義1.3 右值引用引用左值及其一些更深入的使用場景分析1.3.1 完美轉發 二、新的類功能三、可變參數模板 前言 本篇文章我們繼續來聊聊C11新增的一些語法——右值引用&#xff0c;我們在之前就已…

進程間通信的方式中,socket和消息隊列的區別

進程間通信的方式中&#xff0c;socket和消息隊列的區別 進程間通信方式中&#xff0c;socket和消息隊列的主要區別在于通信的方式和跨機通信的能力。 socket是通過網絡傳輸的方式來實現進程間通信&#xff0c;并且可以跨主機&#xff1b;而消息隊列是通過內核提供的緩沖區進…

Flutter 中的 AbsorbPointer 小部件:全面指南

Flutter 中的 AbsorbPointer 小部件&#xff1a;全面指南 在Flutter中&#xff0c;AbsorbPointer是一個特殊的小部件&#xff0c;用于吸收&#xff08;或“吞噬”&#xff09;所有傳遞到其子組件的指針事件&#xff08;如觸摸或鼠標點擊&#xff09;。這在某些情況下非常有用&…