2

我是新來流處理(kafka流/ flink /風暴/火花/等),並試圖找出處理現實世界問題的最佳方法,代表這裏以玩具爲例。我們與Kafka綁定用於我們的pubsub/data攝入,但對流處理器框架/方法沒有特別的依賴。流處理架構:未來事件影響過去的結果

理論上,假設我有一個零星發射浮點值的源。在任何給定的點上都有一個乘數M應該應用於這個源的值;但是M可以改變,而且批判地說,我可能只在晚些時候纔會發現這種變化 - 甚至可能不是「按照變化順序」。

我想到卡夫卡表示此爲

"Values": (timestamp, floating point value) - the values from the source, tagged with their emission time. 

"Multipliers": (timestamp, floating point multiplier) - indicates M changed to this floating point multiplier at this timestamp. 

然後,我會很想創建一個輸出話題,說:「結果」,使用標準的流處理架構,連接兩個流,並只需將值中的每個值乘以由乘子確定的當前乘數。

但是,根據我的理解,這不會起作用,因爲發佈到乘法器的新事件可能會對已寫入結果流的結果產生任意大的影響。從概念上講,我希望能得到類似於結果流的結果流,該結果流是發佈到乘法器的最後一個事件針對值中的所有值發佈的,但可以作爲其他值或乘法器事件進行「重新計算」。

用kafka和主流處理器來實現/構建這些技術有哪些?

例子:

最初,

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 
Multipliers = [(1, 1.0)] 
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 

後來,

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 
Multipliers = [(1, 1.0), (4, 2.0)] 
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 4.4)] 

最後,在另一個事件發佈到乘法器(也是一個新值發出過):

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2), (7, 5.0)] 
Multipliers = [(1, 1.0), (4, 2.0), (2, 3.0)] 
Results = [(1, 2.4), (2, 10.8), (3, 3.0), (5, 4.4), (7, 10.0)] 
+0

恕我直言,這是相當廣泛的給你一個具體的答案。實際的解決方案將取決於要求:「我們需要怎樣處理數據」。在提供的示例中,我將存儲這兩個流並在讀取時執行操作:即。當需要結果時。但是根據實際情況中的應用需求,這可能還不夠。 – maasg

+0

在此程序中,乘數乘以按鍵的值。 所以你的結果會受到影響。 –

+0

好點maasg。在我們的例子中,有太多的數據流入來支持推遲計算。另外,我們需要做一些查詢,比如「給我所有的結果值和它們的時間戳,其值在X和Y之間,就你所知,根據目前關於乘數的信息」;如果沒有計算它們,就不能對該查詢的結果編制索引。 – jdowdell

回答

1

我是隻有熟悉Spark並且爲了使其按照您所描述的方式工作,您需要在收到新的乘數值時選擇性地「更新」以前的結果,同時將最高的索引乘數應用於尚未應用乘數的新值他們。 AFAIK,Spark本身不會讓你使用流式處理(你需要緩存和更新舊的結果,而且你還需要知道哪些是用於新值的乘數),但是你可以編寫邏輯以便寫入您的「結果」主題添加到常規數據庫表中,並且當您收到新的乘數時,值數據框中的所有後續事件將僅使用該值,但您會執行一次檢查以查找結果表中是否有值現在需要更新以使用新的乘數並簡單地更新數據庫表中的這些值。

您的結果消費者必須能夠處理插入和更新。您可以使用Spark與任何數據庫has a connector來實現此目的。

或者,您可以使用SnappyData,將Apache Spark變成一個可變的計算+數據平臺。使用Snappy,您可以將值和乘數作爲常規流式數據框,並且您可以將結果作爲數據框設置作爲SnappyData中的複製表。當您在乘數流中處理新條目時,您將更新結果表中存儲的所有結果。這可能是最簡單的方法來完成你正在嘗試做的事