SparkStreaming
一、学习内容
- sparkstreaming基本工作原理的介绍
- 常用的流式框架进行对比
- sparkstreaming案例体验
- sparkstreaming数据结构DStream
- sparkstreaming整合HDFS
- sparkstreaming整合Kafka
- sparkstreaming特性
- sparkstreaming如何做缓存
- sparkstreaming如何优化
二、概念认知
如何理解流式计算:
流式计算简单来说就是来一批(小批次,kb级)或者来一条就处理一次
流式计算的程序没有终止、数据是随着时间动态变化的,没有边界。计算是快速的,实时流计算体系中一条数据也叫一个Event(Flume)
对比离线计算:
程序会终止,数据是静态的(数据有边界)、计算缓慢
三、看官网
-
1.sparkstreaming(DStream)底层也是被翻译成RDD
-
2.在RDD基础之上进行封装(DStream)
-
3.可实现实时数据流处理,高吞吐量【一条一条的数据可以处理,批量的数据也可以处理】,具有容错性(数据如果处理失败了可以自动重试)
RDD默认会从血缘关系链的头开始重新计算,如果有持久化的数据,那就从持久化的数据开始计算,如果没有就从头计算。
sparkstreaming:监听网络端口(如果不能容忍数据丢失或者失败的话需要对数据进行持久化)
存储系统:同RDD(默认会从血缘关系链的头开始重新计算,如果有持久化的数据,那就从持久化的数据开始计算,如果没有就从头计算。)
-
4.数据源多种多样(可以来自网络端口、存储系统)
-
5.sparkstreaming使用高阶算子(独有的算子)
比如:每间隔2秒处理前3秒的单词计数(窗口)【算子】
-
6.sparkstreaming数据持久化到分布式文件系统、关系型数据库
-
7.实时流的技术支持实时的机器学习模型的构建
四、什么是DStream
Discretized Stream(离散型数据流)是Spark Streaming的基础抽象, 代表持续性的数据流和经过各种Spark算子操作后的结果数据流.
五、市面上的框架对比
SparkStreaming、storm、Flink
Storm:
能针对一条数据进行处理
对实时的数据处理速度(毫秒级别)
吞吐量低(不能处理一批批的数据)
编程范式组合式编程(没有高阶算子可以使用,只有低级的api可以使用)
Flink:
实时处理的(java、scala编程)【一条数据进行处理,提供高级算子】【具有高阶算子的是声明式】
早期版本不支持写sql,现在版本支持。
案例:SparkStreaming 单词计数
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN
)
val conf = new SparkConf().setMaster("local[2]").setAppName("sparkstreaming")
val sc = new SparkContext(conf)
val ssc: StreamingContext = new StreamingContext(sc, Seconds(2))
//主机名、端口号、持久化级别
val input: ReceiverInputDStream[String] =
ssc.socketTextStream("hadoop02", 9998, StorageLevel.MEMORY_ONLY)
val flatmapDS: DStream[String] = input.flatMap(line => {
line.split("\\s+")
})
val reduceByKeyDS: DStream[(String, Int)] = flatmapDS.map((_, 1)).reduceByKey(_ + _)
reduceByKeyDS.print()
ssc.start()//提交当前实时流的程序
flatmapDS.map((_,1)).print()
//添加以上这条代码程序就 报错结束了
//因为如果实时流的程序提交了,那么在start不能对实时流里面的DStream进行任何高阶算子的操作
ssc.awaitTermination()//等待程序的结束
println("hello world")
}