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