Kafka Streams | 流,實時處理和功能

1.目標

在咱們以前的Kafka教程中,咱們討論了Kafka中的ZooKeeper今天,在這個Kafka Streams教程中,咱們將學習Kafka中Streams的實際含義。此外,咱們將看到Kafka Stream架構,用例和Kafka流功能。此外,咱們將討論Apache Kafka中的流處理拓撲。java

Kafka Streams是一個用於構建應用程序和微服務的客戶端庫,尤爲是輸入和輸出數據存儲在Apache Kafka Clusters中基本上,憑藉Kafka服務器端集羣技術的優點,Kafka Streams結合了編寫的簡單性以及在客戶端部署標準JavaScala應用程序。 linux

那麼,讓咱們從Apache Kafka Streams開始吧。apache

Kafka Stream教程

Kafka Streams | 流和實時處理安全

首先,咱們來討論一下Stream和Real-Time Kafka Processing服務器

2.卡夫卡的流和實時處理 

咱們稱之爲Kafka Stream處理,能夠連續,同時,逐條記錄地實時處理數據。架構

Kafka中的實時處理是Kafka的應用之一。 app

基本上,Kafka實時處理包括連續的數據流。所以,在分析了這些數據以後,咱們從中得到了一些有用的數據。如今,在談到Kafka時,實時處理一般涉及從主題(源)讀取數據,進行一些分析或轉換工做,而後將結果寫回另外一個主題(接收器)。要作這種類型的工做,有幾種選擇。 框架

咱們可使用Kafka Consumer編寫本身的自定義代碼來讀取數據並經過Kafka Producer寫入數據。 分佈式

或者咱們使用完整的流處理框架,如Spark StreamingFlinkStorm等。
可是,有一個替代上述選項,即Kafka Streams。那麼,讓咱們瞭解Kafka Streams。ide

3. Kafka Streams是什麼?

Kafka Streams是一個客戶端庫,咱們使用它來處理和分析存儲在Kafka中的數據。它依賴於重要的流處理概念,例如正確區分事件時間和處理時間,窗口支持,簡單而有效的管理以及應用程序狀態的實時查詢。 

此外,Kafka Streams的入門門檻低,這意味着咱們能夠在一臺機器上快速編寫和運行小規模的概念驗證。爲此,咱們只須要在多臺機器上運行咱們的應用程序的其餘實例,以擴展到大批量生產工做負載。此外,經過利用Kafka的並行模型,它能夠透明地處理同一應用程序的多個實例的負載平衡。

與Kafka Streams相關的一些要點:

  • Kafka Stream能夠輕鬆嵌入到任何Java應用程序中,並與用戶爲其流應用程序提供的任何現有打包,部署和操做工具集成,由於它是一個簡單輕量級的客戶端庫。
  • Apache Kafka自己之外的系統沒有外部依賴關係做爲內部消息傳遞層。
  • 爲了實現很是快速和有效的有狀態操做(窗口鏈接和聚合),它支持容錯本地狀態。
  • 爲了保證每一個記錄只處理一次,即便在處理過程當中Streams客戶端或Kafka代理發生故障時也只處理一次,它只提供一次處理語義。
  • 爲了實現毫秒級處理延遲,採用一次記錄一次處理。此外,隨着記錄的延遲到來,它支持基於事件時間的窗口操做。
  • 除了高級Streams DSL和低級處理器API以外,它還提供必要的流處理原語。

4.卡夫卡的流處理拓撲

  • Kafka Streams最重要的抽象是一個基本上,它表明了一個無限的,不斷更新的數據集。換句話說,在訂單,可重放和容錯的不可變數據記錄序列中,數據記錄被定義爲鍵值對,咱們稱之爲流。
  • 此外,任何使用Kafka Streams庫的程序都是流處理應用程序經過一個或多個處理器拓撲,它定義其計算邏輯,尤爲是在處理器拓撲是經過流(邊緣)鏈接的流處理器(節點)的圖形的狀況下。
  • 在Stream處理器拓撲中,有一個節點咱們稱之爲流處理器它表示經過從拓撲中的上游處理器一次接收一個輸入記錄,將其操做應用於其中來轉換流中的數據的處理步驟。此外,能夠隨後向其下游處理器產生一個或多個輸出記錄。

在卡夫卡得分 - 測試你的知識

Kafka Streams拓撲中的兩個特殊處理器是:

一個。源處理器

它是一種特殊類型的流處理器,沒有任何上游處理器。經過使用來自一個或多個Kafka主題的記錄並將其轉發到其下游處理器,它會爲其拓撲生成輸入流。

灣 接收器處理器

與源處理器不一樣,此流處理器沒有下游處理器。基本上,它將從其上游處理器接收的任何記錄發送到指定的Kafka主題
閱讀Apache Kafka Security | Kafka的需求和組件
注意:在處理當前記錄時,也能夠在普通處理器節點中訪問其餘遠程系統。所以,處理後的結果能夠流回Kafka或寫入外部系統。

卡夫卡流

Kafka流處理器拓撲

5. Kafka Streams Architecture

基本上,經過構建Kafka生產者和消費者庫並利用Kafka的本機功能來提供數據並行性,分佈式協調,容錯和操做簡單性,Kafka Streams簡化了應用程序開發。
讓咱們修改Kafka架構
下圖描述了使用Kafka Streams庫的應用程序的解剖結構。 

卡夫卡流

Kafka Streams Architecture

一個。流分區和任務

可是,對於存儲和傳輸,Kafka的消息傳遞層對數據進行分區。一樣,對於處理數據,Kafka Streams對其進行分區。所以,咱們能夠說分區是實現數據局部性,彈性,可伸縮性,高性能和容錯的緣由。在並行化的背景下,Kafka Streams和Kafka之間有着密切的聯繫:

  • 每一個Kafka流分區按順序是一系列數據記錄,並映射到Kafka主題分區。
  • 流中的數據記錄映射到該主題的Kafka消息。
  • 在Kafka和Kafka Streams中,數據記錄的密鑰決定了數據的分區,即數據記錄的密鑰決定了到主題內特定分區的路由。

看看Kafka的優勢和缺點
此外,經過將應用程序的處理器拓撲分解爲多個任務,它能夠進行縮放。可是,在應用程序的輸入流分區的基礎上,Kafka Streams建立了固定數量的任務,每一個任務都分配了Kafka輸入流中的分區列表(即Kafka主題)。 此外,無需人工干預,Kafka流任務既能夠獨立處理,也能夠並行處理。
下圖描述了兩個任務,每一個任務分配了輸入流的一個分區。

卡夫卡流

Kafka流體系結構 - 流分區和任務

灣 線程模型

Kafka Streams容許用戶配置庫可用於在應用程序實例中並行化進程的線程數。可是,憑藉其獨立的處理器拓撲,每一個線程能夠執行一個或多個任務。例如,下面的圖像描述了一個運行兩個流任務的流線程。

測試你在卡夫卡的位置

卡夫卡流

Kafka流體系結構 - 線程模型

C。當地的國家商店

Kafka Streams提供所謂的國營商店基本上,咱們使用它來經過流處理應用程序存儲和查詢數據,這是實現有狀態操做時的一項重要功能。例如,當您調用有狀態運算符(例如join()或aggregate())或者窗口化流時,Kafka Streams DSL會自動建立和管理此類狀態存儲。
在Kafka Streams應用程序中,每一個流任務能夠嵌入一個或多個本地狀態存儲,甚至API也能夠訪問存儲並查詢處理所需的數據。此外,Kafka Streams等本地國營商店提供容錯和自動恢復功能。
想知道Apache Kafka職業範圍 - 請點擊連接
下圖描述了兩個流任務及其專用的本地狀態存儲。

卡夫卡流

Kafka溪流 - 本地商店

讓咱們用它的Command來探索Apache Kafka Operations

d。容錯

可是,它集成在Kafka中,它基於容錯功能。雖然流數據持久保存到Kafka,但即便應用程序失敗並須要從新處理它也可用。此外,爲了處理故障,Kafka Streams中的任務利用了Kafka消費者客戶端提供的容錯功能。 

此外,這裏的本地國營商店也很容易出現故障。所以,它維護一個複製的更改日誌Kafka主題,在該主題中,它跟蹤每一個狀態存儲的任何狀態更新。若是任務在另外一臺計算機上失敗並從新啓動的任務上運行,則Kafka Streams會保證在失敗以前經過重播相應的更改日誌主題來恢復其關聯的狀態存儲到內容以前的內容。所以,故障處理對最終用戶徹底透明。
咱們來討論Apache Kafka Monitoring - Methods&Tools

6.實施Kafka Streams

基本上,使用Kafka Streams構建,流處理應用程序看起來像:

A提供流配置

Properties streamsConfiguration = new Properties(); streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, 「Streaming-QuickStart」); streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, 「localhost:9092」); streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());

 

獲取主題和Serdes

String topic = configReader.getKStreamTopic(); String producerTopic = configReader.getKafkaTopic(); final Serde stringSerde = Serdes.String(); final Serde longSerde = Serdes.Long();

 

破解卡夫卡專訪的祕訣

C。構建流和獲取數據

KStreamBuilder builder = new KStreamBuilder(); 
KStream <String,String> inputStreamData = builder.stream(stringSerde,stringSerde,producerTopic);

d。卡夫卡流的處理

KStream <String,Long> processedStream = inputStreamData.mapValues(record - > record.length())
除了鏈接和聚合操做以外,還有爲KStream提供的其餘轉換操做的列表。所以,這些操做中的每個能夠生成一個或多個KStream對象。此外,能夠將一個或多個鏈接的處理器轉換爲底層處理器拓撲。此外,爲了組成複雜的處理器拓撲,全部這些轉換方法均可以連接在一塊兒。
在這些轉換中,filter,map,mapValues等是無狀態轉換操做,用戶可使用它們將自定義函數做爲參數傳遞,例如過濾器的謂詞,地圖的KeyValueMapper等,根據它們在語言。
讓咱們瞭解Kafka Tools

即 寫溪流回到卡夫卡

processedStream.to(stringSerde,longSerde,topic); 
這裏,即便在內部結構初始化以後,處理也不會開始。所以,經過調用start()方法,咱們必須顯式啓動Kafka Streams線程:
KafkaStreams streams = new KafkaStreams(builder,streamsConfiguration); 
streams.start(); 
所以,最後一步是關閉Stream。

7. Kafka Streams的特色

  1. 最佳功能是彈性,高可擴展性和容錯性。
  2. 部署到容器,VM,裸機,雲。
  3. 對於小型,中型和大型用例,它一樣可行。
  4. 它徹底與Kafka安全集成
  5. 編寫標準Java應用程序
  6. 徹底一次處理語義。
  7. 不須要單獨的處理集羣。
  8. 它是在Mac,Linux,Windows上開發的。

8. Kafka Streams用例

一個。紐約時報

爲了將已發佈的內容實時存儲和分發到爲讀者提供的各類應用程序和系統,它使用Apache Kafka和Kafka Streams。

灣 Zalando

Zalando使用Kafka做爲ESB(企業服務總線)做爲歐洲領先的在線時尚零售商。這有助於他們從單一服務架構過渡到微服務架構。此外,使用Kafka處理事件流,他們的技術團隊能夠實現近乎實時的商業智能。

C。

爲了相互通訊,LINE使用Apache Kafka做爲其服務的中央數據中心。與Line同樣,天天產生數千億條消息,用於執行各類業務邏輯,威脅檢測,搜索索引和數據分析。此外,Kafka幫助LINE可靠地轉換和過濾主題,使消費者能夠有效消費的子主題同時保持易於維護。

d。Pinterest的

爲了爲其廣告基礎設施的實時預測預算系統提供動力,Pinterest大規模使用Apache Kafka和Kafka Streams。Kafka Streams的支出預測比以往任什麼時候候都更準確。
讓咱們來修改卡夫卡的特點

即 荷蘭合做銀行

Apache Kafka支持數字神經系統,Rabobank的商務活動巴士。它是荷蘭三大銀行之一。經過使用Kafka Streams,該服務能夠實時向客戶發出金融事件的警報。

9.結論

所以,咱們已經詳細瞭解了Apache Kafka Streams的概念。咱們討論了流處理和實時處理。此外,咱們看到了Stream Processing Topology及其特殊處理器。以後,咱們轉向Kafka Stream架構並實施Kafka Streams。最後,咱們研究了Kafka Streams的功能和用例

相關文章
相關標籤/搜索