Spark Streaming揭秘 Day8 RDD生命周期研究

Spark Streaming揭秘 Day8

RDD生命周期研究

今天让我们进一步深入SparkStreaming中RDD的运行机制。从完整的生命周期角度来说,有三个问题是需要解决的:

  • RDD到底是怎么生成的
  • 具体执行的时候和Spark Core上的执行有所不同
  • 运行之后对RDD如何处理,怎么对已有的RDD进行管理

今天主要聚焦于第一个问题。

从DStream开始

DStream类的注释很明确的说明了,DStream中包含以下内容:

  • DStream依赖的其他DStream(第一个DStream是外部数据源产生)
  • DStream产生RDD的时间间隔
  • 产生RDD所使用到的方法*

可以看到,这里很明确说明了RDD的生成是在DStream中触发的。

关键方法

通过上一课的分析,我们可以知道JobScheduler是通过generateJob这个方法来与DStream交互的。

Snip20160515_23

其中的关键是getOrCompute方法,再进一步分析此方法

Snip20160515_24

其中调用了compute方法,而注释中也说明了,每个DStream都会通过compute方法生成RDD!!!

compute会由各个子类来进行实现,我们找一个常用的MappedDStream看一下。
Snip20160515_21

通过这个代码,我们可以发现两点:

  • compute方法中实现了map这个方法的业务逻辑
  • compute方法会调用parent的getOrCompute

这说明了,RDD从后往前依赖,可以进行回溯,这也解释了为什么在JobScheduler中仅仅是对outputStream进行处理的原因。

RDD生成的完整过程

下面引用一张图将上面的说明进行一下串联:
DStrea

在各个DStream中,都实现了getOrCompute方法,在数据未缓存的情况下,会调用compute方法向上追溯到DStream的源头,并将结果逐层向下传递,从而实现了完整的业务处理。

小结

我们会发现,对DStream的所有操作,其实都是作用在RDD上的Transformation操作,只是要加上一个时间维度。统一通过outputStreams的generateJob方法来触发实际的action调用,而处理逻辑和依赖关系,都封装在了DStream内部实现,充分体现了模块的自治性,非常值得借鉴。

欲知后事如何,且听下回分解

DT大数据每天晚上20:00YY频道现场授课频道68917580

转载于:https://www.cnblogs.com/dt-zhw/p/5495141.html

Spark Streaming RDD 编程主要涉及到以下几个方面: 1. 创建 StreamingContext 对象:首先需要创建一个 StreamingContext 对象,设置应用程序名称、批处理间隔等参数。 ```scala val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) ``` 2. 创建输入 DStream:使用 StreamingContext 对象创建一个输入 DStream。这个 DStream 可以从多个数据源创建,如 Kafka、Flume、Kinesis、HDFS 等。 ```scala val lines = ssc.socketTextStream("localhost", 9999) ``` 3. 转换操作:通过对输入 DStream 进行一系列转换操作,得到需要的结果。转换操作包括 map、filter、reduceByKey、window 等。 ```scala val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) ``` 4. 输出操作:对转换后的 DStream 进行输出操作,输出结果可以写入 HDFS、Kafka、Cassandra 等存储系统,或者直接打印在控制台。 ```scala wordCounts.print() ``` 5. 启动 StreamingContext:最后需要启动 StreamingContext,并等待程序运行结束。 ```scala ssc.start() ssc.awaitTermination() ``` 完整的 Spark Streaming RDD 编程示例代码如下: ```scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} object SparkStreamingRDD { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999) val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) wordCounts.print() ssc.start() ssc.awaitTermination() } } ``` 这个例子从本地 9999 端口读取输入数据,将输入数据拆分成单词,并计算每个单词出现的次数。最后将结果打印在控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值