簡體   English   中英

在 Flink 中是否可以將 state 與非鍵控 stream 一起使用?

[英]In Flink is it possible to use state with a non keyed stream?

讓我們假設我有一個輸入 DataStream 並想實現一些需要“內存”的功能,所以我需要 ProcessFunction 讓我可以訪問 state。是否可以直接對 DataStream 進行操作,或者唯一的方法是通過初始 stream 進行鍵控並在鍵控上下文中工作?

我認為一種解決方案是使用硬編碼的唯一密鑰對 stream 進行 keyBy,這樣整個輸入 stream 最終都在同一組中。 然后從技術上講,我有一個 KeyedStream,我通常可以使用鍵控 state,就像我在下面用 keyBy(x->1) 顯示的那樣。 但這是一個好的解決方案嗎?

DataStream<Integer> inputStream = env.fromSource(...)

DataStream<Integer> outputStream = inputStream
                 .keyBy(x -> 1)
                 .process(...) //I've got acess to state heree

據我了解,這不是一個常見的用例,因為 flink 的主要目的是對 stream 進行分區,分別處理它們,然后合並結果。 在我的場景中,這正是我正在做的,但問題是合並步驟需要 state 才能產生最終的“全局”結果。 我真正想做的是這樣的:

DataStream<Integer> inputStream = env.fromElements(1,2,3,4,5,6,7,8,9)

//two groups: group1=[1,2,3,4] & group2=[5,6,7,8,9]
DataStream<Integer> partialResult = inputStream
                            .keyBy(val -> val/5) 
                            .process(<..stateful processing..>)

//Can't do statefull processing here because partialResult is not a KeyedStream
DataStream<Integer> outputStream = partialResult
                          .process(<..statefull processing..>)

outputStream.print();

但是 Flink 似乎不允許我執行最終的“合並部分結果操作”,因為我無法在進程 function 中訪問 state,因為 partialResult 不是 KeyedStream。

我是 flink 的初學者,所以我希望我寫的內容有意義。 總的來說,我可以說我還沒有找到執行“合並”步驟的好方法,尤其是在涉及復雜邏輯時。 如果我遺漏了什么,希望有人能給我一些信息、提示或糾正我

感謝您的時間

  1. “keyBy the stream with a hardcoded unique key”是個好主意嗎? 好吧,通常不會,因為它強制所有數據流經單個子任務,因此您無法從 Flink 集群中的完全並行性中獲益。
  2. 使用.keyBy(val -> val/5) ,你不會得到two groups: group1=[1,2,3,4] & group2=[5,6,7,8,9,10] ,你'會得到group0=[1,2,3,4] , group1=[5,6,7,8,9] , group2=[10]因為 10/5 = 2。
  3. 第二次process()調用所需的 state 是什么? 如果它的鍵控與第一個process()相同,則只需將這兩個過程函數合並為一個。 或者您可以使用 Flink 的DataStreamUtils.reinterpretAsKeyedStream()調用,請參閱文檔 否則,如果它的鍵控不同,那么顯然你需要另一個.keyBy() 如果它真的沒有密鑰,那么你需要什么 state?

暫無
暫無

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

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