2024.1.13 Kafka六大机制和Structured Streaming

目录

一 . Kafka中生产者数据分发策略

二.  Kafka消费者的负载均衡机制

三 . 数据不丢失机制

生产者端是如何保证数据不丢失的呢?

Broker端如何保证数据不丢失

 消费端如何保证数据不丢失

Kafka中消费者如何对数据仅且只消费一次

 四 . 启动Kafka eagle命令

数据积压问题处理

五 . 结构化流 

数据源 File Source

OPERATIONS数据处理操作

 Sink输出操作


六大机制:分区,副本,存储,查询,数据不丢失,负载均衡 ; 

一 . Kafka中生产者数据分发策略

        JAVA中的轮询分发策略 和 粘性分发策略:

                轮询:避免数据倾斜

                粘性: 产生数据倾斜

                轮询分发策略: 在Kafka的老版本中存在的一种分发策略,当生产数据的时候,只有value但是没有key的时候,采用轮询。
    优点: 可以保证每个分区拿到的数据基本是一样,因为是一个一个的轮询的分发
    缺点: 如果采用异步发送方式,意味着一批数据发送到broker端,由于是轮询策略,会将这一批数据拆分为多个小的批次,分别再写入到不同的分区里面去,写入进去以后,每个分区都会给予响应,会影响写入效率。

                粘性分发策略: 在Kafka新版本中存在的一种分发策略。当生产数据的时候,只有value但是没有key的时候,采用粘性分发策略
    优点: 在发送数据的时候,首先会随机的选取一个分区,然后尽可能将数据分发到这个分区上面去,也就是尽可能粘着这个分区。该分发方式,在异步发送的操作中,效率比较高。
    缺点: 在数据发送特别快的时候,可能会导致某个分区的数据比其他分区数据多很多,造成大量的数据集中在一个分区上面

二.  Kafka消费者的负载均衡机制

Kafka消费者的负载均衡机制
1- 在同一个消费组中,消费者的个数最多不能超过Topic的分区数。如果超过了,就会有一些消费者处于闲置状态,消费不到任何数据。
2- 在同一个消费组中,一个Topic中一个分区的数据,只能被同个消费组中的一个消费者所消费,不能被同个消费组中多个消费者所消费。但是一个消费组内的一个消费者可以消费多个分区的数据。也就是分区和消费者的对应关系,多对一
3-不同的消费组中的消费者,可以对一个Topic的数据同时消费,也就是不同消费组间没有任何关系

三 . 数据不丢失机制

生产者端是如何保证数据不丢失的呢?


答:生产者端将消息发送给到Kafka集群以后,broker要给生产者响应信息。响应原理就是ACK机制


ACK机制当中有3个参数配置值,分别是:0  1  -1(all)
0:生产者生产消息给到Kafka集群,生产者不等待(不接收)broker返回的响应信息
1:生产者生产消息给到Kafka集群,Kafka集群中的分区对应的Leader主副本所在的broker给生产者返回响应信息
-1(all):生产者生产消息给到Kafka集群,Kafka集群中的分区对应的所有副本给生产者返回响应信息


消息的生产效率排序(由高到低):0 > 1 > -1
消息的安全级别排序(由高到低):-1 > 1 > 0


在实际工作中如何选择ACK参数配置?
答:根据数据的重要程度进行选择。如果数据重要,优先保证数据的安全性,再考虑生产效率;如果数据不重要,优先考虑生产效率,再尽可能提升安全级别。

Broker端如何保证数据不丢失

        Broker端通过多副本机制确保数据不丢失。同时需要生产者端将acks设置为-1

 消费端如何保证数据不丢失

消费者消费消息的步骤:
1- 消费者首先连接到Kafka集群中,进行消息的消费

2- Kafka集群接收到Consumer消费者的消费请求以后,首先会根据group id(消费组名称),查找上次消费消息对应的offset(偏移量)

3- 如果没有查找到offset,消费者默认从Topic最新的地方开始消费

4- 如果有查找到offset,会从上次消费到的offset地方进行继续消费
    4.1- 首先先确定要读取的这个offset偏移量在哪个segment文件当中
    4.2- 查询这个segment文件对应的index文件,根据offset确定这个消息在log文件的什么位置,也就是确定消息的物理偏移量
    4.3- 读取log文件,查询对应范围内的数据即可
    4.4- 获取最终的消息数据

5- 消费者在消费的过程中,底层有个线程会定时的将消费的offset提交给到Kafka集群。Kafka集群会更新对应的offset的值

Kafka中消费者如何对数据仅且只消费一次

1- 将消费者的 enable.auto.commit 属性设置为 false,并手动管理消费者的偏移量。这样可以确保消费者在处理完所有消息后才更新偏移量,避免重复消费数据。也就是将消息的消费、消息业务处理代码、offset提交代码放在同一个事务当中。

2- 使用幂等生产者或事务性生产者来确保消息只被发送一次。这样可以避免重复发送消息,从而避免消费者重复消费数据。

3- 在消息中加入唯一的ID

 四 . 启动Kafka eagle命令

cd /export/server/kafka-eagle-bin-1.4.6/kafka-eagle-web-1.4.6/bin

./ke.sh start

结构化流测试linux开启命令

首先: 先下载一个 nc(netcat) 命令. 通过此命令打开一个端口号, 并且可以向这个端口写入数据
yum -y install nc
    
执行nc命令, 开启端口号, 写入数据:
nc -lk 55555

注意: 要先启动nc,再启动我们的程序


查看端口号是否被使用命令:
netstat -nlp | grep 要查询的端口

 

数据积压问题处理

出现积压的原因:

  • 因为数据写入目的容器失败,从而导致消费失败

  • 因为网络延迟消息消费失败

  • 消费逻辑过于复杂, 导致消费过慢,出现积压问题

解决方案:

  • 对于第一种, 我们常规解决方案, 处理目的容器,保证目的容器是一直可用状态

  • 对于第二种, 如果之前一直没问题, 只是某一天出现, 可以调整消费的超时时间。并且同时解决网络延迟问题

  • 对于第三种, 一般解决方案,调整消费代码, 消费更快即可, 利于消费者的负载均衡策略,提升消费者数量

五 . 结构化流 

        有界: 数据大小固定,有开始和结尾

        无界: 源源不断的数据,没有明确的结尾

结构化流是构建在Spark SQL处理引擎之上的一个流式的处理引擎,主要是针对无界数据的处理操作。对于结构化流同样也支持多种语言操作的API:比如 Python Java Scala SQL ....

Spark的核心是RDD。RDD出现主要的目的就是提供更加高效的离线的迭代计算操作,RDD是针对的有界的数据集,但是为了能够兼容实时计算的处理场景,提供微批处理模型,本质上还是批处理,只不过批与批之间的处理间隔时间变短了,让我们感觉是在进行流式的计算操作,目前默认的微批可以达到100毫秒一次

真正的流处理引擎: Flink、Storm(早期流式处理引擎)、Flume(流式数据采集)

数据源 File Source

        将目录中写入的文件作为数据流读取,支持的文件格式为:text、csv、json、orc、parquet。。。。

文件数据源特点:
        1- 不能够监听具体的文件,否则会报错误java.lang.IllegalArgumentException: Option 'basePath' must be a directory
        2- 可以通过通配符的形式,来监听目录下的文件,符合要求的才会被读取
        3- 如果监听目录中有子目录,那么无法监听到子目录的变化情况 

File source只能监听目录,不能监听具体文件 

读取代码通用格式:

                sparksession.readStream

                     .format('CSV|JSON|TEXT|PARQUET|ORC)

                    .option('参数名1','参数值1')
                    .option('参数名2','参数值2')
                    .option('参数名N','参数值N')
                    .schema(元数据信息)
                    .load('需要监听的目录地址')

OPERATIONS数据处理操作

        指的是数据处理部分,该操作和SparkSQL完全一致 

 Sink输出操作

        append模式:

                只支持追加,不支持聚合和排序,每次只打印追加的内容

        complete模式:

                每一次都全量处理,因为数据量大,所以必须聚合,也可以支持排序

        update模式: 

                支持聚合的append模式,有聚合操作只会输出有变化和新增的内容,不支持排序;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619043.shtml

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

相关文章

Python数据结构——列表

目录 一、认识Python数据结构 二、列表概述 三、列表切片 (一)概述 (二)常见形式 (三)特别说明 四、列表的基本操作 (一)创建列表 (二)列表元素增加…

全新加密叙事,以Solmash为代表的 LaunchPad 平台如何为用户赋能?

铭文市场的火爆带来“Fair Launch”这种全新的代币启动方式,Fair Launch 的特点在于其为所有人参与 Launch 带来了公平的机会,所有链上玩家们都需要通过先到先得的方式 Mint 资产,VC 在 Fair Launch 中几乎没有话语权,不同的投资者…

CSS伪类:为网页增添交互和样式

CSS伪类是一项强大的特性,它允许开发者根据不同的状态、位置和结构选择器来选择和样式化HTML元素。通过使用CSS伪类,我们可以为网页增添交互性、响应性和样式化效果。本文将深入探讨CSS伪类的概念、常见用法和一些实用示例。 CSS伪类是什么 CSS伪类是一…

qml 传递界面对象指针给c++,以及c++调用qml函数,并在c++中更新ChartView数据

由于QVariant在qml中构建解析大量数据时,效率较低,比如有60万个点时,C++用QVariant传到qml中时,界面就会很卡。所以逆向思维,把qml界面对象指针传给c++,在c++中渲染界面数据。 下面讲具体实现: 1.c++创建对象并暴露给qml,并定义槽函数给qml直接调用 global.h:class…

【AI的未来 - AI Agent系列】【MetaGPT】1. AI Agent如何重构世界

上篇文章我们跑起来了第一个MetaGPT程序。本文主要学习了一下理论,什么是智能体,以及智能体如何重构世界。 0. 什么是智能体 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 用人话说,我理解的Agent: 智…

C#MQTT编程01--MQTT介绍

1、前言 近年来物联网的发展如火如荼已经渗透到我们生活的方方面面。从智能家居到工业自动化从智慧城市到智慧农业物联网,正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视,这就是物联网在智能家居领域…

完美解决报错Please verify that the package.json has a valid “main“ entry处理方法

出现下图中的错误 ,说明缺少main入口 解决方法: 1.删除 node_modules 和 package-lock.json这两个文件 2.命令行输入npm i 会重新下载包 3.重新执行检查没有报错

QT常见组件

Qt 提供了非常丰富的图形用户界面(GUI)组件,这些组件可以按照功能和用途进行分类。由于Qt库的组件众多且不断更新,以下是一份大致分类及其包含的部分组件示例,并非所有Qt版本或模块都包括以下全部控件,但涵…

01循环算法

1.求小数点的某一位&#xff0c;且超出float和double的精度问题 【题目描述】 分数a/b化为小数后&#xff0c;小数点后第n位的数字是多少&#xff1f; 【输入】 三个正整数a&#xff0c;b&#xff0c;n&#xff0c;相邻两个数之间用单个空格隔开。0<a<b<100&#…

组织管理开源项目邀请入伙

背景 企业数字化平台基础 企业数字化或者信息化&#xff08;这两者有一些区别&#xff09;实施过程中&#xff0c;基本上一个系统、产品的实施、上线都可能会碰到组织人员集成问题&#xff0c;组织机构一般组织机构部门&#xff0c;岗位&#xff0c;人员&#xff0c;可能会有…

【微信小程序独立开发2】授权登录 上

前言&#xff1a;这一节设想完成的功能为进入小程序后请求授权信息&#xff0c;用户授权登录后&#xff0c;弹出宠物登记页面&#xff0c;并根据宠物类型播放背景音乐 小程序昵称头像在之前的版本获取规则为触发后弹出用户授权弹窗&#xff0c;授权后可直接获取用户头像和昵称&…

使用 CMake 和 Ninja 构建 C/C++ 项目的教程

使用 CMake 和 Ninja 构建 C/C 项目的教程 CMake 是一个跨平台的开源构建工具&#xff0c;它简化了项目的构建过程。而 Ninja 是一个快速、轻量级的构建系统&#xff0c;与 CMake 配合使用可以提高项目的构建效率。本教程将向你介绍如何使用 CMake 和 Ninja 来构建你的 C/C 项…

设计模式:简单工厂、工厂方法、抽象工厂的区别

设计模式&#xff1a;简单工厂、工厂方法、抽象工厂的区别 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 描述&#xff1a; 简单工厂模式并不是严格意义上的设计模式&#xff0c;而更像是一种编程习惯或者说是一种创建对象的简单方式。它使用一个工厂类来创建…

SQL_DQL_执行顺序

SELECT 字段列表 4 1 FROM 表名列表 1 WHERE 条件列表 &#xff08;可以有多个条…

金融科技革命:数字化如何塑造未来经济_光点科技

当今世界&#xff0c;数字化不仅是一种趋势&#xff0c;更是深刻重塑经济和金融领域的关键力量。在这个过程中&#xff0c;金融科技&#xff08;FinTech&#xff09;崭露头角&#xff0c;成为革命性变化的代名词。以下是数字化技术在经济和金融领域的几个关键应用&#xff0c;它…

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

LC1049. 最后一块石头的重量 II

代码随想录 class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for(int i : stones){sum i;}int target sum >> 1;int []dp new int[target1];for(int i 0 ; i < stones.length; i ){for(int j target ; j > stones[i] ; j --){dp[j] …

高度自适应scroll-view,uniapp项目

中间粉红的区域高度自适应,不管换什么机型&#xff0c;高度都自适应 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><te…

C++八股——STL相关

C的STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;包括以下六大主要组件&#xff1a; 容器&#xff08;Containers&#xff09;&#xff1a; vector&#xff1a;动态数组&#xff0c;支持随机访问和高效内存管理。 list&#xff1a;双向链表&a…

美国PPI降温影响深远,美易平台展望金融市场新动向

近期&#xff0c;美国生产者价格指数&#xff08;PPI&#xff09;的最新数据显示出超出市场预期的降温迹象&#xff0c;这一变化对全球金融市场产生了深远的影响。据美国劳工部1月12日周五公布的数据&#xff0c;12月份的PPI同比增长1%&#xff0c;不仅低于预期的1.3%&#xff…