Flink调优----资源配置调优与状态及Checkpoint调优

news2024/12/26 16:52:31

目录

第 1 章 资源配置调优

1.1 内存设置

1.1.1 TaskManager 内存模型

1、内存模型详解

2、案例分析

1.1.2 生产资源配置示例

1.2 合理利用 cpu 资源

1.2.1 使用 DefaultResourceCalculator 策略

1.2.2 使用 DominantResourceCalculator 策略

1.2.3 使用 DominantResourceCalculator 策略并指定容器 vcore 数

1.3 并行度设置

1.3.1 全局并行度计算

1.3.2 Source 端并行度的配置

1.3.3 Transform 端并行度的配置

1.3.4 Sink 端并行度的配置

第 2 章 状态及 Checkpoint 调优

2.1 RocksDB 大状态调优

2.1.1 开启 State 访问性能监控

2.1.2 开启增量检查点和本地恢复

1)开启增量检查点

2)开启本地恢复

3)设置多目录

2.1.3 调整预定义选项

2.1.4 增大 block 缓存

2.1.5 增大 write buffer 和 level 阈值大小

2.1.6 增大 write buffer 数量

2.1.7 增大后台线程数和 write buffer 合并数

1)增大线程数

2)增大 writebuffer 最小合并数

2.1.8 开启分区索引功能

2.1.9 参数设定案例

2.2 Checkpoint 设置

总结


       在大数据处理领域,Flink 作为一款强大的流处理框架,其性能优化对于高效数据处理至关重要。合理的资源配置是实现卓越性能的基石,它直接关系到 Flink 作业在处理大规模数据时的效率、稳定性以及资源利用率。而状态及 Checkpoint 调优则是确保数据处理准确性与可靠性的关键环节,能够有效应对系统故障与数据一致性挑战。通过深入探究资源配置调优以及状态和 Checkpoint 调优的策略与方法,可使 Flink 在复杂的数据处理场景中充分发挥其潜力,满足日益增长的实时数据处理需求,为企业和组织提供更加精准、及时的数据洞察与决策支持。

第 1 章 资源配置调优

        Flink 性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。

        提交方式主要是 yarn-per-job,资源的分配在使用脚本提交 Flink 任务时进行指定。

标准的 Flink 任务提交脚本(Generic CLI 模式)

从 1.11 开始,增加了通用客户端模式,参数使用 -D <property=value> 指定

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \ 指定并行度
-Dyarn.application.queue=test \ 指定 yarn 队列
-Djobmanager.memory.process.size=1024mb \ 指定 JM 的总进程大小
-Dtaskmanager.memory.process.size=1024mb \ 指定每个 TM 的总进程大小
-Dtaskmanager.numberOfTaskSlots=2 \ 指定每个 TM 的 slot 数
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

参数列表:
//nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/config/

1.1 内存设置

1.1.1 TaskManager 内存模型

1、内存模型详解
  • JVM 特定内存:JVM本身使用的内存,包含JVM的metaspace和over-head

1)JVM metaspace:JVM元空间

taskmanager.memory.jvm-metaspace.size,默认256mb

2)JVM over-head执行开销:JVM执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。

taskmanager.memory.jvm-overhead.fraction,默认0.1

taskmanager.memory.jvm-overhead.min,默认192mb

taskmanager.memory.jvm-overhead.max,默认1gb

总进程内存*fraction,如果小于配置的min(或大于配置的max大小,则使用min/max大小

  • 框架内存:Flink框架,即TaskManager本身所占用的内存,不计入Slot的资源中。

堆内:taskmanager.memory.framework.heap.size,默认128MB

堆外:taskmanager.memory.framework.off-heap.size,默认128MB

  • Task内存:Task执行用户代码时所使用的内存

堆内:taskmanager.memory.task.heap.size,默认none,由Flink内存扣除掉其他部分的内存得到。

堆外:taskmanager.memory.task.off-heap.size,默认0,表示不使用堆外内存

  • 网络内存:网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区

堆外:taskmanager.memory.network.fraction,默认0.1

  taskmanager.memory.network.min,默认64mb

  taskmanager.memory.network.max,默认1gb

Flink内存*fraction,如果小于配置的min(或大于配置的max大小,则使用min/max大小

  • 托管内存:用于RocksDB State Backend 的本地内存和批的排序、哈希表、缓存中间结果。

堆外:taskmanager.memory.managed.fraction,默认0.4

  taskmanager.memory.managed.size,默认none

如果size没指定,则等于Flink内存*fraction

2、案例分析

        基于 Yarn 模式,一般参数指定的是总进程内存,taskmanager.memory.process.size,比如指定为 4G,每一块内存得到大小如下:

(1)计算Flink内存

        JVM元空间256m

        JVM执行开销: 4g*0.1=409.6m,在[192m,1g]之间,最终结果409.6m

        Flink内存=4g-256m-409.6m=3430.4m

(2)网络内存=3430.4m*0.1=343.04m,在[64m,1g]之间,最终结果343.04m

(3)托管内存=3430.4m*0.4=1372.16m

(4)框架内存,堆内和堆外都是128m

(5)Task堆内内存=3430.4m-128m-128m-343.04m-1372.16m=1459.2m

所以进程内存给多大,每一部分内存需不需要调整,可以看内存的使用率来调整。

1.1.2 生产资源配置示例

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \ 指定并行度
-Dyarn.application.queue=test \ 指定 yarn 队列
-Djobmanager.memory.process.size=2048mb \ JM2~4G 足够
-Dtaskmanager.memory.process.size=4096mb \ 单个 TM2~8G 足够
-Dtaskmanager.numberOfTaskSlots=2 \ 与容器核数 1core:1slot 或 2core:1slot
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

        Flink 是实时流处理,关键在于资源情况能不能抗住高峰时期每秒的数据量,通常用 QPS/TPS 来描述数据情况。

1.2 合理利用 cpu 资源

        Yarn 的容量调度器默认情况下是使用 “DefaultResourceCalculator” 分配策略,只根据内存调度资源,所以在 Yarn 的资源管理页面上看到每个容器的 vcore 个数还是 1。

        可以修改策略为 DominantResourceCalculator,该资源计算器在计算资源的时候会综合考虑 cpu 和内存的情况。在 capacity-scheduler.xml 中修改属性:

<property>
    <name>yarn.scheduler.capacity.resource-calculator</name>
    <!-- <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> -->
    <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>

1.2.1 使用 DefaultResourceCalculator 策略

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

可以看到一个容器只有一个 vcore:

1.2.2 使用 DominantResourceCalculator 策略

修改后 yarn 配置后,分发配置并重启 yarn,再次提交 flink 作业:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

看到容器的 vcore 数变了:

JobManager 1 个,占用 1 个容器,vcore = 1
TaskManager 3 个,占用 3 个容器,每个容器 vcore = 2,总 vcore = 2*3 = 6,因为默认单个容器的 vcore 数 = 单 TM 的 slot 数

1.2.3 使用 DominantResourceCalculator 策略并指定容器 vcore 数

指定 yarn 容器的 vcore 数,提交:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-DYarn.containers.vcores=3 \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-c com.atguigu.flink.tuning.UvDemo \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

 看到容器的 vcore 数变了:

JobManager 1 个,占用 1 个容器,vcore = 1
TaskManager 3 个,占用 3 个容器,每个容器 vcore = 3,总 vcore = 3*3 = 9

1.3 并行度设置

1.3.1 全局并行度计算

        开发完成后,先进行压测。任务并行度给 10 以下,测试单个并行度的处理上限。然后总 QPS / 单并行度的处理能力 = 并行度

        开发完 Flink 作业,压测的方式很简单,先在 kafka 中积压数据,之后开启 Flink 任务,出现反压,就是处理瓶颈。相当于水库先积水,一下子泄洪。

        不能只从 QPS 去得出并行度,因为有些字段少、逻辑简单的任务,单并行度一秒处理几万条数据。而有些数据字段多,处理逻辑复杂,单并行度一秒只能处理 1000 条数据。

        最好根据高峰期的 QPS 压测,并行度 * 1.2 倍,富余一些资源。

1.3.2 Source 端并行度的配置

        数据源端是 Kafka,Source 的并行度设置为 Kafka 对应 Topic 的分区数。

        如果已经等于 Kafka 的分区数,消费速度仍跟不上数据生产速度,考虑下 Kafka 要扩大分区,同时调大并行度等于分区数。

        Flink 的一个并行度可以处理一至多个分区的数据,如果并行度多于 Kafka 的分区数,那么就会造成有的并行度空闲,浪费资源。

1.3.3 Transform 端并行度的配置

  • Keyby 之前的算子

        一般不会做太重的操作,都是比如 map、filter、flatmap 等处理较快的算子,并行度可以和 source 保持一致。

  • Keyby 之后的算子

        如果并发较大,建议设置并行度为 2 的整数次幂,例如:128、256、512;
        小并发任务的并行度不一定需要设置成 2 的整数次幂;
        大并发任务如果没有 KeyBy,并行度也无需设置为 2 的整数次幂;

1.3.4 Sink 端并行度的配置

        Sink 端是数据流向下游的地方,可以根据 Sink 端的数据量及下游的服务抗压能力进行评估。如果 Sink 端是 Kafka,可以设为 Kafka 对应 Topic 的分区数。

        Sink 端的数据量小,比较常见的就是监控告警的场景,并行度可以设置的小一些。

        Source 端的数据量是最小的,拿到 Source 端流过来的数据后做了细粒度的拆分,数据量不断的增加,到 Sink 端的数据量就非常大。那么在 Sink 到下游的存储中间件的时候就需要提高并行度。

        另外 Sink 端要与下游的服务进行交互,并行度还得根据下游的服务抗压能力来设置,如果在 Flink Sink 这端的数据量过大的话,且 Sink 处并行度也设置的很大,但下游的服务完全撑不住这么大的并发写入,可能会造成下游服务直接被写挂,所以最终还是要在 Sink 处的并行度做一定的权衡。

第 2 章 状态及 Checkpoint 调优

2.1 RocksDB 大状态调优

        RocksDB 是基于 LSM Tree 实现的(类似 HBase),写数据都是先缓存到内存中,所以 RocksDB 的写请求效率比较高。RocksDB 使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中 blockcache 中查找,如果内存中没有再去磁盘中查询。使用 RocksDB 时,状态大小仅受可用磁盘空间量的限制,性能瓶颈主要在于 RocksDB 对磁盘的读请求,每次读写操作都必须对数据进行反序列化或者序列化。当处理性能不够时,仅需要横向扩展并行度即可提高整个 Job 的吞吐量。

        从 Flink1.10 开始,Flink 默认将 RocksDB 的内存大小配置为每个 task slot 的托管内存。调试内存性能的问题主要是通过调整配置项 taskmanager.memory.managed.size 或者 taskmanager.memory.managed.fraction 以增加 Flink 的托管内存 (即堆外的托管内存)。进一步可以调整一些参数进行高级性能调优,这些参数也可以在应用程序中通过 RocksDBStateBackend.setRocksDBOptions (RocksDBOptionsFactory) 指定。下面介绍提高资源利用率的几个重要配置:

2.1.1 开启 State 访问性能监控

        Flink 1.13 中引入了 State 访问的性能监控,即 latency trackig state。此功能不局限于 State Backend 的类型,自定义实现的 State Backend 也可以复用此功能。

        State 访问的性能监控会产生一定的性能影响,所以,默认每 100 次做一次取样 (sample),对不同的 State Backend 性能损失影响不同:
        对于 RocksDB State Backend,性能损失大概在 1% 左右
        对于 Heap State Backend,性能损失最多可达 10%

state.backend.latency-track.keyed-state-enabled:true #启用访问状态的性能监控
state.backend.latency-track.sample-interval: 100   #采样间隔
state.backend.latency-track.history-size: 128    #保留的采样数据个数,越大越精确
state.backend.latency-track.state-name-as-variable: true #将状态名作为变量

正常开启第一个参数即可。

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dstate.backend.latency-track.keyed-state-enabled=true \
-c com.atguigu.flink.tuning.RocksdbTuning \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

2.1.2 开启增量检查点和本地恢复

1)开启增量检查点

        RocksDB 是目前唯一可用于支持有状态流处理应用程序增量检查点的状态后端,可以修改参数开启增量检查点:

state.backend.incremental: true   #默认 false,改为 true。

或代码中指定

new EmbeddedRocksDBStateBackend(true)

2)开启本地恢复

        当 Flink 任务失败时,可以基于本地的状态信息进行恢复任务,可能不需要从 hdfs 拉取数据。本地恢复目前仅涵盖键控类型的状态后端(RocksDB),MemoryStateBackend 不支持本地恢复并忽略此选项。

state.backend.local-recovery: true

3)设置多目录

如果有多块磁盘,也可以考虑指定本地多目录

state.backend.rocksdb.localdir:
/data1/flink/rocksdb,/data2/flink/rocksdb,/data3/flink/rocksdb

注意:不要配置单块磁盘的多个目录,务必将目录配置到多块不同的磁盘上,让多块磁盘来分担压力。

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dstate.backend.incremental=true \
-Dstate.backend.local-recovery=true \
-Dstate.backend.latency-track.keyed-state-enabled=true \
-c com.atguigu.flink.tuning.RocksdbTuning \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

2.1.3 调整预定义选项

        Flink 针对不同的设置为 RocksDB 提供了一些预定义的选项集合,其中包含了后续提到的一些参数,如果调整预定义选项后还达不到预期,再去调整后面的 block、writebuffer 等参数。

        当前支持的预定义选项有 DEFAULT、SPINNING_DISK_OPTIMIZED、SPINNING_DISK_OPTIMIZED_HIGH_MEM 或 FLASH_SSD_OPTIMIZED。有条件上 SSD 的,可以指定为 FLASH_SSD_OPTIMIZED

state.backend.rocksdb.predefined-options: SPINNING_DISK_OPTIMIZED_HIGH_MEM 
#设置为机械硬盘+内存模式

2.1.4 增大 block 缓存

        整个 RocksDB 共享一个 block cache,读数据时内存的 cache 大小,该参数越大读数据时缓存命中率越高,默认大小为 8 MB,建议设置到 64 ~ 256 MB

state.backend.rocksdb.block.cache-size: 64m   #默认 8m

2.1.5 增大 write buffer 和 level 阈值大小

        RocksDB 中,每个 State 使用一个 Column Family,每个 Column Family 使用独占的 write buffer,默认 64MB,建议调大
        调整这个参数通常要适当增加 L1 层的大小阈值 max-size-level-base,默认 256m。该值太小会造成能存放的 SST 文件过少,层级变多造成查找困难,太大会造成文件过多,合并困难。建议设为 target_file_size_base(默认 64MB)的倍数,且不能太小,例如 5~10 倍,即 320~640MB

state.backend.rocksdb.writebuffer.size: 128m
state.backend.rocksdb.compaction.level.max-size-level-base: 320m

2.1.6 增大 write buffer 数量

        每个 Column Family 对应的 writebuffer 最大数量,这实际上是内存中 “只读内存表 “的最大数量,默认值是 2。对于机械磁盘来说,如果内存足够大,可以调大到 5 左右

state.backend.rocksdb.writebuffer.count: 5

2.1.7 增大后台线程数和 write buffer 合并数

1)增大线程数

        用于后台 flush 和合并 sst 文件的线程数,默认为 1,建议调大,机械硬盘用户可以改为 4 等更大的值

state.backend.rocksdb.thread.num: 4

2)增大 writebuffer 最小合并数

        将数据从 writebuffer 中 flush 到磁盘时,需要合并的 writebuffer 最小数量,默认值为 1,可以调成 3。

state.backend.rocksdb.writebuffer.number-to-merge: 3

2.1.8 开启分区索引功能

        Flink 1.13 中对 RocksDB 增加了分区索引功能,复用了 RocksDB 的 partitioned Index & filter 功能,简单来说就是对 RocksDB 的 partitioned Index 做了多级索引。也就是将内存中的最上层常驻,下层根据需要再 load 回来,这样就大大降低了数据 Swap 竞争。线上测试中,相对于内存比较小的场景中,性能提升 10 倍左右。如果在内存管控下 Rocksdb 性能不如预期的话,这也能成为一个性能优化点。

state.backend.rocksdb.memory.partitioned-index-filters:true  #默认 false

2.1.9 参数设定案例

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Drest.flamegraph.enabled=true \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=1024mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dstate.backend.incremental=true \
-Dstate.backend.local-recovery=true \
-Dstate.backend.rocksdb.predefined-options=SPINNING_DISK_OPTIMIZED_HIGH_MEM \
-Dstate.backend.rocksdb.block.cache-size=64m \
-Dstate.backend.rocksdb.writebuffer.size=128m \
-Dstate.backend.rocksdb.compaction.level.max-size-level-base=320m \
-Dstate.backend.rocksdb.writebuffer.count=5 \
-Dstate.backend.rocksdb.thread.num=4 \
-Dstate.backend.rocksdb.writebuffer.number-to-merge=3 \
-Dstate.backend.rocksdb.memory.partitioned-index-filters=true \
-Dstate.backend.latency-track.keyed-state-enabled=true \
-c com.atguigu.flink.tuning.RocksdbTuning \
/opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar

2.2 Checkpoint 设置

        一般需求,我们的 Checkpoint 时间间隔可以设置为分钟级别(1 ~5 分钟)。对于状态很大的任务每次 Checkpoint 访问 HDFS 比较耗时,可以设置为 5~10 分钟一次 Checkpoint,并且调大两次 Checkpoint 之间的暂停间隔,例如设置两次 Checkpoint 之间至少暂停 4 或 8 分钟。同时,也需要考虑时效性的要求,需要在时效性和性能之间做一个平衡,如果时效性要求高,结合 end-to-end 时长,设置秒级或毫秒级。如果 Checkpoint 语义配置为 EXACTLY_ONCE,那么在 Checkpoint 过程中还会存在 barrier 对齐的过程,可以通过 Flink Web UI 的 Checkpoint 选项卡来查看 Checkpoint 过程中各阶段的耗时情况,从而确定到底是哪个阶段导致 Checkpoint 时间过长然后针对性的解决问题。

        RocksDB 相关参数在前面已说明,可以在 flink-conf.yaml 指定,也可以在 Job 的代码中调用 API 单独指定,这里不再列出。

// 使⽤ RocksDBStateBackend 做为状态后端,并开启增量 Checkpoint
RocksDBStateBackend rocksDBStateBackend = new RocksDBStateBackend("hdfs://hadoop1:8020/flink/checkpoints", true);
env.setStateBackend(rocksDBStateBackend);

// 开启 Checkpoint,间隔为 3 分钟
env.enableCheckpointing(TimeUnit.MINUTES.toMillis(3));
// 配置 Checkpoint
CheckpointConfig checkpointConf = env.getCheckpointConfig();
checkpointConf.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 最小间隔 4 分钟
checkpointConf.setMinPauseBetweenCheckpoints(TimeUnit.MINUTES.toMillis(4));
// 超时时间 10 分钟
checkpointConf.setCheckpointTimeout(TimeUnit.MINUTES.toMillis(10));
// 保存 checkpoint
checkpointConf.enableExternalizedCheckpoints(
        CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

总结

        本文全面且深入地阐述了 Flink 性能调优中的资源配置调优以及状态及 Checkpoint 调优两大部分内容。在资源配置调优方面,涵盖了内存设置,包括对 JVM 特定内存、框架内存、Task 内存、网络内存和托管内存的详细剖析,并给出基于 Yarn 模式的案例分析与生产资源配置示例;介绍了合理利用 CPU 资源的策略,如通过修改 Yarn 容量调度器的资源计算器策略来综合考虑 CPU 和内存;还阐述了并行度设置的方法,包括全局并行度计算以及 Source、Transform、Sink 端的并行度设置要点。在状态及 Checkpoint 调优部分,针对 RocksDB 大状态调优,提出了如开启 State 访问性能监控、增量检查点和本地恢复、调整预定义选项、增大 block 缓存、write buffer 及相关参数、开启分区索引功能等一系列措施,并给出参数设定案例;同时对 Checkpoint 设置进行了说明,包括时间间隔、暂停间隔的设置以及在不同时效性要求下的考量,还提及了如何通过 Flink Web UI 排查 Checkpoint 耗时问题。通过对这些调优策略的掌握与运用,能够显著提升 Flink 作业的性能、可靠性与资源利用效率,助力在大数据处理任务中取得更优的成果。

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

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

相关文章

9. zynq应用开发--makefile编译

3. 使用SDK工具 如果只做 Linux 应用开发&#xff0c;只需要一个 sdk.sh 文件即可&#xff0c;可以脱离 Petalinux 和 Vitis&#xff0c;也可以编译其三方的应用&#xff0c;可以说一劳永逸。 配置根文件系统 petalinux-config -c rootfs 编译SDK petalinux-build --sdk Linu…

【ORB-SLAM3:相机针孔模型和相机K8模型】

在ORB-SLAM3中&#xff0c;相机的建模是 SLAM 系统的核心之一&#xff0c;因为它直接影响到如何处理和利用图像数据进行定位和地图构建。ORB-SLAM3 支持不同的相机模型&#xff0c;其中包括针孔模型和鱼眼模型&#xff08;K8 模型&#xff09;。下面分别介绍这两种模型。 相机…

element-plus在Vue3中开发相关知识

报错&#xff1a;error.mjs:20 ElementPlusError: [ElForm] model is required for resetFields to work. 原因&#xff1a;el-form使用v-model没有把内容绑定上&#xff0c;需要使用 :model 才可以校验 将&#xff1a; <el-form label-width"auto" class"…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 日出日落

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 出现错误的情况 报错&#xff1a; 代码&#xff1a; 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

基础运维学习计划-base版

目录 需要学习的内容&#xff1f; liunx基础 sql/mysql基础 tcp/ip协议基础 http基础 dns基础 网络基础&#xff1a;交换&路由概念&原理 常见网络协议 月学习计划 12.26 日 &#xff08;bilibili自己找视频看看&#xff0c;资源很多&#xff09; 12.27日 1…

亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型

近日&#xff0c;亚信安全科技股份有限公司&#xff08;以下简称“亚信安全”&#xff09;正式与青岛方天科技股份有限公司&#xff08;以下简称“方天股份”&#xff09;签订合作框架协议。双方强强携手&#xff0c;在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…

117.【C语言】数据结构之排序(选择排序)

目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 ​编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…

画展在线上通过虚拟展厅展览,如何实现?有何好处?

画展在线上通过虚拟展厅展览的实现方式及好处可以归纳如下&#xff1a; 一、实现方式 1、技术基础&#xff1a; 虚拟现实&#xff08;VR&#xff09;技术&#xff1a;利用VR技术&#xff0c;观众可以佩戴VR设备身临其境地参观展厅&#xff0c;与展品进行直观互动。 三维建模…

WordPress Tutor LMS插件 SQL注入漏洞复现(CVE-2024-10400)

0x01 产品简介 WordPress Tutor LMS插件是一款功能丰富且强大的学习管理系统(LMS)插件,它专为WordPress平台设计,旨在帮助用户轻松创建、管理和销售在线课程。功能强大且易于使用的学习管理系统插件。它提供了完整的在线课程市场解决方案,帮助用户轻松创建、管理和销售在…

Spring源码_05_IOC容器启动细节

前面几章&#xff0c;大致讲了Spring的IOC容器的大致过程和原理&#xff0c;以及重要的容器和beanFactory的继承关系&#xff0c;为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的&#xff0c;接下来的每一章都是从总体脉络中&#xff0c; 去研究之前没看的一些重要…

主流AI视频生成工具|Sora零基础入门指南

Sora是什么&#xff1f; Sora 是 OpenAI 推出的新一代 AI 视频生成工具。它能让用户通过简单的文本描述或图片提示&#xff0c;快速生成高质量的视频内容。无论是广告短片、创意视频&#xff0c;还是实验性艺术作品&#xff0c;Sora 都能帮助创作者以极低的门槛实现自己的想法。…

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…

“乡村探索者”:村旅游网站的移动应用开发

3.1 可行性分析 从三个不同的角度来分析&#xff0c;确保开发成功的前提是有可行性分析&#xff0c;只有进行提前分析&#xff0c;符合程序开发流程才不至于开发过程的中断。 3.1.1 技术可行性 在技术实现层次&#xff0c;分析了好几种技术实现方法&#xff0c;并且都有对应的成…

Docker完整技术汇总

Docker 背景引入 在实际开发过程中有三个环境&#xff0c;分别是&#xff1a;开发环境、测试环境以及生产环境&#xff0c;假设开发环境中开发人员用的是jdk8&#xff0c;而在测试环境中测试人员用的时jdk7&#xff0c;这就导致程序员开发完系统后将其打成jar包发给测试人员后…

天特量子生物肿瘤电场仪

在医疗科技飞速发展的今天&#xff0c;一种名为“天特量子肿瘤电场治疗仪”的创新设备正逐步成为肿瘤治疗领域的一颗璀璨新星。这款由河南省天特量子医疗科技有限公司&#xff08;以下简称“天特量子”&#xff09;倾力打造的治疗仪&#xff0c;以其独特的无创治疗、精准定位、…

LeetCode:257. 二叉树的所有路径

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根…

知识增强式生成KAG

随着人工智能技术的不断发展&#xff0c;尤其是在自然语言处理领域&#xff0c;知识增强式生成&#xff08;KAG&#xff09;作为一种新兴的技术框架&#xff0c;正逐步脱颖而出。与其前身——检索增强式生成&#xff08;RAG&#xff09;相比&#xff0c;KAG在处理特定领域知识、…

GitLab的卸载与重装

目录 一、GitLab的卸载 二、 GitLab的安装与配置 1. 创建安装目录 2. 安装 3. 使用 3.1 初始化 3.2 创建空白项目 ​编辑 3.3 配置SSH 3.3.1 配置公钥 ​编辑 3.3.2 配置私钥 3.4 配置本地git库 一、GitLab的卸载 1. 停止gitlab sudo gitlab-ctl stop 2. 卸载…

Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格

目录 1.工作台 1.1 需求分析和设计 1.1.1 产品原型 1.1.2 接口设计 1.2 代码导入 1.2.1 Controller层 1.2.2 Service层接口 1.2.3 Service层实现类 1.2.4 Mapper层 1.3 功能测试 1.4 代码提交 2.Apache POI 2.1 介绍 2.2 入门案例 2.2.1 将数据写入Excel文件 2.2.2 读取Excel文…