慕了,我要是早点看到这篇写 Kafka 的分区管理的文章就好了

news2024/11/17 9:55:19

Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力。

顺便说一句,由于消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高(引用Apache Kafka – A High Throughput Distributed Messaging System的观点),是Kafka高吞吐率的重要保证之一。

一、副本机制

由于Producer和Consumer都只会与Leader角色的分区副本相连,所以kafka需要以集群的组织形式提供主题下的消息高可用。kafka支持主备复制,所以消息具备高可用和持久性。

一个分区可以有多个副本,这些副本保存在不同的broker上。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。

在通常情况下,增加分区可以提供kafka集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 
 

itcast@Server-node:/mnt/d/kafka_2.12-2.2.1$ bin/kafka-topics.sh --describe -- zookeeper localhost:2181 --topic heima // hema这个主题有三个分区,一个副本同处在一个节点当中 Topic:heima PartitionCount:3 ReplicationFactor:1 Configs: Topic: heima Partition: 0 Leader: 0 Replicas: 0 Isr: 0 Topic: heima Partition: 1 Leader: 0 Replicas: 0 Isr: 0 Topic: heima Partition: 2 Leader: 0 Replicas: 0 Isr: 0

二、分区Leader选举

可以预见的是,如果某个分区的Leader挂了,那么其它跟随者将会进行选举产生一个新的leader,之后所有的读写就会转移到这个新的Leader上,在kafka中,其不是采用常见的多数选举的方式进行副本的Leader选举,而是会在Zookeeper上针对每个Topic维护一个称为 ISR(in-sync replica,已同步的副本) 的集合,显然还有一些副本没有来得及同步。只有这个ISR列表里面的才有资格成为leader( 先使用ISR里面的第一个,如果不行依次类推,因为ISR里面的是同步副本,消息是最完整且各个节点都是一样的 )。 通过ISR,kafka需要的冗余度较低,可以容忍的失败数比较高。假设某个topic有f+1个副本,kafka可以容忍f个不可用,当然,如果全部ISR里面的副本都不可用,也可以选择其他可用的副本,只是存在数据的不一致。

三、分区重新分配

我们往已经部署好的Kafka集群里面添加机器是最正常不过的需求,而且添加起来非常地方便,我们需要做的事是从已经部署好的Kafka节点中复制相应的配置文件,然后把里面的broker id修改成全局唯一的,最后启动这个节点即可将它加入到现有Kafka集群中。

但是问题来了,新添加的Kafka节点并不会自动地分配数据,所以无法分担集群的负载,除非我们新建一个topic。但是现在我们想手动将部分分区移到新添加的Kafka节点上,Kafka内部提供了相关的工具来重新分布某个topic的分区。

具体步骤

  • 第一步:我们创建一个有三个节点的集群,详情可查看第九章集群的搭建

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-topics.sh --create -- zookeeper localhost:2181 --topic heima-par --partitions 3 --replication-factor 3 Created topic heima-par.

详情查看

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima -par Topic:heima-par PartitionCount:3 ReplicationFactor:3 Configs: Topic: heima-par Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0 Topic: heima-par Partition: 1 Leader: 0 Replicas: 0,2,1 Isr: 0 Topic: heima-par Partition: 2 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2 itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$

从上面的输出可以看出heima-par这个主题一共有三个分区,有三个副本

  • 第二步:主题heima-par再添加一个分区

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-topics.sh --alter -- zookeeper localhost:2181 --topic heima-pa r --partitions 4 WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected Adding partitions succeeded!

查看详情已经变成4个分区

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima -par Topic:heima-par PartitionCount:4 ReplicationFactor:3 Configs: Topic: heima-par Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0 Topic: heima-par Partition: 1 Leader: 0 Replicas: 0,2,1 Isr: 0 Topic: heima-par Partition: 2 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2 Topic: heima-par Partition: 3 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0

这样会导致broker2维护更多的分区

  • 第三步:再添加一个broker节点

查看主题信息

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima -par Topic:heima-par PartitionCount:4 ReplicationFactor:3 Configs: Topic: heima-par Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0 Topic: heima-par Partition: 1 Leader: 0 Replicas: 0,2,1 Isr: 0 Topic: heima-par Partition: 2 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2 Topic: heima-par Partition: 3 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0

从上面输出信息可以看出新添加的节点并没有分配之前主题的分区

  • 第四步:重新分配

现在我们需要将原先分布在broker 1-3节点上的分区重新分布到broker 1-4节点上,借助 kafka-reassign-partitions.sh工具生成reassign plan,不过我们先得按照要求定义一个文件,里面说明哪些topic需要重新分区,文件内容如下:

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ cat reassign.json { "topics":[{"topic":"heima-par"}], "version":1 }

然后使用 kafka-reassign-partitions.sh 工具生成reassign plan

然后执行脚本 bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to -move-json-file reassign.json --broker-list "0,1,2,3" --generate

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-reassign- partitions.sh --zookeeper localhost:2181 --topics-to -move-json-file reassign.json --broker-list "0,1,2,3" --generate Current partition replica assignment {"version":1,"partitions":[{"topic":"heima-par","partition":2,"replicas": [1,0,2],"log_dirs":["any","any","any"]}, {"topic":"heima- par","partition":1,"replicas":[0,2,1],"log_dirs":["any","any","any"]}, {"topic":"heima-par","partition":0,"replicas":[2,1,0],"log_dirs": ["any","any","any"]}, {"topic":"heima-par","partition":3,"replicas": [2,1,0],"log_dirs":["any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"heima-par","partition":0,"replicas": [1,2,3],"log_dirs":["any","any","any"]}, {"topic":"heima- par","partition":2,"replicas":[3,0,1],"log_dirs":["any","any","any"]}, {"topic":"heima-par","partition":1,"replicas":[2,3,0],"log_dirs": ["any","any","any"]}, {"topic":"heima-par","partition":3,"replicas": [0,1,2],"log_dirs":["any","any","any"]}]}

上面命令中

--generate 表示指定类型参数

--topics-to-move-json-file 指定分区重分配对应的主题清单路径

注意: 命令输入两个Json字符串,第一个JSON内容为当前的分区副本分配情况,第二个为重新分配的候选方案,注意这里只是生成一份可行性的方案,并没有真正执行重分配的动作。

我们将第二个JSON内容保存到名为result.json文件里面(文件名不重要,文件格式也不一定要以json为结尾,只要保证内容是json即可),然后执行这些reassign plan:

重新分配JSON文件

 
 

{ "version": 1, "partitions": [ { "topic": "heima-par", "partition": 0, "replicas": [ 1,2,3 ], "log_dirs": [ "any", "any", "any" ] },{ "topic": "heima-par", "partition": 2, "replicas": [ 3,0,1 ], "log_dirs": [ "any", "any", "any" ] },{ "topic": "heima-par", "partition": 1, "replicas": [ 2,3,0 ], "log_dirs": [ "any", "any", "any" ] },{ "topic": "heima-par", "partition": 3, "replicas": [ 0,1,2 ], "log_dirs": [ "any", "any", "any" ] } ] }

执行分配策略

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-reassign- partitions.sh --zookeeper localhost:2181 --reassignm ent-json-file result.json --execute Current partition replica assignment {"version":1,"partitions":[{"topic":"heima-par","partition":2,"replicas": [1,0,2],"log_dirs":["any","any","any"]}, {"topic":"heima- par","partition":1,"replicas":[0,2,1],"log_dirs":["any","any","any"]}, {"topic":"heima-par","partition":0,"replicas":[2,1,0],"log_dirs": ["any","any","any"]}, {"topic":"heima-par","partition":3,"replicas": [2,1,0],"log_dirs":["any","any","any"]}]} Save this to use as the --reassignment-json-file option during rollback Successfully started reassignment of partitions.

查看分区重新分配的进度:

 
 

itcast@Server-node:/mnt/d/kafka-cluster/kafka-1$ bin/kafka-reassign- partitions.sh --zookeeper localhost:2181 --reassignment-json-file result.json -- verify Status of partition reassignment: Reassignment of partition heima-par-3 completed successfully Reassignment of partition heima-par-0 is still in progress Reassignment of partition heima-par-2 is still in progress Reassignment of partition heima-par-1 is still in progress

从上面信息可以看出 heima-par-3已经完成,其他三个正在进行中。

四、修改副本因子

场景

实际项目中我们可能在创建topic时没有设置好正确的replication-factor,导致kafka集群虽然是高可用的,但是该topic在有broker宕机时,可能发生无法使用的情况。topic一旦使用又不能轻易删除重建,因此动态增加副本因子就成为最终的选择。

说明:kafka 1.0版本配置文件默认没有 default.replication.factor=x, 因此如果创建topic时,不指定– replication-factor 想, 默认副本因子为1. 我们可以在自己的server.properties中配置上常用的副本因子,省去手动调整。例如设置 default.replication.factor=3

首先我们配置topic的副本,保存为json文件

 
 

{ "version":1, "partitions":[ {"topic":"heima","partition":0,"replicas":[0,1,2]}, {"topic":"heima","partition":1,"replicas":[0,1,2]}, {"topic":"heima","partition":2,"replicas":[0,1,2]} ] }

然后执行脚本 bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file replication-factor.json --execute

 
 

itcast@Server-node:/mnt/d/kafka_2.12-2.2.1$ bin/kafka-reassign-partitions.sh -- zookeeper localhost:2181 --reassignment-json-file replication-factor.json -- execute Current partition replica assignment {"version":1,"partitions":[{"topic":"topic0703","partition":1,"replicas": [1,0],"log_dirs":["any","any"]}, {"topic":"topic0703","partition":0,"replicas": [0,1],"log_dirs":["any","any"]}, {"topic":"topic0703","partition":2,"replicas": [2,0],"log_dirs":["any","any"]}]} Save this to use as the --reassignment-json-file option during rollback Successfully started reassignment of partitions.

验证

 
 

itcast@Server-node:/mnt/d/kafka_2.12-2.2.1$ bin/kafka-topics.sh --describe -- zookeeper localhost:2181 --topic topic0703 Topic:topic0703 PartitionCount:3 ReplicationFactor:3 Configs: Topic: topic0703 Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0 Topic: topic0703 Partition: 1 Leader: 1 Replicas: 0,1,2 Isr: 1,0 Topic: topic0703 Partition: 2 Leader: 2 Replicas: 0,1,2 Isr: 2,0

五、分区分配策略

按照Kafka默认的消费逻辑设定,一个分区只能被同一个消费组(ConsumerGroup)内的一个消费者消费。假设目前某消费组内只有一个消费者C0,订阅了一个topic,这个topic包含7个分区,也就是说这个消费者C0订阅了7个分区,参考下图

编辑切换为居中

添加图片注释,不超过 140 字(可选)

此时消费组内又加入了一个新的消费者C1,按照既定的逻辑需要将原来消费者C0的部分分区分配给消费者C1消费,情形上图(2),消费者C0和C1各自负责消费所分配到的分区,相互之间并无实质性的干扰。

接着消费组内又加入了一个新的消费者C2,如此消费者C0、C1和C2按照上图(3)中的方式各自负责消费所分配到的分区。

如果消费者过多,出现了消费者的数量大于分区的数量的情况,就会有消费者分配不到任何分区。参考下图,一共有8个消费者,7个分区,那么最后的消费者C7由于分配不到任何分区进而就无法消费任何消息。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面各个示例中的整套逻辑是按照Kafka中默认的分区分配策略来实施的。Kafka提供了消费者客户端参数 partition.assignment.strategy用来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为:org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka中还提供了另外两种分配策略: RoundRobinAssignor和StickyAssignor。消费者客户端参数partition.asssignment.strategy可以配置多个分配策略,彼此之间以逗号分隔。

1.RangeAssignor分配策略

参考源码: org.apache.kafka.clients.consumer.RangeAssignor

RangeAssignor策略 的原理是 按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。 对于每一个topic, RangeAssignor策略会将消费组内所有订阅这个topic的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

假设n=分区数/消费者数量,m=分区数%消费者数量,那么前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。

假设消费组内有2个消费者C0和C1,都订阅了主题t0和t1,并且每个主题都有4个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t0p3、t1p0、t1p1、t1p2、t1p3。最终的分配结果为:

 
 

消费者C0:t0p0、t0p1、t1p0、t1p1 消费者C1:t0p2、t0p3、t1p2、t1p3

假设上面例子中2个主题都只有3个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最终的分配结果为:

 
 

消费者C0:t0p0、t0p1、t1p0、t1p1 消费者C1:t0p2、t1p2

可以明显地看到这样的分配并不均匀,如果将类似的情形扩大,有可能会出现部分消费者过载的情况。

2.RoundRobinAssignor分配策略

参考源码: org.apache.kafka.clients.consumer.RoundRobinAssignor

RoundRobinAssignor策略 的原理是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,然后通过轮询方式逐个将分区以此分配给每个消费者。 RoundRobinAssignor策略对应的 partition.assignment.strategy参数值为: org.apache.kafka.clients.consumer.RoundRobinAssignor。

假设消费组中有2个消费者C0和C1,都订阅了主题t0和t1,并且每个主题都有3个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最终的分配结果为:

 
 

消费者C0:t0p0、t0p2、t1p1 消费者C1:t0p1、t1p0、t1p2

如果同一个消费组内的消费者所订阅的信息是不相同的,那么在执行分区分配的时候就不是完全的轮询分配,有可能会导致分区分配的不均匀。如果某个消费者没有订阅消费组内的某个topic,那么在分配分区的时候此消费者将分配不到这个topic的任何分区。

假设消费组内有3个消费者C0、C1和C2,它们共订阅了3个主题:t0、t1、t2,这3个主题分别有1、2、 3个分区,即整个消费组订阅了t0p0、t1p0、t1p1、t2p0、t2p1、t2p2这6个分区。具体而言,消费者C0订阅的是主题t0,消费者C1订阅的是主题t0和t1,消费者C2订阅的是主题t0、t1和t2,那么最终的分配结果为:

 
 

消费者C0:t0p0 消费者C1:t1p0 消费者C2:t1p1、t2p0、t2p1、t2p2

可以看到RoundRobinAssignor策略也不是十分完美,这样分配其实并不是最优解,因为完全可以将分区t1p1分配给消费者C1。

3.StickyAssignor分配策略

参考源码: org.apache.kafka.clients.consumer.StickyAssignor

Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的:

分区的分配要尽可能的均匀; 分区的分配尽可能的与上次分配的保持相同。

当两者发生冲突时,第一个目标优先于第二个目标。鉴于这两个目标,StickyAssignor策略的具体实现要比RangeAssignor和RoundRobinAssignor这两种分配策略要复杂很多。

假设消费组内有3个消费者:C0、C1和C2,它们都订阅了4个主题:t0、t1、t2、t3,并且每个主题有2个分区,也就是说整个消费组订阅了t0p0、t0p1、t1p0、t1p1、t2p0、t2p1、t3p0、t3p1这8个分区。最终的分配结果如下:

 
 

消费者C0:t0p0、t1p1、t3p0 消费者C1:t0p1、t2p0、t3p1 消费者C2:t1p0、t2p1

如分配结果所示,RoundRobinAssignor策略会按照消费者C0和C2进行重新轮询分配。而如果此时使用的是StickyAssignor策略,那么分配结果为:

 
 

消费者C0:t0p0、t1p1、t3p0、t2p0 消费者C2:t1p0、t2p1、t0p1、t3p1

可以看到分配结果中保留了上一次分配中对于消费者C0和C2的所有分配结果,并将原来消费者C1的“负担”分配给了剩余的两个消费者C0和C2,最终C0和C2的分配还保持了均衡。

4.自定义分配策略

需实现: org.apache.kafka.clients.consumer.internals.PartitionAssignor

继承自: org.apache.kafka.clients.consumer.internals.AbstractPartitionAssignor

总结

这篇讲解了对分区及副本的一系列操作,如分区副本机制、分区重新分配、修改副本因子等。

                                 资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

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

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

相关文章

可以做抽奖活动的微信小程序在哪里做_分享抽奖活动小程序制作步骤

越来越多的企业开始了解微信抽奖游戏的实用性和价值,因为用户更喜欢简单有趣的游戏抽奖方式,如大转盘、摇一摇、抢福袋、砸金蛋、摇一摇、刮刮卡等互动抽奖游戏。 如果企业想制作这种抽奖游戏,都倾向使用市场上的各种抽奖制作软件&#xff0c…

(Java)车厢重组

车厢重组一、题目描述二、输入格式三、输出格式四、样例(1)样例输入(2)样例输出五、正确代码六、思路一、题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最…

网络技术——网络运维工程师必会的网络知识(2)(详细讲解)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 网络传输介质 信号分类和失真 双绞线分类: 双绞线…

非计算机专业,可以学好编程吗?

现在IT行业越来越火热,想要学习编程的人也越来越多。IT行业的薪资连续好几年赶超金融行业,位居行业之首,有太多人转行跨界,想要进入这个领域,那么作为初学者的你,是不是也很困惑,非科班&#xf…

Web入门开发【四】- 基础语言

欢迎来到霍大侠的小院,我们来学习Web入门开发的系列课程。 首先我们来了解下这个课程能学到什么? 1、你将可以掌握Web网站的开发全过程。 2、了解基础的HTML,CSS,JavaScript语言。 3、开发自己的第一个网站。 4、认识很多对编…

Java笔记之多线程(一)

文章目录前言一、什么是进程与线程?1.进程2.线程3.其他相关概念二、如何创建线程1.继承Thread类,重新run方法2.实现Runnable接口3.通过Callable和Future创建线程4. 继承Thread vs实现Runnable的区别三、用户线程和守护线程守护线程的使用设置成守护线程四…

【Python百日进阶-数据分析】Day137 - plotly旭日图:go.sunburst()实例

文章目录4.2 带有 go.Sunburst 的基本旭日图4.2.1 基本go.sunburst()旭日图4.2.2 带有重复标签的旭日图4.2.3 分支值4.2.4 大量切片4.2.5 控制旭日形扇区内的文本方向4.2.6 使用 uniformtext 控制文本字体大小4.2.7 具有连续色标的旭日图4.2.8 Dash中的go.sunburst()4.2 带有 g…

Android hilt 依赖注入使用详解

文章目录官方文档添加依赖初始化hiltMainActivity 使用共享类在 MainActivity 添加依赖注入ActivityScoped 作用域Singleton 作用域构造参数,添加 Context参数ApplicationContext、ActivityContext官方文档 https://developer.android.com/training/dependency-inj…

【Linux】缓冲区/磁盘inode/动静态库制作

目录 一、缓冲区 1、缓冲区的概念 2、缓冲区的意义 3、缓冲区刷新策略 4、同一份代码,打印结果不同 5、仿写FILE 5.1myFILE.h 5.2myFILE.c 5.3main.c 6、内核缓冲区 二、了解磁盘 1、磁盘的物理结构 2、磁盘的存储结构 2.1磁盘的定位 3、磁盘的抽象…

基于价值迭代求解迷宫寻路问题

摘 要 迷宫寻路是人工智能和计算机科学中一个经典的问题。它涉及在迷宫中找到一条从起点到终点的最短路径。这个问题可以用来模拟真实世界中的许多情况,例如机器人在工厂中自动导航,搜索引擎在网络中寻找信息,或者人类在城市中导航。 迷宫寻路…

【Javascript基础】--零基础--超详细且简洁的Javascript笔记--简介(01)

参考资料: 【现代Javascript教程】https://zh.javascript.info/ 【MDN】https://developer.mozilla.org/zh-CN/ 笔记仅作为学习交流载体,无任何商业或盈利目的 JavaScript 简介 了解 JavaScript 有什么特别之处,我们可以用它实现什么&#…

适合编程初学者的开源博客系统(Vue3+Element Plus版)

目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。 上述基本涵盖了当前编程开发所有主流语言。 左侧为前端版本:安卓、iOS、鸿蒙、Flutter、Vue、uni-app、微信小程序。 右侧为服务器端版本&am…

YOLOV7学习记录之模型推理

前面我们学习了YOLOV7的训练过程,今天我们学习其推理过程,即模型预测:其包含损失函数计算,输出值解码,非极大值抑制,mAP计算等过程。 同时还介绍原始图像上绘制目标框等功能。 我们从predict.py文件开始&am…

【源码共读】Vite 项目自动添加 eslint 和 prettier

vite-pretty-lint库是一个为Vite创建的Vue或React项目初始化eslint和prettier的库。 该库的目的是为了让开发者在创建项目时,不需要手动配置eslint和prettier,而是通过vite-pretty-lint库来自动配置。 源码地址: vite-pretty-lintgithub1s…

设计模式 - 单例模式(一)

单例模式一 官方定义二 单例模式八种方式2.1 饿汉式(静态常量)代码案例案例分析2.2 饿汉式(静态代码块)代码案例案例分析2.3 懒汉式(线程不安全)代码案例案例分析2.4 懒汉式(线程安全,同步方法)代码案例案例分析2.5 懒…

数据要求说明书(GB856T——88)基于协同的在线表格forture-sheet

数据要求说明书 1引言 1.1编写目的 本份数据要求说明书详细的提供了系统中各个数据的流向,是设计数据库的关键所在。为以后的编码以及测试提供一份可靠的依据。 预期的读者:系统开发人员、系统测试人员、系统维护人员 1.2背景 待开发的数据库名称&a…

揭秘百度智能测试在测试定位领域的实践

以前,我们介绍了测试活动测试输入、测试执行、测试分析、测试定位和测试评估五个步骤中测试输入、执行、分析、评估的智能化研究和实践,本文重点介绍测试定位环节的智能化实践。 测试定位的主要作用是在构建失败或问题发生后,快速给出产生该现…

机器学习之回归

回归算法 线性回归 求解线性回归方法 正规方程梯度下降 迭代 API sklearn.linear_model.LinearRegression 正规方程优化fit_intercept 是否计算偏置量,没有的化经过原点属性 coef_ 回归系数intercept_ 偏置量 sklearn.linear_model.SGDRegressor 使用随机梯度…

转行了!文科生转程序员的外包工作经历分享

01 种子 我是一名文科生,法律专业,武汉某 211 ,入这行纯属巧合。 大三下半年,大家纷纷准备秋招,我去校园招聘会上溜达了一圈,好奇而去,丧气而归。 或许是因为大学三年过得太过安逸(宅在宿舍打…

C#语言实例源码系列-实现本地磁盘目录

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…