sparkStreaming

本质(是什么)(我在试着讲明白)

流式处理框架,微批处理框架

作用(干什么)(我在试着讲明白)

实现高吞吐量的,具备容错机制的实时流数据处理

架构(有什么)(我在试着讲明白)

Spark中流式处理模块,SparkStreaming是7*24小时不间断运行,底层操作的是DStream,DStream底层是RDD

优缺点(我在试着讲明白)

优点

吞吐量大,可以做复杂的业务逻辑(保证每个job的处理小于batch interval)

缺点

数据延迟度较高 ,相对storm

流程(怎么运作)(我在试着讲明白)

SparkStreaming与kafka整合的模式

SparkSteaming+kafka 维护消费者offset.jpg
在这里插入图片描述

1、Receiver模式
Spark 2.0+ 去掉,不用
SparkStreaming 需要启动task 接收数据,接收来的数据存放级别 MEMORY_AND_DISK_SER_2
流程:接收数据->备份->更新offset->汇报数据位置->发送task处理数据
当Driver挂掉时,有丢失数据的问题,开启WAL(Write Ahead Log) 预写日志机制 将数据存储在指定的checkpoint中防止丢失数据
开启WAL 要设置Checkpoint ,可以将接收来数据的存储级别降级 : MEMORY_AND_DISK_SER
开启WAL机制有新的问题:处理数据的延迟大
Receiver 模式不支持从每批次中获取offset,内部自己通过zookeeper来维护消费者offset
Recevier 模式底层采取消费kafka 的Hight consumer api 实现,不关心offset,只要数据
Receiver 模式的并行度 :spark.streaming.blockInterval = 200ms ,默认在batchInterval 内每隔200ms 生成一个block,每个block对应RDD的一个partition
如何提高并行度?降低 spark.streaming.blockInterval 最低不能低于50ms
SparkStreaming+kafka Receiver 模式.jpg

在这里插入图片描述

2、Direct模式
相对于Receiver模式 简化了并行度,并行度与读取的topic的partition个数一致
Direct每批次数据都是直接拉取处理,不需要将数据存储在Executor内存或者磁盘中
Direct 使用Spark来管理消费者offset,默认存储在内存中,如果设置checkpoint在checkpint中也有一份
Spark 1.6中读取kafka 0.8.2采用的是 Simple consumer api ,可以从每批次中获取消费者offset,可以做到自己维护
Spark1.6Direct 模式维护消费者offset,1.使用checkpoint 2.使用手动维护
SparkStreaming + kafka Direct 模式.jpg

在这里插入图片描述

Direct模式 管理offset
1.使用checkpoint来管理消费者offset
	当代码逻辑变化时,恢复offset的同时会恢复旧的逻辑
	重启启动时,会有重复处理数据问题
	StreamingFactory.getOrCreate("checkpiont目录",StreamingContext)
2.使用kafka 管理消费者offset(Spark2.3+kafka 0.11 )
	自动提交
		"enable.auto.commit" -> (true: java.lang.Boolean)//默认是true,开启之后会每隔5s自动向Kafka 提交offset
		相当于数据最多处理一次,有可能SparkStreaming接收到数据之后没有处理,就提交了offset
	异步手动提交(建议)
		"enable.auto.commit" -> (false: java.lang.Boolean)//默认是true,设置成false ,可以自己保证数据处理完之后,异步向Kafka提交消费者offset
3.手动维护消费者offset
	可以存储在Mysql,HBase,Redis ,【Zookeeper】
	利用redis存储消费者offset
		1.程序启动,从redis中获取上一次保存的消费者offset
		2.传递给SparkStreaming,接着和这个位置读取
		3.每一批次中获取当前offset 存储在Redis中

sparkStreaming 接收数据的原理

在这里插入图片描述

SparkStreaming读取数据流程

1.SparkStremaming启动之,首先会启动一个job接收数据,每隔batchInterval 将数据封装到一个batch中,这个batch又被封装到RDD中,RDD又被封装到一个DStream中
2.SparkStreaming对生成的DStream进行处理,DStream有自己的Transformation类算子,懒执行,需要DStream的OutputOperator类算子触发执行
3.如果batchInterval = 5s ,处理一批次数据的时间小于5s,集群资源不能充分利用
4.如果batchInterval = 5s ,处理一批次数据的时间大于5s,任务有堆积

常用(必会)(我在试着讲明白)

常见问题(必知)(我在试着讲明白)

sparkStreaming 与strom 的区别

1.SparkStreaming是微批处理,Strom是纯实时处理数据,SparkStreaming的吞吐量大。
2.SparkStreaming擅长处理复杂的业务,Storm擅长处理简单的汇总型业务。
3.Storm的事务相对于SparkStreaming完善,SparkStreaming现在也比较完善。
4.Storm支持动态的资源调度,Spark1.2之后也是支持动态资源调度

spark参数

spark.streaming.backpressure.enabled   false
spark.streaming.blockInterval	  200ms	
spark.streaming.receiver.maxRate   not set
spark.streaming.receiver.writeAheadLog.enable  false
spark.streaming.stopGracefullyOnShutdown   false
spark.streaming.kafka.maxRatePerPartition   not set

kafka配置参数

"bootstrap.servers" 
"key.deserializer"
"value.deserializer"
"group.id"
"auto.offset.reset"
	earliest
	latest
	none
"enable.auto.commit"  true
heartbeat.interval.ms  3s
session.timeout.ms 10s
group.min.session.timeout.ms 6s
group.max.session.timeout.ms  300s

异议

有差错或者需要补充的地方,还望大家评论指出,并详细论证,相互学习,共同进步哈!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值