kafka 深入理解

**Kafka Stream :**它表示一個無限的,不斷更新的數據集。流是一個有序的,可重放(反覆的使用),不可變的容錯序列,數據記錄的格式是鍵值對(key-value)。如何區分事件時間和處理時間、Windowing的支持、簡單高效的管理和實時查詢應用程序狀態。
在這裏插入圖片描述

通過Kafka Streams編寫一個或多個的計算邏輯的處理器拓撲。其中處理器拓撲是一個由流(邊緣)連接的流處理(節點)的圖。

流處理器是處理器拓撲中的一個節點;它表示一個處理的步驟,用來轉換流中的數據(從拓撲中的上游處理器一次接受一個輸入消息,並且隨後產生一個或多個輸出消息到其下游處理器中)。

在這裏插入圖片描述

在拓撲中有兩個特別的處理器:

1.  源處理器(Source Processor):源處理器是一個沒有任何上游處理器的特殊類型的流處理器。它從一個或多個kafka主題生成輸入流。通過消費這些主題的消息並將它們轉發到下游處理器。
2.  Sink處理器:sink處理器是一個沒有下游流處理器的特殊類型的流處理器。它接收上游流處理器的消息發送到一個指定的Kafka主題。

在這裏插入圖片描述

時間

Windowing a stream(窗口流)

跳躍時間窗口是基於時間間隔的窗口。此模式固定大小,(可能)重疊的窗口。通過2個屬性來定義跳躍窗口:窗口的大小和其前進間隔(又叫“跳躍”)。前進間隔是根據前一個窗口來指定向前移動多少。例如,你可以配置一個跳躍窗口,大小爲5分鐘,前進間隔是1分鐘。由於跳躍窗口可以重疊。因此數據記錄可以屬於多於一個這樣的窗口。

滾動時間窗口是跳躍時間窗口的特殊情況,並且像後者一樣,也是基於時間間隔。其模型固定大小,非重疊,無間隔窗口。滾動窗口是通過單個屬性來定義的:窗口的大小。滾動窗口等於其前進間隔的跳躍窗口大小。由於滾動窗口不會重疊,數據記錄僅屬於一個且僅有一個窗口。

滑動窗口模式是基於時間軸的連續滑動的固定大小的窗口。如果它們的時間戳的差在窗口大小內,則兩個數據記錄包含在同一個窗口中。因此,滑動窗口不和epoch對準,而是與數據時間戳對準。在Kafka Streams中,滑動窗口僅用於join操作,並且可通過JoinWindows類指定。

會話窗口(Session windows)是基於key事件聚合成會話。會話表示一個活動期間,由不活動間隔分割定義的。在任何現有會話的不活動間隔內處理的任何事件都將合併到現有的會話中。如果事件在會話間隔之外,那麼將創建新的會話。會話窗口獨立的跟蹤的key(即,不同key的窗口通常開始和結束時間不同)和它們大小的變化(即使相同的key的窗口大小通常都不同)。因爲這樣session窗口不能被預先計算,而是從數據記錄的時間戳分析獲取的

Join multiple streams(連接多個流)
join(連接,加入)操作基於其數據記錄的key來合併兩個流,併產生一個新的流。在記錄流上通常需要在窗口的基礎上執行連接,否則爲了執行連接必須保持記錄的數量可以無限增長。在Kafka Streams中,可以執行以下連接操作:

KStream對Kstreams連接始終基於窗口,否則內存和狀態需要計算加入的無限增長大小。這裏,從流中新接收的記錄與指定窗口間隔內的其他流的記錄相連接,爲每個匹配生成一個結果(基於用戶提供的ValueJoiner)。新KStream實例表示從此操作者返回join流的結果。

KTable對KTable連接連接操作設計和關係型數據庫中連接操作一致。這裏,兩個變更日誌流首先是本地狀態存儲。當從流中接收新的記錄時,它與其他流的狀態倉庫相結合,爲每個匹配對生成一個結果(基於用戶提供的ValueJoiner)。新KTable實例表示連接流的結果,它也代表表的變更日誌流,從此操作人返回。

KStream對KTable連接允許當你從另一個記錄流(KStream)接受到新記錄時,針對變更日誌劉(KTabloe)執行表查詢。例如,用最新的用戶個人信息(KTable)來填充豐富用戶的活動流(KStream)。只有從記錄流接受的記錄觸發連接並通過ValueJoiner生成結果,反之(即,從變更日誌流接收的記錄將只更新狀態倉庫)。新的KStream表示該操作者返回的接入結果流。

KStream對GlobalKTable連接允許你基於從其他記錄流(KStream)接受到新記錄時,針對一個完整複製的變更日誌流(GlobalKTable)執行表查詢。連接GlobalKTable不需要重新分配輸入KStream,因爲GlobalKTable的所有分區在每個KafkaStreams實例中都可用。與連接操作一起提供的KeyValueMapper應用到每個KStream記錄,提取用於查找GlobalKTable的連接key,從而可以進行非記錄key連接。例如,用最新的用戶個人信息(GlobalKTable)來豐富用戶活躍流(KStream)。只有從記錄流接收的記錄觸發連接併產生結果(通過ValueJoiner),反之亦然(即,從變更日誌流接收的記錄僅被用於更新狀態倉庫)。新的KStream實例代表從該操作者返回的連接結果流。

流實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章