簡體   English   中英

apache flink中兩個以上流的並集

[英]Union of more than two streams in apache flink

我有一個關於 Apache Flink 中兩個以上流的聯合的架構問題。

我們有三個甚至更多的流,它們是某種代碼書,我們必須用它們來豐富主要的 stream。 Code book 流是壓縮的 Kafka 主題。 密碼本是不經常改變的東西,例如貨幣。 主要 stream 是一個快速事件 stream。 我們的目標是用代碼書豐富主要的 stream。

我認為有三種可能的方式來做到這一點:

  1. 將所有代碼簿合並,然后將其與主 stream 連接,並將擴充數據存儲為托管的密鑰 state(因此,當來自 kafka 的緊湊事件到期時,我將代碼簿保存在狀態中)。 這是我現在唯一厭倦的方式。 將 JSON 中的 Kafka 主題消息反序列化到 POJO,例如。 貨幣、組織單位等。 我用所有代碼書制作了一個大包裝 class CodebookData,例如:
public class CodebookData {
 private Currency currency;
 private OrganizationUnit organizationUnit
...
}

接下來,我將每個 kafka 主題的傳入 stream 映射到這個包裝器 class ,然后進行聯合:

DataStream<CodebookData> enrichedStream = mappedCurrency.union(mappedOrgUnit).union(mappedCustomer);

當我打印 CodebookData 它是這樣填充的

CodebookData{
Currency{populated with data},
OrganizationUnit=null,
Customer=null
}
CodebookData{
Curenncy=null,
OrganizationUnit={populated with data},
Customer=null
}
...

在這里我停下來,因為我有問題如何將此 Codebook stream 與主要 stream 連接並將代碼簿數據保存在值 state 中。 我的密碼本數據中沒有唯一的外鍵,因為每個密碼本都有自己的外鍵,與主 stream 連接,例如。 貨幣有currencyId、organizationUnit orgID等。 eg.我想做這樣的事情

SingleOutputStreamOperator<CanonicalMessage> enrichedMainStream = mainStream
            .connect(enrichedStream)
            .keyBy(?????)
            .process(new MyKeyedCoProcessFunction());

在 MyCoProcessFunction 中,我將創建 CodebookData 類型的 ValueState。

這是完全錯誤的還是我可以用這個做點什么,如果它是雙重的,我做錯了什么?

  1. 第二種方法是通過將一系列雙輸入 CoProcessFunction 運算符與每個 kafka 事件源級聯,但我在某處讀到這不是最佳方法。

  2. 第三種方法是廣播 state 我不太熟悉。 現在我看到問題,如果我使用 RocksDb 進行檢查點和保存點我不確定我是否可以使用廣播 state。

我應該使用我目前正在苦苦掙扎的方法一中的其他方法嗎?

在許多情況下,您需要像這樣進行多個獨立的擴充連接,遵循的更好模式是使用扇入/扇出方法,並並行執行所有連接。

像這樣,在確保主 stream 上的每個事件具有唯一 ID 之后,您創建每個事件的 3 個或更多副本:

在此處輸入圖像描述

然后,您可以通過任何適當的方式鍵入每個副本——貨幣、組織單位等(或客戶、IP 地址,以及我從中獲取此圖的示例中的商家)——然后將其連接到適當的說明書 stream ,並獨立計算每個 2 路連接。

然后將這些並行連接結果流合並在一起,keyBy 您添加到每個原始事件的隨機隨機數,並將結果粘合在一起。

現在在三個流的情況下,這可能過於復雜。 在那種情況下,我可能只做一系列三個 2 路連接,一個接一個,每次都使用 keyBy 和 connect。 但是在某些時候,隨着它們變得更長,以這種方式構建的管道往往會遇到性能/檢查點問題。

https://gist.github.com/alpinegizmo/5d5f24397a6db7d8fabc1b12a15eeca6中有一個實現這種扇入/扇出模式的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM