以flink實時流的方式實現OneId

来源:https://www.cnblogs.com/sqhhh/archive/2023/01/30/17074226.html
-Advertisement-
Play Games

一:背景 1. 講故事 大家都知道資料庫應用程式 它天生需要圍繞著數據文件打轉,諸如包含數據的 .mdf,事務日誌的 .ldf,很多時候深入瞭解這兩類文件的合成原理,差不多對資料庫就能理解一半了,關於 .mdf 的合成前面的文章已經有所介紹,這篇我們來聊一下 .ldf 的一些內部知識,比如 LSN。 ...


以flink實時流的方式實現OneId

前言

oneid相關概念,及其當前離線實現方式介紹請見以下鏈接及其系列其他文章:

用戶標簽(一):圖計算實現ID_Mapping、Oneid打通數據孤島

讀完上述鏈接的相關文章,將理解oneid的需求及其實現方式.

背景

之前公司是做電商數據分析,可以接入多個數據源的數據(美團,餓了麽,京東等),在我們系統中,我們將為每個用戶統一打上在我們系統內部的user_id,即oneid.當時已經有了基於spark圖計算實現的id-mapping來達成oneid.

到這裡,我們已有的系統跟前言中鏈接文章提到的內容相似.

後來,我們有了新需求:實時化改造.實時為每個用戶統計相關數據.

但是,實時計算的數據最後要歸納到用戶上,那麼我們的id-mapping也需要實時出現結果.

思考

本人不具備機器學習領域的知識,在看了幾遍前言中的文章後,勉強搞懂了該圖計算的原理,本質上是求最大連通圖,研究後發現需要拿到全量數據進行迭代,不能改造為實時計算.

後來,基於"最大連通圖"的演算法,變種出了一種方法:

  1. 輸入兩個數據關聯關係,例如 美團id1-餓了麽id1,即輸入兩個點一個線.
  2. 拿到該關係,分別拿兩個數據去與已有的id-mapping結果表對比.如,我們結果id-mapping表中,有關係
    美團id1 - oneid1
    餓了麽id1 - oneid2
    
  3. 通過第一步中傳入的關係,可以得出 美團id1 與 餓了麽id1 在我們系統中應該識別為同一個人,對應同一個oneid,可以得到
    美團id1 - oneid1
    餓了麽id1 - oneid1
    
    或者,都對應為另一個oneid
    美團id1 - oneid2
    餓了麽id1 - oneid2
    
    即,我們通過傳入關聯關係,將 美團id1 與 餓了麽id1 在我們系統中重新更新為關聯到同一個oneid.
  4. 後續,某個用戶id是 美團id1,那麼它關聯這個id-mapping結果表,可以得到它在我們系統中的id是oneid1(或者oneid2,此處根據第三步如何取值)
  5. 根據不同的對比結果,進行相應的替換或者新增,我們變相實現了"最大連通圖"的演算法,並且這個演算法可以用flink實時計算實現

詳細步驟

0. id-mapping結果表設計

結果表可以有多個描述欄位,但是核心應該是以下兩個欄位:

原id , 計算出的oneid

1. 輸入數據採集

我們在採集數據的時候,需要將數據解析成兩兩的關係對.如原始數據:

手機號1,美團id1,設備id1

需要將這條消息拆分為:

手機號1 - 美團id1
手機號1 - 設備id1
美團id1 - 設備id1

再將這三組關聯關係傳給後續對比計算.

2. 對比計算

假設我們得到關係對:

x - y

我們拿到此關係對到結果表中進行對比將有以下幾種情況:

  1. x,y都沒有對應oneid: 直接對結果表插入計算得出的新oneid(可以使用uuid)
    x - 新oneid
    y - 新oneid
    
  2. x已有對應oneid為 XXoneid,y沒有:將y的oneid賦值為 XXoneid,並插入,得到
    x - XXoneid
    y - XXoneid
    
  3. x沒有,y有oneid為 YYoneid :同第二種情況,得到
    x - YYoneid
    y - YYoneid
    
  4. x,y都有oneid,且一致,都為 ZZoneid: 不更新
  5. x,y都有oneid,且不一致,分別為 XXoneid,YYoneid :將 x,y更新為同一個oneid(XXoneid或者YYoneid),或者重新生成一個.此處看個人選擇.
    並且!!!!!!
    將結果表中所有oneid為 XXoneid,YYoneid的相關數據,oneid都重設為新選擇的oneid
    這是為了將相關聯的其他數據一起指向新的oneid
    

至此,通過以上幾種情況.我們復現了id-mapping中求最大連通圖的演算法.

實現程式設計

1. 數據源

kafka

2. 實時計算程式

flink

3. 對比中如何取數

redis:將結果表以k-v的形式放在記憶體中,這樣flink可以快速取值並對比計算

4. 結果表存放

hbase:此處可以換為mysql,doris等支持更新的存儲即可.並且還有以下原因:

對比計算中,第五種情況,需要從這裡取所有oneid為 XXoneid,YYoneid的相關數據
而redis中沒法根據value來取得key,所以第五種情況,需要查詢此處存儲得到相關數據

5. 結果更新

結果不但要更新hbase,還要更新redis中存放的k-v對!!!建議先更新redis,因為比較快.


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

-Advertisement-
Play Games
更多相關文章
  • 作者:京東物流 王北永 姚再毅 1 背景 日常開發過程中,尤其在 DDD 過程中,經常遇到 VO/MODEL/PO 等領域模型的相互轉換。此時我們會一個欄位一個欄位進行 set|get 設置。要麼使用工具類進行暴力的屬性拷貝,在這個暴力屬性拷貝過程中好的工具更能提高程式的運行效率,反之引起性能低下、 ...
  • 對於logback的模板來說,我們是可以自定義的,同時它也提供了一些公開的常量,比如%level,%thread這些,我們如果希望自定義這些常量,需要實現ClassicConverter抽象類,重寫它的convert方法。 系統變數 %thread 當前線程 %d{yyyy-MM-dd HH:mm: ...
  • 一、Lua應用場景 游戲開發 獨立應用腳本 Web 應用腳本 擴展和資料庫插件如:MySQL Proxy 和 MySQL WorkBench 安全系統,如入侵檢測系統 教程採用Aide Lua Pro或AndLua+開發安卓應用。在學習開發安卓應用前,先學習lua的基礎課程。 二、配置手機開發環境 ...
  • 怎麼從菜鳥程式員變成架構師 一、正確理解架構師的工作 架構師一般是不會去探討業務的範疇,他是把整個項目的結構搭出來,並讓程式員去填肉(業務功能部分) ,一般架構師的好壞決定這個項目的工期與質量,現在市面上看見的架構師一般都是別人的框架直接拿來用的,所以就不存在技術提升的範疇。很少會自己搭建框架。如果 ...
  • 一 引入 考慮實現一種機械泵控制項。 機械泵是工業中通常用來製造真空的一類設備,我們在繪製界面UI時希望可以生動形象地來表述一個機械泵,下麵講述了一種簡單的實現。 二 MechanicalPumpControl 聲明一個MechanicalPumpControl的自定義控制項,它繼承自Control類。 ...
  • 前言 Keil C51 是 51 系列相容單片機 C 語言軟體開發系統,支持 8051 微控制器體繫結構的 Keil 開發工具,適合每個階段的開發人員,不管是專業的應用工程師,還是剛學習嵌入式軟體開發的學生。 本篇博主將詳細介紹嵌入式集成開發環境 Keil C51 的安裝與註冊方法,以及國產 STC ...
  • xz是什麼 高壓縮率的工具,它使用 LZMA2 壓縮演算法,生成的壓縮文件比傳統使用的 gzip、bzip2 生成的壓縮文件更小, 不過xz也有一個壞處就是壓縮時間比較長,比7z壓縮時間還長一些。不過壓縮主要用於歸檔,不介意的可以忽略。 擅長壓縮文本和日誌文件,針對這塊的壓縮率,是目前我發現效率最高的 ...
  • Docker的常用命令 幫助命令 docker version # docker版本 docker info # 顯示docker的系統信息,包括鏡像和容器的數量 docker [命令] --help # 查看某個具體的命令 鏡像命令 查看下載的所有鏡像 # docker images REPOSI ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...