Spark Streaming 数据清理机制

一、DStream 和 RDD

我们知道Spark Streaming 计算还是基于Spark Core的,Spark Core 的核心又是RDD。所以Spark Streaming 肯定也要和RDD扯上关系。然而Spark Streaming 并没有直接让用户使用RDD而是自己抽象了一套DStream的概念。 DStream 和 RDD 是包含的关系,你可以理解为Java里的装饰模式,也就是DStream 是对RDD的增强,但是行为表现和RDD是基本上差不多的。

都具备几个条件:

(1)具有类似的tranformation动作,比如map,reduceByKey等,也有一些自己独有的,比如Window,mapWithStated等
(2)都具有Action动作,比如foreachRDD,count等

从编程模型上看是一致的。

所以很可能你写的那堆Spark Streaming代码看起来好像和Spark 一致的,然而并不能直接复用,因为一个是DStream的变换,一个是RDD的变化

二、Spark Streaming中 DStream 介绍

DStream 下面包含几个类:

(1)数据源类,比如InputDStream,具体如DirectKafkaInputStream等
(2)转换类,典型比如MappedDStream,ShuffledDStream
(3)输出类,典型比如ForEachDStream

从上面来看,数据从开始(输入)到结束(输出)都是DStream体系来完成的,也就意味着用户正常情况是无法直接去产生和操作RDD的,这也就是说,DStream有机会和义务去负责RDD的生命周期
这就回答了前言中的问题了。Spark Streaming具备自动清理功能

三、RDD 在Spark Stream中产生的流程

在Spark Streaming中RDD的生命流程大体如下:

(1)在InputDStream会将接受到的数据转化成RDD,比如DirectKafkaInputStream 产生的就是 KafkaRDD
(2)接着通过MappedDStream等进行数据转换,这个时候是直接调用RDD对应的map方法进行转换的
(3)在进行输出类操作时,才暴露出RDD,可以让用户执行相应的存储,其他计算等操作。

我们这里就以下面的代码来进行更详细的解释:

val source  =   KafkaUtils.createDirectInputStream(....)
source.map(....).foreachRDD{
   rdd=>
    rdd.saveTextFile(....)
}

foreachRDD 产生ForEachDStream,因为foreachRDD是个Action,所以会触发任务的执行,会被调用generateJob方法。

override def generateJob(time: Time): Option[Job] = {
   
    parent.getOrCompute(time) match {
   
      case Some(rdd) =>
        val jobFunc = () => createRDDWithLocalProperties(time, displayInnerRDDOps) {
   
          foreachFunc(rdd, time)
        }
        Some(new Job(time
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值