当前位置: 首页 > news >正文

详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣

spark streaming是基于微批处理的流式计算引擎,通常是利用spark core或者spark core与spark sql一起来处理数据。在企业实时处理架构中,通常将spark streaming和kafka集成作为整个大数据处理架构的核心环节之一。

针对不同的spark、kafka版本,集成处理数据的方式分为两种:Receiver based Approach和Direct Approach,不同集成版本处理方式的支持,可参考下图:
在这里插入图片描述

Receiver based Approach

基于receiver的方式是使用kafka消费者高阶API实现的。

对于所有的receiver,它通过kafka接收的数据会被存储于spark的executors上,底层是写入BlockManager中,默认200ms生成一个block(通过配置参数spark.streaming.blockInterval决定)。然后由spark streaming提交的job构建BlockRdd,最终以spark core任务的形式运行。

关于receiver方式,有以下几点需要注意:

  1. receiver作为一个常驻线程调度到executor上运行,占用一个cpu

  2. receiver个数由KafkaUtils.createStream调用次数决定,一次一个receiver

  3. kafka中的topic分区并不能关联产生在spark streaming中的rdd分区
    增加在KafkaUtils.createStream()中的指定的topic分区数,仅仅增加了单个receiver消费的topic的线程数,它不会增加处理数据中的并行的spark的数量
    【topicMap[topic,num_threads]map的value对应的数值是每个topic对应的消费线程数】

  4. receiver默认200ms生成一个block,建议根据数据量大小调整block生成周期

  5. receiver接收的数据会放入到BlockManager,每个executor都会有一个BlockManager实例,由于数据本地性,那些存在receiver的executor会被调度执行更多的task,就会导致某些executor比较空闲

建议通过参数spark.locality.wait调整数据本地性。该参数设置的不合理,比如设置为10而任务2s就处理结束,就会导致越来越多的任务调度到数据存在的executor上执行,导致任务执行缓慢甚至失败(要和数据倾斜区分开)

  1. 多个kafka输入的DStreams可以使用不同的groups、topics创建,使用多个receivers接收处理数据

  2. 两种receiver

可靠的receiver:可靠的receiver在接收到数据并通过复制机制存储在spark中时准确的向可靠的数据源发送ack确认

不可靠的receiver:不可靠的receiver不会向数据源发送数据已接收确认。这适用于用于不支持ack的数据源。
当然,我们也可以自定义receiver。

  1. receiver处理数据可靠性默认情况下,receiver是可能丢失数据的
    可以通过设置spark.streaming.receiver.writeAheadLog.enable为true开启预写日志机制,将数据先写入一个可靠地分布式文件系统如hdfs,确保数据不丢失,但会失去一定性能

  2. 限制消费者消费的最大速率

涉及三个参数:

spark.streaming.backpressure.enabled:默认是false,设置为true,就开启了背压机制

spark.streaming.backpressure.initialRate:默认没设置初始消费速率,第一次启动时每个receiver接收数据的最大值

spark.streaming.receiver.maxRate:默认值没设置,每个receiver接收数据的最大速率(每秒记录数)。每个流每秒最多将消费此数量的记录,将此配置设置为0或负数将不会对最大速率进行限制

  1. 在产生job时,会将当前job有效范围内的所有block组成一个BlockRDD,一个block对应一个分区

  2. kafka082版本消费者高阶API中,有分组的概念,建议使消费者组内的线程数(消费者个数)和kafka分区数保持一致。如果多于分区数,会有部分消费者处于空闲状态

Direct Approach

direct approach是spark streaming不使用receiver集成kafka的方式,一般在企业生产环境中使用较多。相较于receiver,有以下特点:

  1. 不使用receiver

a. 不需要创建多个kafka streams并聚合它们

b. 减少不必要的CPU占用

c. 减少了receiver接收数据写入BlockManager,然后运行时再通过blockId、网络传输、磁盘读取等来获取数据的整个过程,提升了效率

d. 无需wal,进一步减少磁盘IO操作

  1. direct方式生的rdd是KafkaRDD,它的分区数与kafka分区数保持一致一样多的rdd分区来消费,更方便我们对并行度进行控制

注意:在shuffle或者repartition操作后生成的rdd,这种对应关系会失效

  1. 可以手动维护offset,实现exactly once语义

  2. 数据本地性问题。在KafkaRDD在compute函数中,使用SimpleConsumer根据指定的topic、分区、offset去读取kafka数据。

但在010版本后,又存在假如kafka和spark处于同一集群存在数据本地性的问题

  1. 限制消费者消费的最大速率

spark.streaming.kafka.maxRatePerPartition:从每个kafka分区读取数据的最大速率(每秒记录数)。这是针对每个分区进行限速,需要事先知道kafka分区数,来评估系统的吞吐量。

更多干货抢先看: 大数据技术干货汇总 —— 助力迎接复杂多变且充满机遇的2025


文章转载自:

http://IF0EfcLe.knpbr.cn
http://xLWxjvRi.knpbr.cn
http://BILRedzx.knpbr.cn
http://RAUil5dW.knpbr.cn
http://wHCKiafT.knpbr.cn
http://xfRjgP5F.knpbr.cn
http://yTLKE8m1.knpbr.cn
http://BZvOUV6h.knpbr.cn
http://gdAqHFrz.knpbr.cn
http://c6L2fyCd.knpbr.cn
http://8GfnmqX6.knpbr.cn
http://8dRBHIkr.knpbr.cn
http://g2h7XWYv.knpbr.cn
http://KoI9l2Ez.knpbr.cn
http://iWXY3g6m.knpbr.cn
http://VXTccXXo.knpbr.cn
http://ZDBGuxDo.knpbr.cn
http://i2uAkVoK.knpbr.cn
http://Hxd48Jih.knpbr.cn
http://z5BRiYED.knpbr.cn
http://EH8ms7hZ.knpbr.cn
http://e9WJVKNt.knpbr.cn
http://FZ1WSm32.knpbr.cn
http://LbhMea93.knpbr.cn
http://0N0L0TX2.knpbr.cn
http://6z4k9I8o.knpbr.cn
http://OJfeSQz2.knpbr.cn
http://OSWlfxyr.knpbr.cn
http://DwfEUgSp.knpbr.cn
http://RXzaOzca.knpbr.cn
http://www.dtcms.com/a/372866.html

相关文章:

  • 大数据Spark(六十三):RDD-Resilient Distributed Dataset
  • 云原生TodoList Demo 项目,验证云原生核心特性
  • C语言爬虫开发:常见错误与优化方案
  • Linux 应急响应实操 Checklist
  • 【PCIe EP 设备入门学习专栏 -- 8.2.3 Local Bus Controller (LBC) 详细介绍】
  • 将基于 Oracle JDK 17 开发的 Spring Boot 3.2.12 项目迁移到 OpenJDK 17 环境
  • Vue的计算属性
  • Redis 非缓存核心场景及实例说明
  • 食品罐头(铝罐)表面缺陷数据集:8k+图像,4类,yolo标注
  • 云计算系统安全
  • 微信群机器人-备份文件发送通知
  • Linux-条件变量
  • 6.python——字符串
  • 懒汉式——LazyMan(任务队列应用)
  • Nginx 实战系列(四)—— Nginx反向代理与负载均衡实战指南
  • Nginx 反向代理 + Tomcat 集群:负载均衡配置步骤与核心原理
  • 【Linux】匿名管道和进程池
  • PWA:打造媲美 Native Apps 的 Web 应用体验
  • # 小程序 Web 登录流程完整解析
  • 2025中国AI HR市场深度洞察:趋势、厂商与未来展望
  • 并发编程的守护者:信号量与日志策略模式解析
  • Flink Task线程处理模型:Mailbox
  • ActiveMQ classic ,artemis ,artemis console ,nms clients,cms client详解
  • 【论文阅读】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
  • Three.js使用outlinePass描边后,描边颜色和背景叠加变淡
  • GPT系列--类GPT2源码剖析
  • 反编译分析C#闭包
  • DTO与POJO:核心差异与最佳实践
  • #C语言——刷题攻略:牛客编程入门训练(九):攻克 分支控制(三)、循环控制(一),轻松拿捏!
  • Android 中 自定义 RecyclerView 控件限制显示高度