【问题标题】:Execution order of code in Spark StreamingSpark Streaming中代码的执行顺序
【发布时间】:2017-01-26 08:45:57
【问题描述】:
在 Spark 流中
val lines = ssc.socketTextStream("localhost",1234)
行将创建一个 DStream(Rdd 的集合),但我很困惑,因为总是有逐行顺序执行的代码,那么上面的代码行将如何继续生成 DStream。
在此之后,当应用转换时“val words = lines.print()”
此行如何打印给定 Rdd 中存在的所有数据,因为 val lines = ssc.socketTextStream("localhost",1234) 已经处于运行模式。
在这个过程中是否执行了无限循环?
请告诉我 Spark Streaming 流程的流程
谢谢
【问题讨论】:
标签:
apache-spark
spark-streaming
【解决方案1】:
Spark 的转换是惰性的。这意味着在调用某个操作之前不会调用任何内容。
这对你意味着什么?
val lines = ssc.socketTextStream("localhost",1234) 创建一个 DStream。现在什么都没有读取,只是 DStream 是根据将来读取的源数据的配置创建的。
在val words = lines.print() 上,您声明将打印第一个点创建的每个 RDD。 words 变量现在由 2 个声明组成:数据源(第 1 点)和将被调用的第一个操作(print())。
从ssc.start() 开始执行。然后 Spark 创建所有必要的背景类,等等 - 你现在不需要知道 :) 重要的是 Spark Context 知道使用此上下文创建的每个 RDD。这个 StreamingContext 有关于单词 DStream 的信息,在ssc.start() 之后,Spark 将从源中读取数据,然后将它们传递给print() 函数。
换句话说 - 您没有调用您正在输入的操作/转换。您只是声明您希望它们被调用。它与 SQL 引擎中的执行计划非常相似。在调用start() 以及在 Spark 创建 DStream 中的每个 RDD 之后,Spark Context 将执行您想要的操作和转换。 DStreams 是由 Spark 在某个循环中创建的,但这对您来说是透明的