Spark Streaming是什么
Spark Streaming用于流式数据处理
DStream是什么
Spark Streaming使用离散化流作为抽象表示,称作DStream,是随着时间的推移而得到的数据的序列。在DStream内部,每个时间区间收到的数据都作为RDD存在,DStream就是由这些RDD所组成的序列,DStream就是对RDD在实时处理场景中的一种封装。
架构图
DStream的创建
1.通过RDD队列
2.自定义数据源接收器
3.从kafka数据源接收
DStream转换
1.无状态转化操作
就是把RDD转化操作应用到DStream每个批次上,每个批次相互独立,自己算自己的。
常规无状态转化操作
DStream的部分无状态转化操作列在了下表中,都是DStream自己的API。
函数名称 | 目的 | Scala示例 | 函数签名 |
map() | 对DStream中的每个元素应用给定函数,返回由各元素输出的元素组成的DStream。 | ds.map(x=>x + 1) | f: (T) -> U |
flatMap() | 对DStream中的每个元素应用给定函数,返回由各元素输出的迭代器组成的DStream。 | ds.flatMap(x => x.split(" ")) | f: T -> Iterable[U] |
filter() | 返回由给定DStream中通过筛选的元素组成的DStream | ds.filter(x => x != 1) | f: T -> Boolean |
repartition() | 改变DStream的分区数 | ds.repartition(10) | N / A |
reduceByKey() | 将每个批次中键相同的记录规约。 | ds.reduceByKey( (x, y) => x + y) | f: T, T -> T |
groupByKey() | 将每个批次中的记录根据键分组。 | ds.groupByKey() | N / A |
Transform
通过Transform可以将DStream每一批次的数据直接转换为RDD的算子操作。
2.有状态转化操作
1.updateStateByKey()
用于键值对形式的DStream,可以记录历史批次状态。在参数中需要传递一个函数,在函数内部可以根据需求对新数据和历史状态进行整合处理,返回一个新的DStream。
注意:使用updateStateByKey需要对检查点目录进行配置,会使用检查点来保存状态。会造成小文件过多,而且再次启动的时候会把间隔时间的周期再执行一次。
2.WindowOperations
Window Operations可以设置窗口的大小和滑动窗口的间隔来动态的获取当前Streaming的允许状态。所有基于窗口的操作都需要两个参数,分别为窗口时长以及滑动步长。
窗口时长:计算内容的时间范围;
滑动步长:隔多久触发一次计算。
3.Window
window(windowLength, slideInterval): 基于对源DStream窗口的批次进行计算返回一个新的DStream。
DStream输出
DStream通常将数据输出到,外部数据库或屏幕上。
DStream与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个Context就都不会启动。
saveAsTextFiles(prefix, [suffix]):以text文件形式存储这个DStream的内容。每一批次的存储文件名基于参数中的prefix和suffix。“prefix-Time_IN_MS[.suffix]”。
saveAsObjectFiles(prefix, [suffix]):以Java对象序列化的方式将DStream中的数据保存为 SequenceFiles 。每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。
saveAsHadoopFiles(prefix, [suffix]):将Stream中的数据保存为 Hadoop files。每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。
print():在运行流程序的驱动结点上打印DStream中每一批次数据的最开始10个元素。这用于开发和调试。
foreachRDD(func):这是最通用的输出操作,即将函数func用于产生DStream的每一个RDD。其中参数传入的函数func应该实现将每一个RDD中数据推送到外部系统,如将RDD存入文件或者写入数据库。