Kafka偏移量管理全攻略:从基础概念到高级操作实战
#作者:猎人
文章目录
- 前言:
- 概念剖析
- kafka的两种位移
- 消费位移
- 消息的位移
- 位移的提交
- 自动提交
- 手动提交
- 1、使用--to-earliest重置消费组消费指定topic进度
- 2、使用--to-offset重置消费offset
- 3、使用--to-datetime策略指定时间重置offset
- 4、使用--to-current 重置offset
- 5、使用--shift-by 重置offset
- 6、使用--by-duration 重置offset
- 7、使用--from-file cvs文档重置offset
- 8、删除偏移量(--delete-offsets)
- 9、查询消费者成员信息(--members)
- 10、查询消费者组状态信息(--state)
- 11、查看topic指定分区offset的最大偏移量值(最新offsets)或最小值(--time)
- 12、查询topic的offset的范围(消费了多少条消息)
前言:
在Kafka Version为0.11.0.0之后,Consumer的Offset信息不再默认保存在Zookeeper上,而是选择用Topic的形式保存下来。在命令行中可以使用kafka-consumer-groups的脚本实现Offset的相关操作。kafka把位移保存在一个叫做__consumer_offsets的内部主题中,叫做位移主题。既然它也是主题,那么离不开分区和副本这两个机制。我们并没有手动创建这个主题并且指定,所以是kafka自动创建的,分区的数量取决于Broker 端参数 offsets.topic.num.partitions,默认是50个分区,而副本参数取决于offsets.topic.replication.factor,默认是3。
任何主题都会有消息,会存在消息格式。肯定也会有删除策略,否则消息会无限膨胀。但是位移主题的删除策略和其他主题删除策略又不太一样。我们知道普通主题的删除是可以通过配置删除时间或者大小的。而位移主题的删除,叫做 Compaction。Kafka 使用Compact 策略来删除位移主题中的过期消息,对于同一个 Key 的两条消息 M1 和 M2,如果 M1 的发送时间早于 M2,那么 M1 就是过期消息。Compact 的过程就是扫描日志的所有消息,剔除那些过期的消息,然后把剩下的消息整理在一起。
概念剖析
设置位移偏移量可分java api方式和命令方式2种,命令方式更方便简单。
kafka的两种位移
关于位移(Offset),其实在kafka里有两种位移:
-
分区位移:生产者向分区写入消息,每条消息在分区中的位置信息由一个叫offset的数据来表征。假设一个生产者向一个空分区写入了 10 条消息,那么这 10 条消息的位移依次是 0、1、…、9;
-
消费位移:消费者需要记录消费进度,即消费到了哪个分区的哪个位置上,这是消费者位移(Consumer Offset)。
注意,这和上面所说的消息在分区上的位移完全不是一个概念。上面的“位移”表征的是分区内的消息位置,它是不变的,即一旦消息被成功写入到一个分区上,它的位移值就是固定的了。而消费者位移则不同,它可能是随时变化的,毕竟它是消费者消费进度的指示器。
消费位移
消费位移,记录的是 Consumer 要消费的下一条消息的位移,切记,是下一条消息的位移! 而不是目前最新消费
消息的位移
假设一个分区中有 10 条消息,位移分别是 0 到 9。某个 Consumer 应用已消费了 5 条消息,这就说明该 Consumer 消费了位移为 0 到 4 的 5 条消息,此时 Consumer 的位移是 5,指向了下一条消息的位移。
至于为什么要有消费位移,很好理解,当 Consumer 发生故障重启之后,就能够从 Kafka 中读取之前提交的位移值,然后从相应的位移处继续消费,从而避免整个消费过程重来一遍。就好像书签一样,需要书签你才可以快速找到你上次读书的位置。
那么了解了位移是什么以及它的重要性,我们自然而然会有一个疑问,kafka是怎么记录、怎么保存、怎么管理位移的呢?
位移的提交
Consumer 需要上报自己的位移数据,这个汇报过程被称为位移提交。因为 Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即Consumer 需要为分配给它的每个分区提交各自的位移数据。
鉴于位移提交甚至是位移管理对 Consumer 端的巨大影响,KafkaConsumer API提供了多种提交位移的方法,每一种都有各自的用途,这些都是本文将要谈到的方案。
位移提交分为自动提交和手动提交;而手动提交又分为同步提交和异步提交。
自动提交
当消费配置enable.auto.commit=true的时候代表自动提交位移。
自动提交位移是发生在什么时候呢?auto.commit.interval.ms默认值是50000ms。即kafka每隔5s会帮你自动提交一次位移。自动位移提交的动作是在 poll()方法的逻辑里完成的,在每次真正向服务端发起拉取请求之前会检查是否可以进行位移提交,如果可以,那么就会提交上一次轮询的位移。假如消费数据量特别大,可以设置的短一点。越简单的东西功能越不足,自动提交位移省事的同时肯定会带来一些问题。自动提交带来重复消费和消息丢失的问题:
重复消费
在默认情况下,Consumer 每 5 秒自动提交一次位移。现在,我们假设提交位移之后的 3 秒发生了 Rebalance 操作。在 Rebalance 之后,所有 Consumer 从上一次提交的位移处继续消费,但该位移已经是 3 秒前的位移数据了,故在 Rebalance 发生前 3 秒消费的所有数据都要重新再消费一次。虽然你能够通过减少 auto.commit.interval.ms 的值来提高提交频率,但这么做只能缩小重复消费的时间窗口,不可能完全消除它。这是自动提交机制的一个缺陷。
消息丢失
假设拉取了100条消息,正在处理第50条消息的时候,到达了自动提交窗口期,自动提交线程将拉取到的每个分区的最大消息位移进行提交,如果此时消费服务挂掉,消息并未处理结束,但却提交了最大位移,下次重启就从100条那消费,即发生了50-100条的消息丢失。
手动提交
当消费配置enable.auto.commit=false的时候代表手动提交位移。用户必须在适当的时机(一般是处理完业务逻辑后),手动的调用相关api方法提交位移。
手动提交明显能解决消息丢失的问题,因为你是处理完业务逻辑后再提交的,假如此时消费服务挂掉,消息并未处理结束,那么重启的时候还会重新消费。
但是对于业务层面的失败导致消息未消费成功,是无法处理的。因为业务层的逻辑千变万化、比如格式不正确,你叫Kafka消费端程序怎么去处理?应该要业务层面自己处理,记录失败日志做好监控等。
另外手动提交不能解决消息重复的问题,也很好理解,假如消费0-100条消息,50条时挂了,重启后由于没有提交这一批消息的offset,是会从0开始重新消费。
手动提交又分为异步提交和同步提交。这个涉及业务java代码,略。
更新Offset的三个维度:Topic的作用域,重置策略,执行方案。
Topic的作用域:下面是kafka-consumer-groups.sh可携带的参数(下面命令执行时必须带–group groupname)
- –reset-offsets:重置消费组的偏移量。后面可接 --to-earliest --to-latest --xxxxx 等等等
- -–reset-offsets-by-duration:指定重置的时间(从现在往前)。
- -–reset-offsets-by-topic:指定重置的topic和partition。
- -–reset-offsets-by-times:指定重置的时间点。
- -–new-consumer:使用新消费者API。
- -–topic:指定要操作的topic。
- -–exclude-internal:不列出.kafka/*的topic。
- –all-topics:为consumer group下所有topic的所有分区调整位移。列出所有topic的所有消费组。
- –topic t1 --topic t2:为指定的若干个topic的所有分区调整位移
- –topic t1:0,1,2:为指定的topic分区调整位移,可单个分区、多个分区调整
- –to-earliest:把位移调整到分区当前最小位移。设置到最早位移处,也就是0。分区中第一条消息。
- –to-latest:把位移调整到分区当前最新位移。最后一个offset,即主题分区HW的位置(HW可理解为木桶原理的最低点)。分区中最后一条消息
- –to-current:把位移调整到分区当前位移。直接重置offset到当前的offset,也就是LOE。
- –to-offset <offset数值>: 把当前位移调整到指定位移处(偏移量),指定具体的位移位置。重置到指定的offset;
- –shift-by N: 把位移调整到当前位移 + N处,注意N可以是负数,表示向前移动。 基于当前位移向前回退多少。
- –to-datetime:将消费者的偏移量重置为大于或等于指定日期时间的最早偏移量。你需要提供符合yyyy-MM-ddTHH:mm:ss.xxx格式的日期时间。–to-datetime重置到指定时间的offset。把位移调整到大于给定时间的最早位移处,datetime格式是yyyy-MM-ddTHH:mm:ss.xxx,比如2017-08-04T00:00:00.000。DateTime 允许你指定一个时间,然后将位移重置到该时间之后的最早位移处。
- –by-duration :将消费者的偏移量重置为当前时间减去指定时长的位置。例如,P1D表示一天前,PT2H表示两小时前,PT3M表示3分钟前,PT5S表示5秒前。
- –from-file :从CSV文件中读取调整策略。根据CVS文档来重置。从CSV文件中读取重置策略。CSV文件应包含消费者组、主题和分区信息,以及相应的偏移量或时间戳。
执行方案
什么参数都不加:只是打印出位移调整方案,不具体执行
- –execute:执行真正的位移调整。
- –export:把位移调整方案按照CSV格式打印,方便用户成csv文件,供后续直接使用。
注意事项
- consumer group状态必须是inactive的,即不能是处于正在工作中的状态
- 不加执行方案,默认是只做打印操作
kafka-consumer-groups.sh可携带的其他参数:
- command-config:kafka的安全认证配置文件路径。
- group:指定要操作的消费组。
- describe:列出消费组的详情。
- delete:删除消费组。
- dry-run:仅输出要执行的操作,不实际运行。
kafka-run-class.sh可携带的其他参数:
运行kafka-run-class.sh脚本,调用kafka.admin.TopicCommand类,kafka.tools.DumpLogSegments类,kafka.tools.GetOffsetShell 类等等,同时接受一个操作指令参数。
该指令包括:
- create 创建topic
- alter 修改topic
- list 列举topic
- describe 描述topic
- delete 删除topic
- topic
- time //后接-1时表最大值,含义是-1时用来请求分区最新的offset --> 每个分区最大的offset。后接-2时表最小值,-2时用来请求分区最早有效的offset --> 例如,有些offset 在7(设置)天删除数据, 最早的0,但是最早有效的不一定是0 。后面也可接具体的timestamp,如–time 16423252638。
–broker-list //接kafka ip:9092 ,必须使用broker-list,不能使用–bootstrap-server
1、使用–to-earliest重置消费组消费指定topic进度
注意:设置offset前提是停止生产和消费的业务服务(如果所有topic是–all-topics,具体topic加 --topic)
重置某topic的offset。本命令可更新到当前group最初的offset位置,就是0
更新所有topic到当前最初的offset位置,即最早位置,就是CURRENT-OFFSET为0(如果是具体topic加 --topic).再次查询消费组消费状态发现CURRENT-OFFSET列都变0了
–group参数必须携带,指定消费组
]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --to-earliest --execute
案例二:
更新offset位置为0后,再次消费该topic全部消息,然后再次查询消费组情况,发现CURRENT-OFFSET恢复到正常消费位移状态了
2、使用–to-offset重置消费offset
简单查询消费组状态:
[root@kafka18 ~]# ./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.40.18:9092 --list --state
GROUP STATE
console-consumer-61774 Stable
复杂查询消费组状态
snapshot]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --all-groups --describe --state
在Kafka中,消费者组的状态可以是以下几种之一,只有Inactive才可以重置消费点位:
Stable:消费者组正在正常消费,没有任何重平衡操作正在进行。
Rebalancing:消费者组正在进行重平衡操作,此时不能执行偏移量重置。
Joining:新的消费者正在加入消费者组。
PreparingRebalance:消费者组即将进行重平衡。
Syncing:消费者组正在进行同步操作,通常发生在重平衡之后。
需要先查询消费组等信息,client id这列为‘-’,才可执行重置命令(即设置offset前提是停止生产、消费的业务服务)。–to-offset <offset新数值>: 把当前位移调整到指定位移处
如果是具体topic加 --topic。调具体分区加–topic topic_name:0,1,2,可单分区、多分区调整
]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --to-offset 500000 --execute
往高调验证:发现只有25这个执行成功了
往低调验证:
如果往低调值,都符合值的要求,则都执行成功。
按照具体分区调整案例:zgdx是topic名称,0是分区号,用冒号分开,属于固定语法。可单个分区、多个分区调整
3、使用–to-datetime策略指定时间重置offset
DateTime 允许你指定一个时间点,然后将位移重置到该时间之后的最早位移处。
所有topic的offset设置到指定时刻开始,如果指定时间太早,发现当前位移是0(当前CURRENT-OFFSET)(如果是具体topic加 --topic)
需要注意这个–to-datetime使用UTC伦敦时间,后必须接伦敦时间
命令案例
]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --to-datetime 2024-06-14T09:30:00.000 --execute
因为服务器使用纽约时间,我们操作如,纽约时间2025-01-6T01:35:00.000时下面偏移量为120分区的偏移量分别为688。纽约时间2025-01-6T01:37:00.000时偏移量为120分区的偏移量分别为799。
当我们使用伦敦时间2025-01-6T06:35:00.000,也就是说纽约时间的06:35就是纽约时间的01:35,所以设置06:35的偏移量为688
可以看到我们再次设置纽约时间01:37时偏移量确实为799
4、使用–to-current 重置offset
更新所有topic到当前offset位置。但执行后当前任何位移都不会变动
]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --to-current --execute
5、使用–shift-by 重置offset
所有topic的CURRENT-OFFSET的offset位置按设置的值进行位移,向前移动10(即减10)。如果是具体topic加 --topic
]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --shift-by -10 --execute
–shift-by接调整的位移数量,接±值,使用加时+号可省略。-为减去CURRENT-OFFSET值。
向前移动案例:
可以看出如果CURRENT-OFFSET值不够减,CURRENT-OFFSET立刻归0。如果再次加位移值,则再下面方框基础上全部加值
6、使用–by-duration 重置offset
将所有分区位移调整为多少时间之前的最早位,可按照天、时、分、秒单位位移。例如,P1D表示1天前,PT2H表示两小时前,PT3M表示3分钟前,PT5S表示5秒前。
案例如:将所有分区位移调整为3分钟之前的最早位移
./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --reset-offsets --all-topics --by-duration PT3M --execute
7、使用–from-file cvs文档重置offset
通过cvs文档配置消费组”name”的”testTopic”上的所有分区的偏移量为10000
offsets.cvs格式为:Topic,分区号,偏移量 testTopic,0,10000
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group name --reset-offsets --from-file offsets.cvs --execute
8、删除偏移量(–delete-offsets)
能够执行成功的一个前提是 消费组这会是不可用状态; 偏移量被删除了之后,Consumer Group下次启动的时候,会从头消费; 将消费组console-consumer-20733的topic上的所有分区的偏移量删除
shot]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --topic aaa --delete-offsets
Request succeed for deleting offsets with topic aaa group console-consumer-20733
TOPIC PARTITION STATUS
aaa 0 Successful
aaa 1 Successful
aaa 2 Successful
再次查询该消费组,发现查不到了
[root@localhost local]# /usr/local/kafka_2.13-2.7.1/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --group console-consumer-20733 --describe
Error: Consumer group 'console-consumer-20733' does not exist.
操作案例二:
9、查询消费者成员信息(–members)
查询消费者成员:
snapshot]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --all-groups --describe --members
Consumer group 'console-consumer-20733' has no active members.
GROUP CONSUMER-ID HOST CLIENT-ID #PARTITIONS
test-consumer-group consumer-test-consumer-group-1-bc47e46d-1a55-4e85-a383-41aa345d13e4 /192.168.40.14 consumer-test-consumer-group-1 3
10、查询消费者组状态信息(–state)
参数解释:
STATE:消费者组的状态。常见的状态有:
Stable:所有成员都已经成功加入了该组,并且正在进行正常的消费。
PreparingRebalance:组正在准备进行再平衡操作,此时消费者可能暂时停止消费。
CompletingRebalance:再平衡过程即将完成,消费者正重新分配分区。
Dead:消费者组不再活跃,可能是因为所有成员都已离开或崩溃。
Empty:组存在但没有任何活动成员。
MEMBERS:当前属于该消费者组的成员数量。
简单查询:
[root@kafka18 ~]# ./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.40.18:9092 --list --state
GROUP STATE
console-consumer-61774 Stable
复杂查询
snapshot]# ./kafka-consumer-groups.sh --bootstrap-server 192.168.40.11:9092 --all-groups --describe --state
Consumer group ‘console-consumer-20733’ has no active members.
GROUP COORDINATOR (ID) ASSIGNMENT-STRATEGY STATE #MEMBERS
console-consumer-20733 192.168.40.18:9092 (18) Empty 0
GROUP COORDINATOR (ID) ASSIGNMENT-STRATEGY STATE #MEMBERS
test-consumer-group 192.168.40.11:9092 (11) range Stable 1
11、查看topic指定分区offset的最大偏移量值(最新offsets)或最小值(–time)
必须用–broker-list 参数,指定任何ip输出结果一样。
time为-1时表最大偏移量值(最新offsets),为-2时表偏移量最小值,即起始偏移量,一般都为0。
–time 1589300000000表示时间戳,数字为具体时间戳。
bin]# ./kafka-run-class.sh kafka.tools.GetOffsetShell --topic aaa --time -1 --broker-list 192.168.40.11:9092
aaa:0:13
aaa:1:9
aaa:2:11]# ./kafka-run-class.sh kafka.tools.GetOffsetShell --topic aaa --time -1 --broker-list 192.168.40.11:9092 --partitions 0
aaa:0:13
经查询消费组消费情况证实,查看偏移量,最大offset确实是13
补充
12、查询topic的offset的范围(消费了多少条消息)
查询offset最小值,即起始偏移量:-2代表最小值
./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic testTopic --time -2
查询offset最大值:-1代表最大值
aaa为topic名称,中间列为该topic分区号,有3个分区。最后一列代表该topic的该分区最新偏移量,即LOG-END,不是消费了多少的偏移量。从查询结果看,符合上述截图内容
]# ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic aaa --time -1 --broker-list 192.168.40.14:9092
aaa:0:11
aaa:1:9
aaa:2:10
相关文章:
Kafka偏移量管理全攻略:从基础概念到高级操作实战
#作者:猎人 文章目录 前言:概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…...
python中使用日期和时间差:datetime模块
datetime模块的表示时间的有 datetime.datetime #时间包含年月日时分秒毫秒 datetime.date #时间只包含年月日 datetime.time #只包含时分秒 获取当前时间 import datetime now datetime.datetime.now() print(now)得到 atetime中的年月日时分秒可以分别取出来 import da…...
申论对策建议类【2022江苏B卷第一题“如何开展网络直播”】
材料: 近年来,公安交管部门通过网络直播,将执法过程和执法细节以视频形式呈现在公众面前,吸引“围观”、组织点评,让执法过程变成一堂生动的法治公开课。 “各位网友,大家好!这里是‘全国交通…...
Blazor-父子组件传递任意参数
在我们从父组件传参数给子组件时,可以通过子组件定义的[Parameter]特性的公开属性进行传值,但是当我们需要传递多个值的时候,就需要通过[Parameter]特性定义多个属性,有没有更简便的方式? 我们可以使用定义 IDictionar…...
Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…...
win11安装wsl报错:无法解析服务器的名称或地址(启用wsl2)
1. 启用wsl报错如下 # 查看可安装的 wsl --install wsl --list --online此原因是因为没有开启DNS的原因,所以需要我们手动开启DNS。 2. 按照如下配置即可 Google的DNS(8.8.8.8和8.8.4.4) 全国通用DNS地址 (114.114.114.114) 3. 运行以下命令来重启 WSL…...
【设计模式】【结构型模式】桥接模式(Bridge)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
1997-2019年各省进出口总额数据
1997-2019年各省进出口总额数据 1、时间:1997-2020年 2、来源:国家统计局、各省年鉴 3、指标:进出口总额 4、范围:31省 5、指标解释:进出口总额是指以货币表示的一定时期内一国实际进出口商品的总金额ÿ…...
AI前端开发效率革命:拥抱AI,开启前端开发新纪元
前端开发行业竞争日益激烈,项目交付周期不断缩短,对开发效率的要求也越来越高。在这种高压环境下,开发者们常常面临着巨大的压力。而近年来,人工智能技术的飞速发展,特别是AI写代码工具的出现,为前端开发带…...
Rust编程语言入门教程(一)安装Rust
目录 引言一、为什么要用 Rust?二、与其他语言比较三、Rust 特别擅长的领域四、Rust 与 Firefox五、Rust 的用户和案例六、Rust 的优缺点七、安装 Rust1、访问官网下载 Rust2、下载完成,执行exe文件 八、Rust 安装验证九、开发工具结束语 引言 在当今快…...
Kubernetes控制平面组件:Kubernetes如何使用etcd
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)
1.题目描述 2.思路 思路1: 做两轮排序,第一轮排序找到最小的那个数,然后再判断最小的那个数之后还有其他数吗,如果有在进行排序,选出最大的那个数,然后值相减。 问题要点: (1)你需要…...
LabVIEW 中的 3dgraph.llb 库
3dgraph.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中用于 3D 图形相关操作的重要库。它为 LabVIEW 用户提供了丰富的功能,能在应用程序中创建、显示和交互各种 3D 图形,…...
通过VSCode直接连接使用 GPT的编程助手
GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...
[LeetCode力扣hot100]-C++常用数据结构
0.Vector 1.Set-常用滑动窗口 set<char> ans;//根据类型定义,像vector ans.count()//检查某个元素是否在set里,1在0不在 ans.insert();//插入元素 ans.erase()//删除某个指定元素 2.栈 3.树 树是一种特殊的数据结构,力扣二叉树相…...
2-安装YIUI
YIUI框架:GitHub - LiShengYang-yiyi/YIUI: Unity3D UGUI Framework, 基于UI数据事件绑定为核心 数据驱动的UGUI框架, ETUI框架, ET框架官方推荐UI框架 ET框架:egametang/ET: Unity3D Client And C# Server Framework (github.com) 1 - 安装YIUI框架&a…...
16-使用QtChart创建动态图表:入门指南
QtChart是Qt框架中的一个强大模块,用于创建各种类型的图表,如折线图、柱状图、饼图等。它提供了丰富的API和灵活的配置选项,使得开发者能够轻松地将数据可视化集成到应用程序中。本文将介绍如何使用QtChart创建一个简单的动态折线图ÿ…...
蓝耘智算携手DeepSeek,共创AI未来
🌟 各位看官号,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习如何通过蓝耘智算使用DeepSeek R1模型 👍 如果觉得这篇文章有帮助,欢迎您一键三连&a…...
具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例
随着机器人技术和人工智能的迅速发展,具身智能在各行业的应用日益广泛,尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作,存在着高温、高压、强电磁场等危险环境,且效率较低。开关柜带电操作机器人作…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】
引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…...
【R语言】回归分析与判别分析
一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系…...
git开发流程以及github社区企业版
常规开发流程 1、将仓库 clone 到本地,已经 clone 的要 fetch & pull,保证本地 master 分支已经更新到最新状态 2、在 master 最新分支的基础上 checkout 一个开发分支,分支命名要求规范,如带用户名、日期、bug id 等关键信…...
DeepSeek + Vue实战开发
利用DeepSeek V3模型、siliconflow大模型一站式云服务平台以及vue3.0实现一个在线人工智能客服对话系统。 因为deepseek官网的api密钥使用起来比较缓慢,所以可以使用第三方的,具体操作请自行查阅资料。 siliconflow官网 SiliconFlow, Accelerate AGI …...
从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会
附录:所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...
Python编程中,async/await/asyncio分别是干啥的?
在Python异步编程中,async、await和asyncio是三个核心概念。它们共同构成了Python处理高并发I/O密集型任务的解决方案。本文将通过代码实例解析它们的作用和用法。 一、异步编程基础 1.1 同步 vs 异步 同步编程:代码按顺序执行,遇到I/O操作(如网络请求、文件读写)时会阻塞…...
vue非组件的初学笔记
1.创建Vue实例,初始化渲染的核心 准备容器引包创建Vue实例new Vue() el用来指定控制的盒子data提供数据 2.插值表达式 作用利用表达式插值,将数据渲染到页面中 格式{{表达式}} 注意点 表达式的数据要在data中存在表达式是可计算结果的语句插值表达式…...
4.3 学习UVM中的“run_phase“,将其应用到具体案例分为几步?
文章目录 前言1. run_phase 的作用与执行特点2. 关键组件的 run_phase 实现2.1 Driver 的 run_phase:驱动事务2.2 Monitor 的 run_phase:捕获事务2.3 Scoreboard 的 run_phase:数据比对 3. 同步与 Objection 管理3.1 控制仿真结束3.2 多组件协…...
[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…...
【C语言】有序数组的平方
文章目录 给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 #include<stdio.h>/*** brief 计算一个整数数组的平方,并按非递减顺序存放结果* * 该函数接受一个整数数组arr和其长度le…...
osgearth视点坐标及鼠标交点坐标的信息显示(七)
核心函数如下: void COSGObject::addViewPointLabel() {//mRoot->addChild(osgEarth::Util::Controls::ControlCanvas::get(mViewer));//放开这句,球就卡住了。 为什么,shitosgEarth::Util::Controls::ControlCanvas* canvas = osgEarth::Util::Controls::ControlCanvas…...
【096】基于51单片机红外线人数统计系统【Proteus仿真+Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统LCD1602液晶显示两路E18-D80NK红外线传感器DS1302时钟芯片AT24C02存储芯片蜂鸣器LED灯按键设置。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片; 2、采用DS1302时钟芯片实现对日期和时间的计时,并…...
【ENSP】链路聚合的两种模式
【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大,人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中,为…...
机器学习_17 K近邻算法知识点总结
K近邻算法(K-Nearest Neighbors,KNN)是一种简单而直观的机器学习算法,广泛应用于分类和回归任务。它通过寻找训练集中与新样本最接近的K个样本(近邻)来进行预测。今天,我们就来深入探讨K近邻算法…...
Web 后端 请求与响应
一 请求响应 1. 请求(Request) 客户端向服务器发送的HTTP请求,通常包含以下内容: 请求行:HTTP方法(GET/POST等)、请求的URL、协议版本。 请求头(Headers):…...
网络工程师 (44)ARP协议
前言 ARP协议,即地址解析协议(Address Resolution Protocol),是一种网络协议,主要用于将网络层的IPv4地址(逻辑地址)解析为链路层的物理地址(通常是MAC地址)。 一、基本概…...
使用verilog 实现 cordic 算法 ----- 旋转模式
1-设计流程 ● 了解cordic 算法原理,公式,模式,伸缩因子,旋转方向等,推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现,注意…...
搜狗浏览器卸载教程
需求背景 今天发现geek居然无法卸载搜狗浏览器,作为一个老司机,这是不允许的。如果你使用geek或者windows的卸载,或者直接在它的安装包的Uninstall.exe中卸载,他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…...
ES7 (ES2016) 新特性
目录 Array.prototype.includes()指数运算符与 ES6 的对比实际应用场景最佳实践 Array.includes() 基本语法 array.includes(searchElement[, fromIndex])特点 返回布尔值可以检测 NaN支持可选的 fromIndex 参数比 indexOf() 更语义化 使用示例 const numbers [1, 2, 3…...
设计模式13:职责链模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者链传递,直到有一个处理者能够处理该请求。这种模式通过…...
MongoDB between ... and ... 操作
个人博客地址:MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法: db.collection.find( { field: { $gt: value1, $lt: value2 } } );...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_alloc函数
ngx_alloc 声明在 src\os\unix\ngx_alloc.h 中: void *ngx_alloc(size_t size, ngx_log_t *log); 定义在 src\os\unix\ngx_alloc.c 中: void * ngx_alloc(size_t size, ngx_log_t *log) {void *p;p malloc(size);if (p NULL) {ngx_log_error(NGX_LOG_…...
总结:Helm 命令详解
文章目录 1. Helm 概述2. Helm 的安装与配置2.1 安装 Helm2.2 验证安装 3、Helm 的常用命令3.1 查看帮助3.2 查看 Chart 列表3.3 安装 Chart3.4 卸载 Chart3.5 升级 Chart3.6 回滚 Chart3.7 查看 Chart 详细信息3.8 查看 Chart 的模板3.9 查看 Chart 的值3.10 管理仓库 4. Helm…...
通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!
欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中,你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码,但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释: 一、数字含义&…...
【鸿蒙ArcTS】TypeScript学习记录:函数类型声明与箭头函数
普通函数 function add(x: number, y: number): number {return x y; } 完整未省略版本 const add: (x: number, y: number) > void//函数类型(x: number, y: number): void > {//函数定义console.log("object"); };函数类型: type trigFunc…...
基于 Python 和 Django 的北极星招聘数据可视化系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
机器学习_18 K均值聚类知识点总结
K均值聚类(K-means Clustering)是一种经典的无监督学习算法,广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇,使得簇内相似度高而簇间相似度低。今天,我们就来深入探讨K均值聚类的原理、实现和应用…...
LTE参数
RSRP(Reference Singnal Received Power,参考信号接收功率) 是终端接收到的小区公共参考信号(CRS)功率值,数值为测量带宽内单个RE功率的线性平均值,反映的是本小区有用信号的强度。 SINR(SignaltoInterference&Noise Ratio,…...
Word写论文常用操作的参考文章
1.插入多个引用文献:word中交叉引用多篇参考文献格式[1-2]操作以及显示错误问题 更改左域名,输入 \#"[0" 更改右域名,输入 \#"0]" 2.插入题注:word 中添加图片题注、目录、内部链接 3.插入公式编号&#x…...
kubectl exec 实现的原理
kubectl exec 是 Kubernetes 提供的一个命令,它允许你在指定的 Pod 中执行命令,类似于在容器中打开一个终端会话。这个功能对于调试、监控和管理容器化应用非常有用。kubectl exec 的实现涉及到多个 Kubernetes 组件和机制,包括 API Server、…...
apache artemis安装
安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install...