Apache spark 如何理解ApacheSpark中的QueueStreamAPI?

Apache spark 如何理解ApacheSpark中的QueueStreamAPI?,apache-spark,Apache Spark,pyspark有一个api队列流,用于从一系列rdd构造数据流 queueStream(rdds, oneAtATime=True, default=None) Create an input stream from an queue of RDDs or list. In each batch, it will process either one or all of the RDDs returned by the queue. NOTE: changes to the queue aft

pyspark有一个api队列流,用于从一系列rdd构造数据流

queueStream(rdds, oneAtATime=True, default=None)
Create an input stream from an queue of RDDs or list. In each batch, it will process either one or all of the RDDs returned by the queue.

NOTE: changes to the queue after the stream is created will not be recognized.

Parameters: 
rdds – Queue of RDDs
oneAtATime – pick one rdd each time or pick all of them once.
default – The default rdd if no more in rdds
问题1:

在分布式环境中,如果我定义队列对象q1。我执行类似q1.add(RDD)的操作。q1对象是否会传输到所有工作节点?如果将此对象复制到其他节点,操作q1.add(RDD)是否会出现问题

问题2:

在我运行dstream=queueStream(q1)之后。
如果我继续将RDD放入队列中。这些RDD是否会添加到数据流中?

我相信以下注意事项:

创建流后对队列所做的更改将无法识别

基本上回答了这个问题,但要理解为什么会出现这种情况,您必须特别关注PySpark代码:

如果这还不够,您可以查看一个静态列表:

def toRDDQueue(rdds: JArrayList[JavaRDD[Array[Byte]]])
并将其转换为队列:

val queue = new java.util.LinkedList[JavaRDD[Array[Byte]]]
rdds.asScala.foreach(queue.add)
因此,Python端的任何更改都无法反映在流中

关于第一个问题,答案是否定的。队列不会被分发,因为RDD在
驱动程序
上下文之外根本没有意义

注意


需要说明的是,Scala
queueStream
将反映对队列的添加

所以,真的没有办法从连续的RDD流中获取数据流吗?使用pythonAll的“标准”方法(文件流、Kafka流)可以很好地工作。通过一些努力,您实际上也可以围绕队列构建一个包装器,但是同步是。。。即使不通过网关。@zero323上述问题仍然成立,即仍然无法从python中的RDD的连续流中获取数据流
val queue = new java.util.LinkedList[JavaRDD[Array[Byte]]]
rdds.asScala.foreach(queue.add)