实时计算pv/uv Demo
簡(jiǎn)介: 本文由阿里巴巴高級(jí)技術(shù)專家鄧小勇(靜行)分享,主要用 Demo 演示如何通過實(shí)時(shí)計(jì)算 Flink 實(shí)時(shí)計(jì)算pv/uv的場(chǎng)景。
本文由阿里巴巴高級(jí)技術(shù)專家鄧小勇(靜行)分享,主要用 Demo 演示如何通過實(shí)時(shí)計(jì)算 Flink 實(shí)時(shí)計(jì)算pv/uv的場(chǎng)景。內(nèi)容將從以下幾部分進(jìn)行:
首先為大家展示一個(gè)比較簡(jiǎn)單的pv/uv場(chǎng)景。以下圖所示的APP為例,整個(gè)業(yè)務(wù)構(gòu)架需要幾個(gè)入口,包括用戶訪問入口、作者入口和運(yùn)營人員入口。在運(yùn)營人員入口進(jìn)去可以查看系統(tǒng)的一些指標(biāo),比如app 的pv/uv。
在開始介紹如何計(jì)算實(shí)時(shí)pv/uv之前,可以先了解下上圖的10個(gè)字段和它們對(duì)應(yīng)的含義。通過這些字段可以了解到,用戶在APP上的任何一次操作都會(huì)在數(shù)據(jù)庫中留下一條對(duì)應(yīng)的記錄,所有記錄就是該用戶在APP上的操作流水。
那么如何實(shí)時(shí)計(jì)算pv/uv呢?
有兩種方案。
方案一,MySQL的變更數(shù)據(jù)同步到Kafka后進(jìn)行實(shí)時(shí)計(jì)算。由于 Flink在設(shè)計(jì)之初是具有流表二象性的,所以在 Flink 1.1版本之后,就可以實(shí)現(xiàn) Flink 對(duì) Kafka變更數(shù)據(jù)的處理了,包括處理一些修改、刪除等操作。處理后的結(jié)果會(huì)放到阿里云Hologress里,方便用戶進(jìn)行大數(shù)據(jù)查詢和分析。
方案二,從上圖可以看到方案一比方案二只多了一個(gè)Kafka,在 Flink 1.11 版本之后,可以直接通過Debezium連接MySQL,然后經(jīng)過Flink 實(shí)時(shí)計(jì)算,也可以完成同樣功能。
兩個(gè)方案都可以實(shí)現(xiàn),那么如何選擇呢?主要取決于業(yè)務(wù)。如果數(shù)據(jù)只是暫存,日志需要展示或是需要多個(gè)下游使用,需要保存到Kafka;如果日志不需要回溯,或是沒有下游使用,那么方案二更適合。
實(shí)戰(zhàn)演示
如下圖所示,我們選擇方案二(MySQL-CDC源表方式)來演示。
首先打開實(shí)時(shí)計(jì)算 Flink平臺(tái),點(diǎn)擊左側(cè)SQL編輯器,然后通過Create Table方式設(shè)定上文提到的10個(gè)字段。這樣就定義了數(shù)據(jù)的源頭。
定義源頭之后,接下來要構(gòu)建目標(biāo)表。如下圖所示,在構(gòu)建目標(biāo)表時(shí),定義了blackhole_pv_uv表,構(gòu)造了一個(gè)無實(shí)際存儲(chǔ)的目標(biāo)端,充當(dāng)調(diào)試作用,先把邏輯跑通,然后再去往目標(biāo)端去寫代碼。Blackhole 會(huì)吸收掉輸出結(jié)果數(shù)據(jù),先處理掉源端和計(jì)算的問題。
以上的表會(huì)落到 Flink Catalog里,對(duì)于實(shí)時(shí)計(jì)算pv/uv上下游表格的準(zhǔn)備就完成了。如果需要調(diào)整表,也可以通過DDL SQL語句完成。
做好建表準(zhǔn)備后,如何實(shí)時(shí)計(jì)算想要達(dá)到的目標(biāo)呢?以最簡(jiǎn)單的方式來演示。
先把數(shù)據(jù)寫到Blackhole里,然后把4個(gè)字段值計(jì)算出來,比如cuurenttime,event_hour等。
通過上圖所示的代碼可以計(jì)算出,數(shù)據(jù)是什么時(shí)候輸入的,數(shù)據(jù)的pv/uv值等等。
運(yùn)行剛剛寫入的作業(yè):
然后點(diǎn)擊創(chuàng)建SQL作業(yè),
創(chuàng)建完成后,點(diǎn)擊啟動(dòng)。
啟動(dòng)后可以點(diǎn)擊 Flink UI 來查看運(yùn)行狀態(tài)。查看時(shí)候可以看到下端有顯示記錄了8條數(shù)據(jù):
回到數(shù)據(jù)庫也能看到對(duì)應(yīng)的8條數(shù)據(jù):
如何把實(shí)際的結(jié)果寫到holo里呢?
核心邏輯與上文實(shí)時(shí)計(jì)算的邏輯是一樣的,唯一不一樣的是,要把計(jì)算的結(jié)果既輸出到holo_pv_uv里去,同時(shí)也輸出到backhole里去,也就是要把同樣的結(jié)果輸出兩份,這是在流計(jì)算里經(jīng)常會(huì)遇到的情況。甚至還有在同一作業(yè)里不同的業(yè)務(wù)邏輯或計(jì)算結(jié)果,也要輸出到不同的目標(biāo)端的情況。
打開實(shí)時(shí)計(jì)算 Flink 頁面的SQL編輯器,在輸入框中創(chuàng)建 temporary view,把數(shù)據(jù)記錄到blackhole 里和holo里。
為了實(shí)現(xiàn)這個(gè)目標(biāo),需要增加一個(gè)叫begin statement set和end的語法,這其實(shí)是定義了一個(gè)計(jì)算邏輯,使得在它們中間的邏輯任務(wù)就會(huì)同時(shí)運(yùn)行。
然后完成部署、創(chuàng)建作業(yè)和啟動(dòng)后,就能看到這個(gè)計(jì)算邏輯已經(jīng)成功了。
?
?
作者:鄧小勇(靜行)
原文鏈接?
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載
?
總結(jié)
以上是生活随笔為你收集整理的实时计算pv/uv Demo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flink 双流 Join 的3种操作示
- 下一篇: Flink 必知必会经典课程四:Faul