以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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...