DStream 中有几个RDD ?

结论 :

  DStream 中有一个RDD.   (不管是任何Dstream,包括窗口Dstream)

  为什么还有foreachRDD() 这个算子, 他不是去遍历RDD ,而是遍历一个时间维度上的RDD

 

SparkStreaming中定义了DStream这个概念。每个DStream由一系列的的RDD组成。官方文档如下: 
Internally, a DStream is represented by a continuous series of RDDs, which is Spark’s abstraction of an immutable, distributed dataset. Each RDD in a DStream contains data from a certain interval, as shown in the following figure. 
这里写图片描述

但是文档上并没有提及每个RDD对应的时间周期是多少。我问了许多人,都认为这个时间周期对应了一个DStream的duration。比如,有如下的代码创建了一个JavaDStream,那么其RDD对应的时间周期应该是10秒:

SparkConf conf = new SparkConf().setAppName("StreamingWindow");
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(10));

JavaReceiverInputDStream<String> lines = jssc.socketTextStream(args[0],
        Integer.parseInt(args[1]), StorageLevel.MEMORY_AND_DISK_SER());
JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public Iterable<String> call(String s) throws Exception {
        return Lists.newArrayList(SPACE.split(s));
    }
});

当然只可能是10秒,否则也找不到其他设置RDD周期的地方。可是这种解释终究难以让人信服,只好深入SparkStreaming的源码来看一下了。顺着JavaDStream的继承关系一路找上去,其最终的基类是DStream。在最开始的类描述和类定义就有最关键的信息: 
这里写图片描述

原来RDD所对应的时间周期是一个名为slideDuration的函数所返回的。这个函数在基类中没有定义,那么我继续往子类里找。很快,我就在InputStream里找到了这个函数的定义,如下: 
这里写图片描述

这下就真相大白了,来自于ssc.graph.batchDuration。再继续查看StreammingContext,果然,graph函数里的batchDuration来自于构造函数里的Duration,这与先前的猜测一致。也就是说,SparkStreaming的每个Duration对应了一个RDD。完整的关系图如下: 
这里写图片描述

所以,DStream的每个RDD的时间跨度都是StreamingContext的_batchDur?如果你真这么想,那就大错特错了!从Spark的代码风格就可以看出来,开发者们是很严谨的人。再仔细看看DStream里的那个函数名,叫slideDuration – 滑动周期,而StreamingContext里的变量名叫_batchDur – 批处理周期。如果二者代表的意义一样,为什么要弄两个名字呢?

滑动周期?是不是很熟悉?You got it!于是我又看了下WindowedDStream,于是真的真相大白了: 
这里写图片描述 
这里写图片描述

然后再看看DStream的window函数: 
这里写图片描述

DStream有两个window函数,用来创建窗口。每个窗口有两个变量:窗口大小和滑动周期。在第一个函数中,窗口大小通过参数指定,滑动周期来自于调用函数的DStream(如果这个DStream是由StreamingContext直接创建的,那么滑动周期刚好等于批处理周期)。在第二个函数中,窗口大小和滑动周期都是通过函数指定。

然而,在WindowedDStream中,它的slideDuration函数返回的是这个窗口的滑动周期。也就是说,每个滑动窗口才对应着一个RDD,而不是一个批处理周期对应一个RDD。

逻辑可以很复杂,也可以很简单,最终二者是可以统一的: 
1. 所有的DStream都可以看作是WindowedDStream 
2. 每个窗口都有窗口大小和滑动周期 
3. StreamingContext直接创建的窗口,可以叫做基本窗口,它的窗口大小和滑动周期与批处理周期相同

Done!

 

装载

https://blog.csdn.net/jiangwlee/article/details/51492507?locationNum=6&fps=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值