https://spark.apache.org/docs/2.2.0/streaming-programming-guide.html
其实spark doc写的挺好,我这就把他概括一下,写一些让我迷惑的问题点:
RDD:RDD就算是spark里最基本的处理单位,算是spark定义的一种数据结构(是分布式的)-------她是Immutable的,一旦生成了,就不能改
其实想想也能明白为啥RDD不能修改:处理器之间共享方便:也安全一些,不至于各个core的一个RDD不同步,等等等等
经典的图来了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL2Z1RiNTV61EeNRVT0UkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3UjN3QDM0IDM5ETOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
input data 就是输入了, 不停的发啊发啊发啊,,,,,,
第一步: 切成batch
然后Streaming engine就会用一个batch来收集数据,凑够一个batch了就发走了(batch的大小是时间大小), 问题又来了
那batch里是啥?
block
batch里也不会直接是数据,batch会有block(熟悉把,就是那个64m的block),block内会接受数据流,当一个block存满了,就去存下一个block,直到batch时间到了。
block的大小(怕我忘了: conf:spark.streaming.blockInterval )
RDD
然后这个batch(里面有一些block)就会发送到Spark Engine 生成RDD, 而里面的block就变成的RDD的partition。
所以:
一个batch里只有一个RDD
Dstream就简单了,就把他 想象成一堆连续的RDD就行, 没啥特别的
RDD = ( 一堆partitions 组成)
Batch = (一堆block组成)
(一堆block) ------->经过spark engine------->(一堆partitions,生成RDD)
所以要是说Batch和RDD是一个东西好像也不太对,可能就是进化关系把。。。
所以Spark Streaming里最基本的划分是从batch来划分流生成RDD,所以如果你打算生成window, window必须要是batch interval的整数倍(数据是这么切的啊。。。)