如何在Spark的结构化流中创建RDD?在DStream中,对于每个批次,是否都有数据可用或触发发生时立即创建?它如何在执行者之间物理分配RDD?
答案 0 :(得分:-1)
内部,DStream表示为一系列RDD, 这是Spark对不变的分布式数据集的抽象。 DStream中的每个RDD都包含特定间隔的数据
在字数示例中:-
import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3
// Count each word in each batch
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()
因此,在驱动程序上为在batchInterval期间创建的块创建了RDD。在batchInterval期间生成的块是RDD的分区。每个分区都是一个任务。 blockInterval == batchinterval意味着将创建一个分区,并且可能在本地对其进行处理。
DStream由输出操作延迟执行,就像RDD由RDD操作延迟执行一样。
DStream将在触发发生后立即执行,如果您的时间间隔为2秒,则作业将每2秒触发一次,基本上,如果数据存在于以下位置,则触发点不是数据可用性,而是批次持续时间DStream包含数据的时间,否则它将为空。
DStream实际上是DStream代码中的RDD序列:-
// RDDs generated, marked as private[streaming] so that testsuites can access it
@transient
private[streaming] var generatedRDDs = new HashMap[Time, RDD[T]]()
生成的执行程序的数量取决于分区以及所提供的配置。
在配置中,通常有两种类型的分配:静态分配和动态分配。 您可以在这里阅读有关它们的信息:-
http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/