Spark Structured Streaming多流multiple streams)多查询(multiple queryies)问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bluishglc/article/details/80618800

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功能就绪前,有更佳解决方案的同学留言。

没有更多推荐了,返回首页