粗糧廠的基于flink的汽車實時數倉解決方案

基于flink的實時數倉解決方案

  • 1 背景
  • 2 業務模型
    • 1 業務框架
    • 2 難點痛點
  • 3技術選型
    • 1 計算引擎
    • 2 中間存儲
    • 3 查詢引擎
    • 4 flink計算架構設計
      • 1 純實時架構
      • 2 純實時+定期補充離線數據
      • 3 純實時+定期刷新過期binlog
      • 4 lamdba + 分字段更新 + 歷史過期數據刷新
    • 5 痛點解決
      • delta join
      • merge-engine
      • hologres分字段更新

這里主要是做一個記錄畢竟工作了這么多年,想要總結一下,所以就慢慢寫,慢慢更新了,想到哪里寫哪里吧。

1 背景

其實背景很簡單,就是要做實時數倉,總的原因是提高數據的可用性與時效性,所以單純的批處理已經無法滿足業務需求了,甚至有些業務從動作發生,到業務處理,到數倉處理,到展示可能 要求整體流程在5s以內,所以就有了這么一個項目的誕生。

2 業務模型

在這里插入圖片描述

1 業務框架

汽車領域的業務其實都大差不差,包含生產,銷售,交付等等,所以在博主這里,主要分為以下數據域:線索,銷售,交付,售后 四大部分。
其中有一些數據域的融合,例如 線索到銷售的漏斗轉化,線索到客服之類的融合。

2 難點痛點

其實具體的業務模型,對于開發汽車領域的同學來說,沒什么具體作用,而痛點難點,卻是相同的,例如:

  • flink超長周期的,秒級運算如何維護,一個客戶21年留下來聯系方式,今天忽然買了一輛汽車,這個轉化率 如何能夠秒級更新?有兩張表,用戶信息表(uid, tag_id, level),和用戶標簽表(tag_id,tag_name),下游想要一個,能夠獲取全部數據的,全量數據做主流推送,去更新寬表,兩邊數據的時間跨度會有好幾年,這時候數據要怎么使用維護?
  • 一張300個字段的寬表,怎么保證實時更新每個字段?

3技術選型

1 計算引擎

這里可選的不多,在滿足秒級更新與吞吐量的情況下,這里首選flink

2 中間存儲

中間存儲指的是,實時數倉中間存儲層,flink內部狀態,各種關聯的維度表等等。
維度表:這里指實時維表,一個任務不停寫入數據,另一個任務把他當做維度表來使用。

考察了 MySQL,iceberg,paimon,hologres 幾個存儲:

  • 其中MySQL吞吐量和單表不太夠
  • iceberg 延遲太高,寫入后可讀要有一定延遲,達不到業務要求,而且hdfs查詢也慢
  • paimon與iceberg差不多,但能好很多
  • hologres,性能最好,但價格最高
  • kafka 可讀性與永久存儲達不到要求

所以綜合比較,最后選擇了hologres來做中間存儲,消費cdc消費binlog可以達到類似使用kafka的模式

3 查詢引擎

這里主要指服務端查詢數據的存儲,這里用過很多存儲,mysql ,doris,iceberg,hologres,最終目前采用的是iceberg+hologres的方案。

  • mysql還是那個樣子,對于實時匯總的明細,例如百萬 ,千萬級明細,多維度匯總展示,性能上有欠缺。
  • doris 會有熱點問題,而且需要專門的集群維護,另外服務端使用,經常會關聯維度表展示,這部分性能也不是特別好
  • iceberg 便宜,量大,慢,除了慢,似乎沒有不好的地方了
  • 所以最終采用的是 hologres+iceberg的模式,直接頁面展示的各種匯總值,明細值,使用的都是hologres存儲,在優化好索引后,千萬級別的數據做聚合也可以做到500ms以內,iceberg提供明細下載能力,詳細數據使用iceberg+spark提供給用戶

4 flink計算架構設計

1 純實時架構

這里可以理解為 flink+kafka 這種方式,我們運行過一段時間,但僅限于比較簡單的業務架構,像是復雜一點的,尤其是歷史累計值那種,就會很被動了,例如上面說的,要統計用戶轉化率,這個轉化率周期可能會跨度好幾年,所以就不太合適這種指標的開發,但是用作etl的動作,提供明細數據是非常合適的

2 純實時+定期補充離線數據

這個其實是第一種方案的升級版本,也是flink+kafka,但是會定期的用spark把離線的數據推送一份到kafka里,也就是kafka的topic里時刻,都會有全部的數據,可能會有重復,但不會少數據,所以這樣用flink計算,無論是累計值,還是明細,都可以在flink state里取到。唯一的區別是什么呢,資源消耗會比較大,因為kafka和flink使用的資源會

3 純實時+定期刷新過期binlog

這種則是第二種方式的升級版,使用的是flink+binlog的方式,如果數據量少,可能用的是mysql,數據量大,可能hologres,用flinkcdc的方式,消費binlog數據,例如 如果flink state是7天的生命周期,每天update原始數據庫的 7天以前產生的數據,把etl時間更新成now,這樣 所有now - 7day以前的數據,都是過期的了,每次刷新的數據量就少了,更新的數據也少了

這個方案也使用過大約1年左右,目前發現 一個flink任務中,總的數據量 不超過20G以上,用這種方式都非常方便,甚至可以說又方便又快。

4 lamdba + 分字段更新 + 歷史過期數據刷新

最后一種,也是正在使用的就是,用目前市面最常用的lamdba的方案 ,也就是實時+離線的方式,每次離線任務執行完,通過更新視圖的方式,離線union實時 ,兩張表 共同提供數據,使用業務時間做切分。

另外使用hologres的分字段更新,一個表10個字段,通過主鍵,多個flink任務共同更新一張hologres表,下游可以直接接binlog就可以一行數據,只要主鍵相同,就能接到好幾個表的數據,而且不會過期,永久存儲。這種方式,適用于上文說的 300個字段,多個數據域通過同一個主鍵來將數據打平一張大寬表。

5 痛點解決

delta join

這里主要是flink2.2中預計上線的一個能力,是雙流 無狀態join,需要雙流都是binlog,也就是有原始的永久存儲,也就是state中沒有狀態保留,每次都loop up join表,兩個超級大表互相關聯,flink只需要提供很小的內存就可以執行,并且不會有狀態過期的問題,對于時間跨度超級大的場景最好用

merge-engine

這里主要是把paimon中的一些能力 應用到了flink 對于 hologres上,這里是對sink的 connector的改造
例如數據插入的時候,會默認保留首條,拋棄后續數據,或者保留最大最小等。

hologres分字段更新

這里是hologres的能力 ,通過相同數據,將不同數據寫入到目標表的同一行里,省去了join的動作,一方面是解耦,另一方面解決的狀態過期的問題

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

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

相關文章

Datawhale AI夏令營---coze空間共學

1.進入coze空間 2.點擊免費使用 3.點擊制作播客,微信上面選好鏈接 徹底搞懂深度學習-模型訓練和推理(動圖講解) 4.運行過程 5.音頻鏈接 https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/sami_podcast…

遙感機器學習入門實戰教程|Sklearn案例⑥:網格搜索與超參數優化

在前幾篇案例中,有同學在后臺留言:“模型的參數到底怎么調?比如 SVM 的 C 和 γ,隨機森林的樹數和深度,要怎么選才能得到最優結果呢?”這是一個非常經典的問題:參數選不好,模型效果差…

論文精讀(三)|智能合約漏洞檢測技術綜述

筆者鏈接:撲克中的黑桃A 專欄鏈接:論文精讀 本文關鍵詞:智能合約;合約安全;合約可靠性;合約質量保障;漏洞檢測;合約程序分析 引 諸位技術同仁: 本系列將系統精讀的方式,深入剖析計算機科學頂級期刊/會議論文&#…

YOLO --- YOLO11模型以及項目詳解

YOLO — YOLO11模型以及項目詳解 文章目錄YOLO --- YOLO11模型以及項目詳解一,開源地址二,重要模塊2.1 C3K22.2 C2PSA2.3 檢測頭三,網絡結構3.1 整體結構劃分3.2 Backbone 結構分析(從下往上看)3.3 結構分析&#xff0…

Debezium監聽MySQL binlog并實現有狀態重啟

Debezium實現MySQL數據監聽了解Debezium? 本期主要內容實現步驟1. 新建Maven工程2.導入依賴3.核心代碼編寫4.offset的存儲5.OffsetBackingStore實現jdbc模式6.運行結果總結了解Debezium 官網:https://debezium.io/ Debezium是一組分布式服務,用于捕獲數…

InfluxDB 存儲優化:TSM 文件管理與空間回收(一)

一、InfluxDB 與 TSM 文件初相識**在數字化時代,數據量呈爆發式增長,尤其是時間序列數據,如服務器監控指標、傳感器讀數、金融交易記錄等,它們都帶有時間戳,記錄著事物隨時間的變化。InfluxDB 作為一款高性能的開源時序…

macos使用FFmpeg與SDL解碼并播放H.265視頻

效果: 安裝依賴: brew install ffmpeg brew install sdl2 brew install x265 確認x265已啟用 查看x265版本 工程CMakeLists.txt

C#開源庫ACadSharp讀取dwg圖元的示例

文章目錄介紹數據示例讀取圖元屬性介紹 開源庫ACadSharp的地址:https://github.com/DomCR/ACadSharp 可以在NuGet中搜索到該庫并安裝。 數據示例 數據是一個繪制了以下簡單圖元的dwg數據: 讀取圖元屬性 創建了.net6控制臺項目,通過NuG…

【UniApp打包鴻蒙APP全流程】如何配置并添加UniApp API所需的鴻蒙系統權限

一、前言:為什么選擇 UniApp 打包鴻蒙應用? 隨著鴻蒙生態的快速發展,越來越多開發者希望將現有跨平臺項目快速接入鴻蒙系統。而 UniApp 作為國內領先的跨平臺開發框架,憑借其“一次開發,多端發布”的特性,…

STM32-FreeRTOS快速入門指南(下)

第十一章 FreeRTOS事件標志組 1. 事件標志組簡介 事件標志組與信號量一樣屬于任務間同步的機制,但是信號量一般用于任務間的單事件同步,對于任務間的多事件同步,僅使用信號量就顯得力不從心了。 FreeRTOS 提供的事件標志組可以很好的處理多事…

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式

KTH7812磁編碼器芯片完全支持ABZ和UVW輸出模式,具體功能細節如下:🔧 1. ABZ輸出特性 分辨率可編程:支持 4~4096步/圈(對應1~1024個脈沖周期/圈),用戶可通過配置寄存器自定義分辨率。 輸出頻率…

Android為ijkplayer設置音頻發音類型usage

官方文檔 多區音頻路由 | Android Open Source Projecthttps://source.android.google.cn/docs/automotive/audio/audio-multizone-routing?hlzh-cn 背景 車機系統開發多分區(zone)功能,可以實現同一個app通過設置,在不同分…

C++ 循環:從入門到精通的深度解析

《C++ 循環:從入門到精通的深度解析》 目錄 循環的本質與編程價值 三大基礎循環結構詳解 循環控制語句:break與continue的魔法 嵌套循環:構建復雜邏輯的基石 現代C++循環特性(C++11+) 循環性能優化與常見陷阱 實戰案例:算法與工程中的循環應用 面試題深度解析與編程技巧…

| `cat /etc/os-release` | 發行版詳細信息(如 Ubuntu、CentOS) |

在 Linux 或類 Unix 系統中,最簡潔的命令查看操作系統類型是: uname -s? 輸出示例: LinuxDarwin(macOS)FreeBSD 等🔍 說明: uname:顯示系統信息-s:僅顯示操作系統內核名…

Maya 3D建模:點、線、面、創建多邊面

目錄 一 點、線、面 二 創建多邊面 一 點、線、面 鼠標放在模型上 按住鼠標右鍵:就可以選擇點 線 面 shift 加選點線面 ctrl 減選點線面 頂點面:是一個檢查模式,觀察有無錯誤 選擇面,單擊一個面,按住shift鍵 同時…

CXR-LT 2024:一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽|文獻速遞-深度學習人工智能醫療圖像

Title題目CXR-LT 2024: A MICCAI challenge on long-tailed, multi-label, and zero-shotdisease classification from chest X-rayCXR-LT 2024:一場關于基于胸部X線的長尾、多標簽和零樣本疾病分類的MICCAI挑戰賽01文獻速遞介紹CXR-LT系列是一項由社區推動的計劃&a…

拆解本地組策略編輯器 (gpedit.msc) 的界面和功能

我們來詳細拆解本地組策略編輯器 (gpedit.msc) 的界面和功能。打開后,你會看到一個標準的微軟管理控制臺 (MMC) 窗口,主要分為三個部分。 這是一個典型的本地組策略編輯器界面,我們將其分為三個主要部分進行講解: +-----------------------------------------------+----…

[NCTF2019]True XML cookbook

TRY 嘗試XML外部實體注入 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE user[<!ENTITY flag SYSTEM "file://./doLogin.php"> ]> <user><username> &flag; </username><password>1</pa…

嵌入式硬件篇---模塊使用

在電子開發、自動化控制等領域&#xff0c;“模塊” 是實現特定功能的標準化組件&#xff08;可以理解為 “功能積木”&#xff09;。不同模塊分工明確&#xff0c;比如有的負責感知環境&#xff08;傳感器&#xff09;&#xff0c;有的負責通信&#xff08;藍牙 / WiFi&#x…

密碼管理中Null 密碼

Null 密碼定義&#xff1a;Null 密碼是指允許用戶或系統賬戶使用空密碼&#xff08;即不輸入任何字符&#xff09;進行登錄或身份驗證的配置。危害&#xff1a;完全繞過身份驗證&#xff1a;這是最嚴重的危害。攻擊者無需破解或竊取任何密碼&#xff0c;只需輸入用戶名并留空密…