ETL的架構設計和實現及其優勢

来源:https://www.cnblogs.com/xieshier/archive/2023/02/21/17123470.html
-Advertisement-
Play Games

ETL的架構 ETL架構的優勢: ETL相對於EL-T架構可以實現更為複雜的數據轉化邏輯 ETL採用單獨的硬體伺服器,可以分擔資料庫系統的負載 ETL與底層的資料庫數據存儲無關,可以保持所有的數據始終在資料庫當中,避免數據的載入和導出,從而保證效率,提高系統的可監控性。 ELT主要通過資料庫引擎來實 ...


目錄

ETL的架構

ETL架構的優勢

ETL相對於EL-T架構可以實現更為複雜的數據轉化邏輯
ETL採用單獨的硬體伺服器,可以分擔資料庫系統的負載
ETL與底層的資料庫數據存儲無關,可以保持所有的數據始終在資料庫當中,避免數據的載入和導出,從而保證效率,提高系統的可監控性。
ELT主要通過資料庫引擎來實現系統的可擴展性(尤其是當數據加工過程在晚上時,可以充分利用資料庫引擎的資源)
ELT可以根據數據的分佈情況進行並行處理優化,並可以利用資料庫的固有功能優化磁碟I/O。
ELT的可擴展性取決於資料庫引擎和其硬體伺服器的可擴展性。
通過對相關資料庫進行性能調優,ETL過程獲得3到4倍的效率提升一般不是特別困難。

離線 ETL 的架構設計

離線 ETL 採用 MapReduce 框架處理清洗不同業務的數據,主要是採用了分而治之的思想,能夠水平擴展數據清洗的能力;

graph LR 1[Input] --> 2[Map] --> 3[Output]

如上圖所示,離線 ETL 分為三個模塊:

  • Input(InputFormat):主要對數據來源(Kafka 數據)進行解析分片,按照一定策略分配到不同的 Map 進程處理;創建 RecordReader,用於對分片數據讀取解析,生成 key-value 傳送給下游處理。
  • Map(Mapper):對 key-value 數據進行加工處理。
  • Output (OutputFormat):創建 RecordWriter 將處理過的 key-value 數據按照庫、表、分區落地;最後在 commit 階段檢測消息處理的完整性。

離線 ETL 的模塊實現

數據分片(Split)

我們從 kafka 獲取當前 topic&partition 最大的 offset 以及上次消費的截止 offset ,組成本次要消費的[beginOffset、endOffset]kafkaEvent,kafkaEvent 會打散到各個 Mapper 進行處理,最終這些 offset 信息持久化到 mysql 表中。

img

那麼如何保證數據不傾斜呢?首先通過配置自定義 mapper 個數,並創建對應個數的 ETLSplit。由於 kafkaEevent 包含了單個 topic&partition 之前消費的 Offset 以及將要消費的最大 Offset,即可獲得每個 kafkaEvent 需要消費的消息總量。最後遍歷所有的 kafkaEevent,將當前 kafkaEevent 加入當前最小的 ETLSplit(通過比較需要消費的數據量總和,即可得出),通過這樣生成的 ETLSplit 能儘量保證數據均衡。

數據解析清洗(Read)

img

如上圖所示,首先每個分片會有對應的 RecordReader 去解析,RecordReade 內包含多個 KafkaConsumerReader ,就是對每個 KafkaEevent 進行消費。每個 KafkaEevent 會對應一個 KafkaConsumer,拉取了位元組數據消息之後需要對此進行 decode 反序列化,此時就涉及到 MessageDecoder 的結構。MessageDecoder 目前支持三種格式:

格式 涉及 topic
Avro android、ios、ad_sdk_android...
Json app-server-meipai、anti-spam...
DelimiterText app-server-youyan、app-server-youyan-im...

MessageDecoder 接收到 Kafka 的 key 和 value 時會對它們進行反序列化,最後生成 ETLKey 和 ETLValue。同時 MessageDecoder 內包含了 Injector,它主要做瞭如下事情:

  • 註入 Aid:針對 arachnia agent 採集的日誌數據,解析 KafkaKey 註入日誌唯一標識 Aid;
  • 註入 GeoIP 信息:根據 GeoIP 解析 ip 信息註入地理信息(如 country_id、province_id、city_id);
  • 註入 SdkDeviceInfo: 本身實時流 ETL 會做註入 gid、is_app_new 等信息,但是離線 ETL 檢測這些信息是否完整,做進一步保障。

過程中還有涉及到 DebugFilter,它將 SDK 調試設備的日誌過濾,不落地到 HDFS。

多文件落地(Write)

由於 MapReduce 本身的 RecordWriter 不支持單個落地多個文件,需要特殊處理,並且 HDFS 文件是不支持多個進程(線程)writer、append,於是我們將KafkaKey+ 業務分區+ 時間分區 + Kafka partition定義一個唯一的文件,每個文件都是會到帶上 kafka partition 信息。同時對每個文件創建一個RecordWriter。

每個 RecordWriter 包含多個 Writer ,每個 Writer 對應一個文件,這樣可以避免同一個文件多線程讀寫。目前是通過 guava cache 維護 writer 的數量,如果 writer 太多或者太長時間沒有寫訪問就會觸發 close 動作,待下批有對應目錄的 kafka 消息在創建 writer 進行 append 操作。這樣我們可以做到在同一個 map 內對多個文件進行寫入追加。

檢測數據消費完整性 (Commit)

MapReduce Counter 為提供我們一個視窗,觀察統計 MapReduce job 運行期的各種細節數據。並且它自帶了許多預設 Counter,可以檢測數據是否完整消費:

reader_records: 解析成功的消息條數;

decode_records_error: 解析失敗的消息條數;

writer_records: 寫入成功的消息條數;

...

最後通過本次要消費 topic offset 數量、reader_records 以及 writer_records 數量是否一致,來確認消息消費是否完整。

允許一定比例的臟數據,若超出限度會生成簡訊告警

參考鏈接

https://blog.csdn.net/javastart/article/details/113838240

美圖離線ETL實踐 - 掘金 (juejin.cn)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CM4 Media是一款基於 Raspberry Pi / 樹莓派 Compute Module 4,由EDATEC設計的多媒體電腦。 SPECIFICATIONS 分類 特點 處理器 Broadcom BCM2711 quad-core Cortex-A72 (ARM v8) 64-bit SoC ...
  • 為什麼使用資料庫 使用資料庫主要原因有兩點: 為了方便我們長久的存儲數據 可以很方便的幫我們管理,查詢資料庫中的數據! 可以存儲各種各樣的數據類型,比如:字元串、數字、文件、圖片等等 資料庫的常用概念 DB:資料庫(Database) 即存儲數據的倉庫,其本質是一個文件系統。它保存了一系列有組織的數 ...
  • 本文旨在站在研發的角度上通過手動實踐搭建運行環境,文中不拖泥帶水過多講述基礎知識,結合Hadoop和Spark最新版本,幫助大家跟著步驟一步步實踐環境搭建。 ...
  • 背景: pgsql連接時候報錯org.postgresql.util.PSQLException: FATAL: sorry, too many clients already, 意思是client已經把連接池占滿了. 使用ps -ef | grep postgres刪除幾個進程, 進入資料庫運行S ...
  • PXC
    centos8下安裝pxc-80 官方地址 https://www.percona.com/doc/percona-repo-config/index.html https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/yum ...
  • 數據驅動理念已被各行各業所熟知,核心環節包括數據採集、埋點規劃、數據建模、數據分析和指標體系構建。在用戶行為數據領域,對常見的多維數據模型進行信息提煉和模型整合,可以形成一套常見的數據分析方法來發現用戶行為的內在聯繫,能更好洞察用戶的行為習慣和行為規律,幫助企業挖掘用戶數據的商業價值。 行業內... ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Flink是一個批處理和流處理結合的統一計算框架,其核心是一個提供了數據分發以及並行化計算的流數據處理引擎。它的最大亮 ...
  • 摘要:你知道數倉是如何應運而生的嗎?你瞭解數倉未來的發展趨勢嗎?想知道國內數倉專家的看法嗎? 導語 數據倉庫的發展一直是備受關註的議題,隨著近年來技術的不斷演進,數倉也在更新迭代。 你知道數倉是如何應運而生的嗎?你瞭解數倉未來的發展趨勢嗎?想知道國內數倉專家的看法嗎? 今天我們邀請到了華為雲數據倉庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...