spark:一个批次一个job,不管有没有数据都要起job
flink:事件驱动,有数据才计算(数据与计算是一体化的)
flink遇到类似双流join不需要借助外部存储(如redis)Sparkstreaming是什么
sparkstreaming 是spark用来开发针对实时产生的数据流计算的流式应用的模块。这个模块其实本质是对spark core的扩展。
原理:
sparkstreaming主要的功能是将数据流进行离散化,持久化,批处理!
离散化: 将流式数据,基于固定的采集间隔,划分为若干个批次!
持久化: sparkstreaming 会将每个周期采集到的数据,进行持久化存储!
批处理: sparkstreaming会将每个周期采集到的数据,封装为RDD,进行计算!
优势:
①和Spark的技术桟集成,在sparkstreaming编写的应用中,可以直接使用spark core,spark sql,spark ML,graph x的api对数据进行一栈式处理
②和spark core编程方式类似,学习成本低
③数据源支持丰富,满足日常的处理场景
劣势:
①不是严格意义上的实时,本质还是批处理,而不是流式数据。
sparkstreaming:将数据流划分为若干小的批次(秒)
Job在生成后,经过Task的调度,也会有延迟!
②可以达到秒级的实时处理要求
spark后续开发的新技术:
structured streaming : 毫秒级,他是直接使用SQL编程!flink的抄袭对象

SparkStreaming的架构
①一个SparkStreaming程序启动后,固定初始化一个Receiver对象,Receiver对象,会对接数据源,采集源源不断的数据,
每间隔spark.streaming.blockInterval(200ms), 将采集到的数据划分到一个block数据块中。数据块在Receiver所在的Executor上存储,优先存储在内存中,内存不够会溢写到磁盘。
是否溢写到磁盘,取决于Receiver的Storage级别。
如果Receiver所在的Executor崩溃了,那么存储在Executor内存中的Block也会丢失,可以开启spark.streaming.receiver.writeAheadLog.enable,下次app重启后,会从WAL日志中恢复数据!
②在Driver端,可以定义一个固定的采集周期(例如5s),每间隔一个采集周期,将采集到的block(5秒内有多个block),生成一组Job进行计算

框架原理:

image.pngimage.png

1.接收器接收到数据后,将数据信息交给driver,并在其他节点上生成完成备份
2.driver的streaming收到数据信息后生成并调度job,
3.最后将调度任务交给sparkContext分发任务到其他executor上


image.png
image.png

DStreams(离散流)

将每个批次的数据封装成RDD: DStreams(RDD1,RDD2,RDD3,….)
image.png
image.png
封装成RDD之后转换成新的RDD,也就是说DStream的转换就是RDD的转换
image.png

SparkContext

image.png
image.png
image.png

image.png
image.png
但是一个sparkcontext可以有多个不同端口号的ds:
image.png



image.png
对应下图:
image.png

image.png

image.png

receiver(了解)

image.png

socketTextStream

从网络端口读取文本

queueStream

一个DStream是一个Rdd集合
image.png
每一个批次都是一个Rdd
一个Queue也是一个Rdd集合
将queue类比为DStream来进行测试,将数据放进队列中来模拟数据流

  1. val list= List("a","b","c","a","cc","d","b","b")
  2. val rdd = context.sparkContext.makeRDD(list, 2)
  3. val queue = new mutable.Queue[RDD[String]]()
  4. for(i<-1 to 100) queue.enqueue(rdd)
  5. val ds = context.queueStream(queue, true,null)

来模拟

  1. val ds = context.socketTextStream("hadoop102", 3333)

自定义receiver

receiver:可设置一批次接收多少数据
基本上不需要自定义
image.png
image.png

image.png

守护线程概念

image.png

Receiver有两个作用,一个是收数据,然后处理并发送
所以将发送独立出来一个线程,这样处理速度更快些