[英]Union of more than two streams in apache flink
我有一個關於 Apache Flink 中兩個以上流的聯合的架構問題。
我們有三個甚至更多的流,它們是某種代碼書,我們必須用它們來豐富主要的 stream。 Code book 流是壓縮的 Kafka 主題。 密碼本是不經常改變的東西,例如貨幣。 主要 stream 是一個快速事件 stream。 我們的目標是用代碼書豐富主要的 stream。
我認為有三種可能的方式來做到這一點:
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。
這是完全錯誤的還是我可以用這個做點什么,如果它是雙重的,我做錯了什么?
第二種方法是通過將一系列雙輸入 CoProcessFunction 運算符與每個 kafka 事件源級聯,但我在某處讀到這不是最佳方法。
第三種方法是廣播 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.