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://www.pswp.cn/diannao/98821.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98821.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98821.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kite Compositor for Mac v2.1.2 安装教程|DMG文件安装步骤(Mac用户必看)

Kite Compositor​ 是一款专为 ​macOS​ 设计的 ​轻量级界面设计 & 动画制作工具,它可以让你像拼图一样直观地 ​创建、编辑和预览用户界面(UI)以及动画效果。 一、下载文件 首先,你得先把这个 ​Kite Compositor for Mac …

【逆向】Android程序静态+动态分析——去壳

对提供的 CrackmeTest.apk 进行逆向分析,程序含有反调试机制(加壳),通过静态补丁反反调试(去壳),再动态调试获取其中密码。 目录 环境 基础 实验内容 静态分析 动态分析 反反调试 再动态…

Rust 开发环境安装与 crates.io 国内源配置(Windows / macOS / Linux 全流程)

Rust 这几年在系统编程、WebAssembly、区块链、后端服务领域越来越火,很多开发者都在尝试用它做一些新项目。 但是国内安装 Rust 开发环境时,经常遇到 安装慢、依赖拉不下来、crates.io 超时 等问题。本文结合个人踩坑经验,整理了一份 跨平台…

Nginx SSL/TLS 配置

Nginx SSL/TLS 配置指南:从入门到安全强化前言一、环境准备:Nginx安装配置1.1. **EPEL仓库配置**:1.2. **Nginx安装**:1.3. **服务启停管理**:1.4. **服务状态验证**:二、SSL/TLS证书获取方案方案A&#xf…

Java ReentrantLock和synchronized的相同点与区别

1. 核心概念与定位synchronized:Java 内置的关键字,属于 JVM 层面的隐式锁。通过在方法或代码块上声明,自动实现锁的获取与释放,无需手动操作。设计目标是提供简单易用的基础同步能力,适合大多数常规同步场景。Reentra…

【npm】npm 包更新工具 npm-check-updates (ncu)

npm 包太多了,一个项目有那么多依赖包,它们的升级管理需要一个工具:npm-check-updates: 安装: npm install -g npm-check-updates安装之后,就可以使用它的命令:ncu 查看哪些包可以升级&#xff…

go资深之路笔记(一) Context

一、 Context 的正确使用与底层原理 1.结构体 type Context interface {// Deadline 返回此 Context 被取消的时间点。// 如果未设置截止时间,ok 为 false。Deadline() (deadline time.Time, ok bool)// Done 返回一个 channel。当 Context 被取消或超时后&#xff…

VS2022 + Qt5.9 中文乱码/项目设置utf-8编码

🛠️ 解决QT5.9 VS2022中文乱码的全面方案 📁 1. 检查文件编码与编译器设置 确保源文件是 带BOM的UTF-8 编码对MSVC编译器很重要。VS2022默认可能使用本地编码(如GB2312)解析源文件,即使文件以UTF-8保存。 查看和设置…

数据库--MySQL数据管理

数据库–MySQL数据管理 文章目录数据库--MySQL数据管理1.外键管理2.数据库数据管理3.DML语言3.1添加数据3.2修改数据3.3删除数据4.练习1.外键管理 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,…

【C++练习】13.C++输出九九乘法表的方法详解

目录 C++输出九九乘法表的方法详解 方法1:双重for循环(最基础) 思考: 代码分析: 特点: 方法2:使用while循环 思考: 代码分析: 特点: 方法3:使用递归实现 思考: 代码分析: 特点: 方法4:格式化输出(对齐美观) 思考: 代码分析: 特点: 方法5:使用函数封装 思考…

MVC及其衍生

MVC 把软件分成模型(Model)、视图(View)、控制器(Controller)三个基本部分。 事实上对应着 Controller——输入 用户交互,将输入处理成Controller能处理的形式 Model——处理 描述状态、逻辑规律…

微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级

随着汽车电子化程度不断提高,转向系统对高效功率器件的需求日益增长。微硕WINSOK推出的N沟道Trench MOS管WSF3089,以30 V/72 A大电流、4.5 mΩ超低导通电阻和TO-252-2L紧凑封装,为EPS(电动助力转向)电机驱动、电源管理…

淘宝拍立淘接口的接入与应用||item_search_img-按图搜索淘宝商品(拍立淘)

淘宝拍立淘接口的接入与应用如下:接入流程注册与认证:开发者账号注册:访问淘宝开放平台,进行开发者账号注册。创建应用:在控制台创建新应用,获取 App Key 和 App Secret,这是接口调用的凭证。申…

Python学习-day8 元组tuple

元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序元素。与列表(List)类似,但元组一旦创建后不能修改(不可添加、删除或修改元素),这使得它在安全性、性能优化…

大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

二次学习C语言补充2

文章目录表栈、队列、二叉树一、二叉树二、表栈三、队列链表一、单向链表二、循环链表、双向链表和双向循环链表预处理一、预处理二、宏定义文件文件操作补充本篇文章是对二次学习C语言12——文件操作 二次学习C语言14——预处理及模块化 二次学习C语言15——链表 二次学习C语言…

2.9Vue创建项目(组件)的补充

1.再创建和引入vue的选择2.VsCode插件 安装Vue自己搜索最新的3.style自己的作用域在一个组件中引入另一个文件的子组件,给当前组件设置样式,那么子组件的样式也会改变的。为了解决这个问题 我们在自己的style中设置一个属性4.另一种创建vue 的方式(主流…

算法高频题

刷题:LeetCode(Top 100-150题,至少刷两遍)。重点:链表、树、二分查找、动态规划、回溯、栈/队列。 每一个题型,前10个高频题 算法思考框架参考:算法题思维框架-CSDN博客 高频顺序参考网站&…

服务器安装 LDOPE(MODIS 数据处理工具)

目录下载方式1-(简单快捷)根据WRF-VPRM 需要打补丁下载方式2:(手动安装依赖)一、安装所需依赖库(4 个主库 2 个基础库)另- HDF-EOS 手动编译二、解压并安装 LDOPE参考下载方式1-(简…

克隆代币 + 捆绑开盘:多链环境下的低成本发币玩法

在加密世界,发币已经不再是“少数开发者的专利”。随着工具的普及,任何人都可以快速发行一个在加密世界,发币已经不再是“少数开发者的专利”。随着工具的普及,任何人都可以快速发行一个代币。但问题是:如何在保证低成…