以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
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...