学习目标
- 掌握Spark Streaming的原理和架构
- 掌握DStream的相关操作
- 实现Spark Streaming与flume整合
- 实现Spark Streaming与kafka整合
什么是Spark Streaming?
- Spark Streaming类似于Apache Storm,用于流式数据的处理。
- Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象操作如:map、reduce、join、window等进行运算。而结果也能保存在很多地方,如HDFS,数据库等。
- Spark Streaming也能和MLlib(机器学习)以及Graphx完美融合。
Spark Streaming原理
- Spark Streaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。
Spark Streaming计算流程
- Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据(Discretized Stream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行缓存或者存储到外部设备。
Spark Streaming容错性
- 对于流式计算来说,容错性至关重要。
- Spark中RDD的容错机制:每一个RDD都是一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系(lineage),所以只要输入数据是可容错的,那么任意一个RDD的分区(Partition)出错或不可用,都是可以利用原始输入数据通过转换操作而重新算出的。
- 每一个RDD都是通过lineage相连接的,由于Spark Streaming输入数据可以来自于磁盘,例如HDFS(多份拷贝)或是来自于网络的数据流(Spark Streaming会将网络输入数据的每一个数据流拷贝两份到其他的机器)都能保证容错性,所以RDD中任意的Partition出错,都可以并行地在其他机器上将缺失的Partition计算出来。
Spark Streaming实时性
- 目前版本的Spark Streaming而言,其最小的Batch Size的选取在0.5~2秒钟之间(Storm目前最小的延迟是100ms左右),所以Spark Streaming能够满足除对实时性要求非常高(如高频实时交易)之外的所有流式准实时计算场景。
什么是DStream?
- Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。
- DStream上的操作与RDD的类似,分为Transformations(转换)和Output Operations(输出)两种。
滑动窗口转换操作
- a.窗口长度,一段时间内数据的容器。
- b.滑动间隔,每隔多久计算一次。
窗口的长度 > 滑动窗口间隔
- 结论: 数据会被重复处理
窗口的长度 < 滑动窗口间隔
- 结论: 数据会丢失
最终结论:当我们正常使用窗口函数的时候
- 保证窗口好长度和滑动窗口的时间间隔相同
- 窗口长度和滑动窗口的时间间隔设置为批次时间的整数倍
netcat工具
用来设置路由器,通过netcat工具向指定的端口发送数据
yun install -y nc nc -lk 9999
SparkStreaming接受socket数据,实现单词计数累加
- 累加需要使用updateStateByKey(func)来更新状态。
- //newValues 表示当前批次汇总成的(word,1)中相同单词的所有的1
//runningCount 历史的所有相同key的value总和
def updateFunction(newValues: Seq[Int], runningCount: Option[Int]): Option[Int] = { val newCount =runningCount.getOrElse(0)+newValues.sum Some(newCount) } //累计统计单词出现的次数 val result: DStream[(String, Int)] = wordAndOne.updateStateByKey(updateFunction)
SparkStreaming开窗函数reduceByKeyAndWindow,实现单词计数
- //todo: 8.reduceByKeyAndWindow函数参数意义:
- //todo: windowDuration:表示window框住的时间长度,如本例5秒切分一次RDD,框10秒,就会保留最近2次切分的RDD
//todo: slideDuration: 表示window滑动的时间长度,即每隔多久执行本次计算
val result: DStream[(String, Int)] = wordAndOne.reduceByKeyAndWindow((a: Int, b: Int) => a + b, Seconds(10), Seconds(5))
实现Spark Streaming与flume整合
- Poll方式(推荐)
- Push方式
实现Spark Streaming与kafka整合
- KafkaUtils.createDstream方式
- KafkaUtils.createDirectStream方式(推荐)
每一个成功的背后都有无数个无人知晓的黑夜。
因为
夜晚,是超越对手的最佳时机。
===================== 码农1024 =====================#蔺光岭#
还不快抢沙发