Spark Structured Streaming多流multiple streams)多查詢(multiple queryies)問題

Structured Streaming作爲Spark新一代的流計算編程模型,針對流計算提供了很多新的的高級的API進行支持,這使得它比DStream要好用的多,同時編碼量也大幅度地減少,但是在當前版本V2.3下, Structured Streaming無法支持 多流(multiple streams) 多查詢 (multiple queryies)是非常頭痛的一個問題。

在流計算中,一個非常普遍的場景是:我們從Kafka中拿到raw data進行了初步的ETL之後,會以這個Dataset爲一個base(或者叫trunk)的stream, 然後分成兩個分支去處理,一條分支是將處理好的數據直接持久化到NoSQL數據庫,另一個分支是要進行某些流計算相關的分析,例如某種基於時間窗口的聚合運算,並把分析結果也寫入到的NoSQL數據庫。這是一類非常典型的具有分支特性的流,在基於DStream的編程模型上,我們可以依靠DStream的cache方法這實現這個需求,把base stream緩存之後,相當於保存了一個進行分支前的流的副本,後續的分支可以以個副本爲基準進行後續的操作,而不是會受到另一個分支的影響。但是讓人遺憾的是,當前的Structured Streaming不支持cache操作,具體參考:https://issues.apache.org/jira/browse/SPARK-20927

目前已知的一個替代方法是使用Dataset的createTempView方法來創建一個臨時視圖,然後分支操作,即分支Query都基於這個臨時視圖展開。要實現這個目標,還做一個重要的動作:不能使用Query的awaitTermination,因爲之會阻塞第二個分支Query的執行,而應該在所有的Query執行完start之後,使用sparkSession.streams.awaitAnyTermination(),只有這樣才能確保兩個分支Query都能啓動。

期待在cache功能就緒前,有更佳解決方案的同學留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章