[英]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 的初學者,所以我希望我寫的內容有意義。 總的來說,我可以說我還沒有找到執行“合並”步驟的好方法,尤其是在涉及復雜邏輯時。 如果我遺漏了什么,希望有人能給我一些信息、提示或糾正我
感謝您的時間
.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。process()
調用所需的 state 是什么? 如果它的鍵控與第一個process()
相同,則只需將這兩個過程函數合並為一個。 或者您可以使用 Flink 的DataStreamUtils.reinterpretAsKeyedStream()
調用,請參閱文檔。 否則,如果它的鍵控不同,那么顯然你需要另一個.keyBy()
。 如果它真的沒有密鑰,那么你需要什么 state?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.