以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
  • 就像 Web Api 介面可以對入參進行驗證,避免用戶傳入非法的或者不符合我們預期的參數一樣,選項也可以對配置源的內容進行驗證,避免配置中的值與選項類中的屬性不對應或者不滿足預期,畢竟大部分配置都是通過字元串的方式,驗證是很有必要的。 1. 註解驗證 像入參驗證一樣,選項驗證也可以通過特性註解方便地 ...
  • 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/17270107.html 加工的泛型類如下: using System; using System.Collections.Generic; using System.IO; using Syst ...
  • 在前一篇文章,我們瞭解瞭如何通過.NET6+Quartz開發基於控制台應用程式的定時任務,今天繼續在之前的基礎上,進一步講解基於ASP.NET Core MVC+Quartz實現定時任務的可視化管理頁面,僅供學習分享使用,如有不足之處,還請指正。 涉及知識點 Quartz組件,關於Quartz組件的 ...
  • 面向對象1 面向對象,更在乎的結果,而過程的實現並不重要 IDea快捷鍵(基礎版) | 快捷鍵 | 作用 | | | | | ctrl + / | 快捷註釋 | | ctrl + shift + / | 多行註釋 | | ctrl + d | 快速複製 | | ctrl + shift + up/d ...
  • NX中的checkmate功能是用於檢查模型、圖紙數據的工具,在UGOPEN中有例子。手動操作可以檢查已載入的裝配下所有零部件,可以設置通過後保存模型,檢查結果保存到Teamcenter中,預設保存在零組件版本下。 代碼中可以設置多個檢查規則。相關設置可以在用戶預設設置中進行設置。 1 // 2 / ...
  • JavaSE 運算符 算術運算符:+,-,*,/,%,++(自增),--(自減) i++:先用後+1;++i:先+1後用 賦值運算符:= 擴展賦值運算符:+=,-=,*=,/= a+=b >a=a+b: ​ 可讀性差,但是編譯效率高,且會自動進行類型轉換; ​ 當ab為基本數據類型時,a+b和b+a ...
  • 面向對象2 訪問修飾符 | | private | default | protected | public | | | | | | | | 當前類 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_che ...
  • 推薦一些學習qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html 這是一個由Qt官方提供的完整的QML教程,包含了所有基本知識和高級語法。 QML中文網:http://www.qmlcn.com/ 這是一個非常不錯的中文QML學習網站,提 ...
  • QAbstractBUtton: 所有按鈕控制項的基類 提供按鈕的通用功能 繼承自QWidget 屬於抽象類別,不能直接去使用,必須藉助於子類(除非你覺得子類不夠用,想自定義一個按鈕) 大部分功能之前已經使用過,在這裡只作簡單介紹 文本設置: setText(str) :設置按鈕提示文本 text() ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 配置文件中配置項 StartDisabled 的使用方法。 ...