Spark Streaming原理-★★★
- SparkCore的原理回顾
- SparkStreaming的基本原理-★★★
- SparkStreaming的数据抽象-DStream★★★★
- DStream的底层是啥?
- DStream的API分类
- Transformations
- ●常见Transformation---无状态转换:每个批次的处理不依赖于之前批次的数据
- ●特殊的Transformations---有状态转换:当前批次的处理需要使用之前批次的数据或者中间结果。
- Output/Action
SparkCore的原理回顾
SparkStreaming的基本原理-★★★
- SparkStreaming是Spark推出的实时处理技术,但是底层还是基于SparkCore的RDD的微批处理
- 也就是对于源源不断到来的实时数据, 会根据时间批次(如1s/2s…),进行微批划分,对于每一个微批的数据就会执行一次和SparkCore一样的计算流程,所以可以认为SparkStreaming就是一直源源不断的
每隔一个微批就要执行一次上面的流程
SparkStreaming的数据抽象-DStream★★★★
DStream的底层是啥?
- DStream(Discretized Stream,离散化数据流)
- 其实就是源源不断的到来的数据,然后被时间批次划开的一些时间上连续的RDD
- 那么接下来通过几幅图来理解DStream:
- 1.
DStream的本质是一系列时间上连续的RDD
- 2.
对DStream进行操作,如flatMap/map/filter...本质是就是对里面的RDD进行操作
- 3.RDD在执行的时候是具有容错性的,如某一分区丢失可以通过上一步的同一个分区恢复,那么DStream也是具有容错的,因为底层就是RDD
- 4.SparkStreaming的DStream只能做的近实时/准实时,不能做到完全的真正的实时
- 一般SparkStreaming的DStream只能做到秒级, 很难做到毫秒,因为底层是微批处理
- 但是需要注意:SparkStreaming的秒级延迟也能满足大部分实时性要求并不是那么严格的大数据项目
DStream的API分类
- DStream的API和分类和RDD类似
- 很多的API使用起来也都差不多
Transformations
●常见Transformation—无状态转换:每个批次的处理不依赖于之前批次的数据
Transformation | Meaning |
map(func) | 对DStream中的各个元素进行func函数操作,然后返回一个新的DStream |
flatMap(func) | 与map方法类似,只不过各个输入项可以被输出为零个或多个输出项 |
filter(func) | 过滤出所有函数func返回值为true的DStream元素并返回一个新的DStream |
union(otherStream) | 将源DStream和输入参数为otherDStream的元素合并,并返回一个新的DStream. |
reduceByKey(func, [numTasks]) | 利用func函数对源DStream中的key进行聚合操作,然后返回新的(K,V)对构成的DStream |
join(otherStream, [numTasks]) | 输入为(K,V)、(K,W)类型的DStream,返回一个新的(K,(V,W)类型的DStream |
transform(func) | 通过RDD-to-RDD函数作用于DStream中的各个RDD,可以是任意的操作,从而返回一个新的RDD |
●特殊的Transformations—有状态转换:当前批次的处理需要使用之前批次的数据或者中间结果。
- 有状态转换包括基于追踪状态变化的转换(updateStateByKey)和滑动窗口的转换
- 1.UpdateStateByKey(func)
- 2.Window Operations 窗口操作
- reduceByKeyAndWindow
Output/Action
- Output Operations可以将DStream的数据输出到外部的数据库或文件系统
- 当某个Output Operations被调用时,spark streaming程序才会开始真正的计算过程(与RDD的Action类似)
Output Operation | Meaning |
print() | 打印到控制台 |
saveAsTextFiles(prefix, [suffix]) | 保存流的内容为文本文件,文件名为"prefix-TIME_IN_MS[.suffix]". |
saveAsObjectFiles(prefix,[suffix]) | 保存流的内容为SequenceFile,文件名为 “prefix-TIME_IN_MS[.suffix]”. |
saveAsHadoopFiles(prefix,[suffix]) | 保存流的内容为hadoop文件,文件名为"prefix-TIME_IN_MS[.suffix]". |
foreachRDD(func) | 对Dstream里面的每个RDD执行func |