SparkStreaming
SparkStreaming
SparkStreaming 概述:
-
SparkStreaming 是对实时数据流进行高通量、容错处理的流式处理系统,支持多对数据源输入<Kafka、Flume、HDFS>获取的数据使用Spark的高度抽象原语进行运算,并将结果数据在外部文件系统、数据库、实时仪表盘<HDFS、数据库>。
-
Micro-Batch微批次:
Spark处理的是批量数据(离线数据),SparkStreaming并非接收一条处理条数据,而是对接外部数据流,将获取到实时数据按照规定的时间间隔(批次大小)对数据进行切分然后交给Spark引擎进行数据处理。
补充:
- 数据处理方式:
- 批处理:对应离线,分批次处理,比较慢。
- 微批次处理:伪实时,批处理的时间无线被缩小,处理该时间批次内的数据。
- 流处理:对应实时处理,数据不断的过来,需要即使处理。<Flink、Storm>
- 流批一体:FlinkSQL,既能批处理,也能流处理。
- 批处理:对应离线,分批次处理,比较慢。
- 数据处理延迟:
- 离线处理:天、小时。
- 实时处理:毫秒、秒、最多分钟。
DStream:离散化流:
-
DStream是SparkStreaming的抽象,是随事件推移而收到的数据序列。
-
DStream内部,每个时间区间收到的数据都做为RDD存在,而DStream就是由这些RDD组成的序列,所以DStream就是对RDD在实时数据处理场景的封装。
说明:
1.DStream内部的每个时间批次就是一个RDD,并且每个批次内的数据是连续的(连续数据流),而每个批次之间的数据
是相互独立的(离散流)。
2.每个DStream调用的原语在内部会被每个RDD都执行,Spark的RDD可以理解为空间维度,而DStream中的RDD可以理解为在空间维度上又添加了时间维度,每个RDD内部处理逻辑都相同,只是时间维度不同。
SparkStreaming特点:
- 简单易用:获取到Stream数据之后,可以调用各种原语进行计算。
- 可以容错:底层基于RDD,RDD本身可以容错。
- Spark整合:底层本身就是基于RDD的。
SparkStreaming架构:
-
Driver:记录了DStream之间的依赖和血缘关系,并负责任务调度生成新的RDD,且内部维护了'DStream Graph'<任务级别>这张图。
- Spark Streaming Driver
- Receiver Tracker:跟踪每一个网络received数据,并且将其映射到相应的input DStream上。
- JOb Generator:周期性的访问DStream Graph并生成Spark Job,将其交给Job Scheduler。
- Job Scheduler:获取任务队列,并执行Spark任务。
- Spark Driver
- SparkContext:处理SparkStreaming的任务数据,形成Spark任务,发送给Executor端执行。
- Spark Streaming Driver
-
Executor:接收客户端发送的数据、输入数进行据副本存储和检查点RDD存储、执行Driver端发送的RDD计算任务。
-
Receiver:用来接收外部数据流,对于不同的数据源进行针对性的获取,SparkStreaming提供了不同的接收器分布在不同的节点上,每个接收器都是一个特定的进程,每个节点接收一部分作为输入,并将接收到的数据存储到内部缓存区,等待时间切片定时器时间到了,缓存区会将数据转换成block,然后把数据库放到一个队列中,最终将数据处理成SparkStreaming能处理的数据格式然后将数据块的id发送给Receiver Tracker。
说明:
1.Receiver并非接收到数据就会马上处理,它会先将数据存储到内部缓存区,因为SparkStreaming是按照时间进行不断的分片, 需要等待定时器时间到了。
2.缓存区的作用:用户可以按照自定义的时间进行切片。 -
BlockManager:负责将Receiver形成数据块(输入数据、检查点RDD)从队列中取出,并发送至其他Executor节点上的BlockManager进行存储。
-
-
Client:负责向SparkStreaming输入数据。
流程:
- 通过Client客户端将datastream数据流发送给Executor上的Receiver接收器,接收器会根据不同来源的数据进行针对性获取,然后将数据存储到内部缓存区缓存,待既是时间到了以后会将缓存区中的数据转换成block数据块,然后将数据块放到队列中等待BlockManager获取block快数据并发送到其他节点Executor上的BlockManager上进行备份和存储,同时并将block的ids发送给Receiver Tracker,Receiver Tracker会跟踪每个Receiver的数据,并将其映射到相应的inputDStream上。Job Generator周期性访问DStream Graph并生成Spark Job交给Job Scheduler。Job Scheduler会获取任务队列,并运行Spark Job,并向SparkContext提交作业。SparkContext会形成最终的Job并发送给其他节点的Executor去运行计算。
背压机制:
- 根据JobScheduler反馈作业的执行信息来动态调整Receiver数据接收率。
- 说明:
1.Spark 1.5 之前设置每个批次能接收数据的最大速率,通过限制Receiver的接收速率来适配当前的处理能力,方式内存溢出。但是该值固定以后无法动态的与当前集群数据的处理能力匹配,当集群处理能力大于该值时会造成资源利用率下降,在Spark 1.5 之后引入背压机制,开启背压后可以动态控制数据接收速率来适配集群数据处理能力。
2.背压机制的实现时通过额外的线程去监控当前正在进行的数据处理情况来动态调整,首次会根据设置的最大接收速率在当前的批次处理中是否即使处理完毕,如果时间比当前批次的时间快了,背压机制就会动态的调大数据的接收速率,否则会调小。
滑动窗口:
- 任何窗口操作都需要如下参数
- 窗口大小:计算内容的时间范围。
- 滑动步长:间隔多久触发一次计算。
SparkStreaming 业务场景:
- 无状态操作:仅针对本批次中的数据。
- 商机标题分类,分类http请求端 -> kafka -> Spark Streaming -> http请求端Map -> 响应结果。
- 网库Nginx访问日志收集,flume->kafka -> Spark Streaming -> hive/hdfs。
- 数据同步,网库主站数据通过“主站”->kafka->Spark Streaming -> hive/hdfs。
- 有状态操作:需要依赖之前的历史批次数据(存储在Redis)和当前当前新的批次数据,将新生成的数据与历史数据合并成一份流水表的全量数据。
- 实时统计网库各个站点总的访问量。
- 实时统计网库每个商品的总浏览量,交易量,交易额。
- 窗口操作:定时对指定时间段范围内的DStream数据进行操作。
- 网库主站的恶意访问、爬虫,每10分钟统计30分钟内访问次数最多的用户。
优雅关闭:
- 为什么要优雅的关闭:关闭SparkStreaming时,仍有未处理的数据,但该部分数据的offset已经提交,再次启动时,会丢失掉这部分已经提交offset的数据。