我有 Spark 结构化流作业,它从 S3 读取数据,转换数据,然后将其存储到一个 S3 接收器和一个 Elasticsearch 接收器。
目前,我正在做readStream
一次然后writeStream.format("").start()
两次。这样做时,Spark 似乎从 S3 源读取数据两次,每个接收器读取一次。
是否有更有效的方法来写入同一管道中的多个接收器?
目前,我正在执行一次 readStream,然后执行两次 writeStream.format("").start()。
您实际上创建了两个单独的流查询。这load
- 部分是描述第一个(也是唯一的)流媒体源。这对执行没有任何作用。
这样做时,Spark 似乎每个接收器从 S3 源读取数据两次。
这是描述 Spark 结构化流查询如何工作的最正确方式。接收器的数量对应于查询的数量,因为一个流式查询可以恰好有一个流式接收器(请参阅流执行 https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/streaming/StreamExecution.scala#L65位于任何流查询后面)。
您还可以检查线程数(使用jconsole
或类似),因为结构化流使用一个microBatchThread
每个流查询的线程(参见流执行 https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/streaming/StreamExecution.scala#L218).
是否有更有效的方法来写入同一管道中的多个接收器?
It is not在 Spark 结构化流的当前设计中是可能的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)