Spark Streaming可以整合多种输入数据源,如Kafka、Flume、HDFS甚至是普通的TCP套接字。经处理后的数据可存储至文件系统、数据库、或显示在仪表盘。
Spark Streaming执行流程
Spark Streaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类拟批处理的方式处理每个时间片数据
DStream操作示意图
Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)。一个DStream,就是一堆的RDD,即RDD集合,所以多DStream的操作就是对RDD的操作
Spark输入源
DStream无状态转换操作
一个DStream,就是一堆的RDD,即RDD集合,所以多DStream的操作就是对RDD的操作
map(func):对DStream的每个元素,采用func函数进行转换,得到一个新的DStream
flatMap(func):与map相似,但是每个输入项可用被映射为0个或者多个输出项
repartition(numPartitions):通过创建更多或更少的分区改变DStream的并行程度
count():统计源DStream中每个RDD的元素数量
filter(func):返回一个新的DStream,仅包含源DStream中满足函数func的项
reduce(func):利用函数func聚集源DStream中每个RDD的元素,返回一个包含单元素RDDs的新DStream
union(otherStream):返回一个新的DStream,包含源DStream和其他DStream的元素
countByValue():应用于元素类型为K的DStream上,返回一个(K,V)键值对类型的新DStream,每个键的值是在原DStream的每个RDD中的出现次数
reduceByKey(func,[numTasks]):当一个由(K,V)键值对组成的DStream上执行该操作时,返回一个新的由(K,V)键值对组成的DStream,每一个key的值均由给定的reduce函数聚集起来
无状态转换
每次统计都是只统计当前批次到达的单词的词频,和之前批次无关,不会进行累计。如:“套接字流”的词频统计
有状态转换
1、滑动窗口转换操作
- 事先设定一个滑动窗口的长度(也就是窗口的持续时间)。如下图为time3-time5的3秒
- 设定滑动窗口的时间间隔(每隔多长时间执行一次计算),让窗口按照制定时间间隔在源DStream上滑动。如下图为2秒
- 每次窗口停放的位置上,都会有一部分DStream(或者一部分RDD)被框入窗口内,形成一个小段的DStream
- 可以启动对这个小段DStream的计算
常用操作方法:
window(windowLength,slideInterval):基于源DStream产生的窗口化的批数据,计算得到一个新的DStream
countByWindow(windowLength,slideInterval):返回流中元素的一个滑动窗口数
reduceByWindow(func,windowLength,slideInterval):返回一个单元素流。利用函数func聚集滑动时间间隔的流的元素创建这个单元素流。函数func必须满足结合律,从而可以支持并行计算
reduceByKeyAndWindow(func,windowLength,slideInterval,[numTasks]):应用到一个(k,v)键值对组成的DStream上时,会返回一个由(k,v)键值对组成的新的DStream。每一个key的值均由给定的reduce函数(func函数)进行聚合计算。PS:在默认情况下,这个算子利用了spark默认的并发任务数去分组。可以通过numTasks参数的设置来指定不同的任务数
reduceByKeyAndWindow(func,invFunc,windowLength,slideInterval,[numTasks]):更高效
val worldCounts = lines.reduceByKeyAndWindow(_+_,_-_,Minutes(2),Seconds(10),2)
如lines为("a",1)("b",1)("c",1)等键值对组成的DStream。t0时刻统计完窗口的数据,到了t1时刻,有部分数据离开窗口,由新数据进入窗口,_+_函数把新增的数据加入到统计结果中,用_-_函数从统计结果中减掉离开的数据
updateStateByKey:跨批次间的状态维护,对于有状态转换操作而言,本批次的词频统计,会在之前批次的词频统计结果的基础上进行不断累加,所以,最终统计得到的词频,是所有批次的单词的总的词频统计结果