流式數(shù)據(jù)處理的幾個關(guān)鍵點重難點:
- exactly-once
- handle out-of-order data
- one-record-at-a-time processing
kafka Streams
是一個用于實時分析和處理在kafka
中數(shù)據(jù)的客戶端庫
它支持:
event time
processing time
windowing
- 實時
app state
管理和查詢
kafka Streams
自身的一些亮點:
-
簡單和輕量的客戶端庫,程序開發(fā)完成了蹬癌,直接java jar就可以運行朽肥,這個相對
hadoop 砌烁、spark
這些集群運行的job來說部署和運行簡單很多 - 除了apache kafka 之外,不需要依賴其他系統(tǒng)
- 支持容錯的本地狀態(tài)任岸,比如
window join
和聚合操作 - 支持exactly-once語義
- 支持one-record-at-a-time processing這是真正意義的低延遲實時流(早期的spark是通過small batch實現(xiàn)實時的),支持 event-time based windowing operations
- 提供了high-level Streams DSL 和low-level Processor API的流式處理原語
流式處理拓撲
-
stream是
Kafka Streams
最重要的抽象:它代表了無界,源源不斷的數(shù)據(jù)集狐血。stream是有序,可重放易核,不可變data record
的序列匈织,data record
被定義為kv
健值對(發(fā)給kakfa的數(shù)據(jù)本身就是kv
類型的,不過k
可以為空)牡直。在拓撲圖中這種有向數(shù)據(jù)流動邏輯上被抽象為邊 -
stream processing application通過processor topologies定義計算邏輯缀匕。
processor topology
是由stream processor
(節(jié)點)和stream
(邊)構(gòu)成的圖 -
stream processor
是processor topology
的節(jié)點,它代表了一個處理步驟碰逸,它每次從上游processors
讀取一個輸入記錄乡小,對它應(yīng)用操作(算子),然后產(chǎn)生一條或者多條的數(shù)據(jù)發(fā)往下游的processors
在拓撲中有兩種特別的processor
:
-
source processor 數(shù)據(jù)源節(jié)點饵史,從
kafka topic
消費數(shù)據(jù)满钟,沒有上游processors
-
sink processor 數(shù)據(jù)最后存儲節(jié)點胜榔,寫到特定的
kafka topic
沒有下游processors
Kafka Streams 提供了兩種方式用于定義流式處理拓撲:
-
high-level Streams DSL:定義了一些最常用的轉(zhuǎn)換算子
map、 filter湃番、 join 夭织、aggregations
-
low-level Processor API : 允許開發(fā)者定義和連接自定義的
processor
和與state stores
交互相關(guān)的操作
流式處理拓撲只是流式應(yīng)用的邏輯抽象,在運行時吠撮,這個邏輯拓撲會被實例化摔癣,并且分發(fā)到應(yīng)用內(nèi)部用于并行處理。
Time
流處理的關(guān)鍵就是它的時間模型纬向,比如window 操作就是基于時間邊界的:
在流式處理中一般有如下與時間相關(guān)的概念:
- Event time 數(shù)據(jù)產(chǎn)生時間
- Ingestion time kafka 收到數(shù)據(jù)的時間
- Processing time 數(shù)據(jù)處理時間
舉個例子理解以上時間的概覽:
考慮如下場景择浊,手機上的一款app將用戶日志數(shù)據(jù)上報到服務(wù)端Kafka,然后app 公司的開發(fā)者開發(fā)了一個實時處理程序逾条,實時的從kakfa中獲取用戶上報信息琢岩,統(tǒng)計dua。
我們分析一條日志在手機上產(chǎn)生师脂,然后上報到kafka集群担孔,最后由流式程序取出來用于統(tǒng)計這個過程,其中Event time
為app 日志在手機上產(chǎn)生的時間吃警,Ingestion time
為數(shù)據(jù)上報到kafka的時間糕篇,流式程序取出這個日志數(shù)據(jù)并且進行處理的時間為Processing time
State
實現(xiàn)無狀態(tài)流式應(yīng)用比較簡單,比如僅僅是從一個流中過濾數(shù)據(jù)然后發(fā)往下一個流
當需要對事件進行count
酌心,avg
拌消,或者多個時間join
時就需要維持狀態(tài)了,一般流式程序有如下幾種狀態(tài):
- Local or internal state(本地狀態(tài))本地狀態(tài)直接使用本地內(nèi)存,優(yōu)點是快
- External state(外部狀態(tài))使用外部系統(tǒng)保存狀態(tài)安券,通常是NoSQL
Duality of Streams and Tables
在high-level Streams DSL中提供了對流和表的抽象墩崩,分別對應(yīng)KStream
和KTable
- 表可以看作是當前事件信息的一個快照
- 流則是事件的
changlog
Duality of Streams and Tables
這句話是說在kafka streams
中KStream
和KTable
是可以相互轉(zhuǎn)化的
Windowing
在流上很多操作都是window
操作,也就是在一個時間片上的操作 比如:
-
moving average
各 - 一天發(fā)生事件的
top N
-
join
,對相同時間片的事件join
進行window
操作時侯勉,我們需要確定如下條件:
- 窗口的大叙谐铩(
window size
): 每個窗口包含1s
還是1min
還是5min
的事件, - 窗口移動的頻率(
advance interval
) : 窗口是每秒更新址貌,還是每分鐘更新铐拐,還是每到一個新的事件就更新,窗口大小和窗口移動頻率一致稱之為tumbling window
,每到一個新的事件就更新的窗口稱之為sliding window
-
對延遲數(shù)據(jù)的更新策略:比如可以定義延遲一個小時的數(shù)據(jù)落在指定窗口視為有效數(shù)據(jù)练对,參與計算遍蟋,大于一小時的數(shù)據(jù)可以直接丟棄(關(guān)于亂序數(shù)據(jù)的產(chǎn)生和影響,參考Out-of-Order Handling)