当前位置: 首页 > news >正文

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

目录

第 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 作业的性能、可靠性与资源利用效率,助力在大数据处理任务中取得更优的成果。

相关文章:

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

目录 第 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 使用 DominantRes…...

Java web的发展历史

目录 前言&#xff1a; 一.Model I和Model II 1.Model I开发模式 ​编辑 2.Model II开发模式 二. MVC模式 前言&#xff1a; 该篇文章主要介绍了Java web的发展历史&#xff0c;以及MVC相关内容 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff…...

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

&#x1f3af;导读&#xff1a;本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则&#xff0c;利用负载均衡将请求转发至不同的后端服务&#xff0c;并集成了Token验证过滤器以确保API的安全访问&#xff0c;同时支持白名单路…...

MongoDB 更新文档

关于MongoDB更新文档的操作&#xff0c;可以通过多种方法实现。以下是一些常用的方法&#xff1a; updateOne() 方法&#xff1a;用于更新匹配过滤器的单个文档。其语法为 db.collection.updateOne(filter, update, options)。其中&#xff0c;filter 用于查找文档的查询条件&a…...

静态路由与动态路由

静态路由和动态路由是网络中两种不同的路由配置方式&#xff0c;它们在网络中的运作方式、配置方法以及适用场景等方面存在显著差异。以下是对两者的详细比较&#xff1a; 一、定义与配置方式 静态路由 定义&#xff1a;静态路由是由网络管理员手动配置的固定路径&#xff0c;…...

leetcode hot二叉树的层序遍历

102. 二叉树的层序遍历 已解答 中等 相关标签 相关企业 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09; # Definition for a binary tree node. # class TreeNode(object): # …...

Windows下ESP32-IDF开发环境搭建

Windows下ESP32-IDF开发环境搭建 文章目录 Windows下ESP32-IDF开发环境搭建一、软件安装二、搭建IDF开发环境2.1 安装VS Code插件&#xff1a;2.2 配置ESP-IDF插件&#xff1a;2.3 下载例程源码&#xff1a; 三、编译和烧录代码四、Windows下使用命令行编译和烧录程序4.1 配置环…...

基于高云GW5AT-15 FPGA的SLVS-EC桥MIPI设计方案分享

作者&#xff1a;Hello,Panda 一、设计需求 设计一个4Lanes SLVS-EC桥接到2组4lanes MIPI DPHY接口的电路模块&#xff1a; &#xff08;1&#xff09;CMOS芯片&#xff1a;IMX537-AAMJ-C&#xff0c;输出4lanes SLVS-EC 4.752Gbps Lane速率&#xff1b; &#xff08;2&…...

【day18】多线程高级应用

day17回顾 在深入探讨模块18之前&#xff0c;让我们回顾一下【day17】中的关键内容&#xff1a; 创建多线程&#xff1a; 继承Thread类&#xff1a; 定义一个类&#xff0c;继承Thread。重写run方法&#xff0c;设置线程任务。创建自定义线程对象。调用start方法&#xff0c;开…...

Python接口自动化测试的实现

1)环境准备&#xff1a; 接口测试的方式有很多&#xff0c;比如可以用工具(jmeter,postman)之类&#xff0c;也可以自己写代码进行接口测试&#xff0c;工具的使用相对来说都比较简单&#xff0c;重点是要搞清楚项目接口的协议是什么&#xff0c;然后有针对性的进行选择&#x…...

nvidia docker, nvidia docker2, nvidia container toolkits区别

背景 在docker容器中用GPU时&#xff0c;查阅了网上许多教程&#xff0c;教程之间概念模糊不清&#xff0c;相互矛盾&#xff0c;过时的教程和新的教程混杂在一起。主要原因是Nvidia为docker容器的支持发生了好几代变更&#xff0c;api发生了不少变化。下面来总结一下各代支持…...

字节跳动Java开发面试题及参考答案(综合篇)

HTTP 与 HTTPS 的区别? HTTP(超文本传输协议)和 HTTPS(超文本传输安全协议)主要有以下区别。 从安全性角度看,HTTP 是明文传输协议,数据在网络中传输时是以原始文本的形式发送的。这就好比在信件传递过程中没有进行密封,任何中间节点(如路由器、代理服务器等)都可以查…...

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…...

深入解析 Spring WebFlux:原理与应用

优质博文&#xff1a;IT-BLOG-CN WebFlux 是 Spring Framework 5 引入的一种响应式编程框架&#xff0c;和Spring MVC同级&#xff0c;旨在处理高并发和低延迟的非阻塞应用。这是一个支持反应式编程模型的新Web框架体系。 顺便一提&#xff0c;Spring Cloud Gateway在实现上是…...

Docker 部署 SpringBoot VUE项目

是一套基于若依的wms仓库管理系统 一、后端部署 后端地址&#xff1a;https://gitee.com/zccbbg/wms-ruoyi/tree/v1/ 1、用IDEA拉代码&#xff0c;并修改API统一后缀 2、复制一个配置文件 application-dev.yaml&#xff0c;并修改里面的mysql与redis配置 3、将打包的jar上传…...

【Java基础面试题031】Java运行时异常和编译时异常之间的区别是什么?

回答重点 主要有三大区别&#xff0c;分别是发生时机、捕获和处理方式和设计意图 1&#xff09;发生时机&#xff1a; 编译时异常&#xff08;Checked Exception&#xff09;&#xff1a;发生在编译阶段&#xff0c;编译器会检查此类异常&#xff0c;程序必须堆这些异常进行…...

常见网络功能概述-主要拆解功能

大家觉得有意义和参考价值记得关注和点赞&#xff01;&#xff01;&#xff01; 一、防火墙介绍 防火墙&#xff08;Firewall&#xff09;是一种网络安全系统&#xff0c;用于监控、过滤和控制进出网络的数据流量。它是一种屏障&#xff0c;通过策略规则来允许、限制或拒绝数…...

Chapter 3-1. Detecting Congestion in Fibre Channel Fabrics

Chapter 3. Detecting Congestion in Fibre Channel Fabrics This chapter covers the following topics: 本章包括以下主题: Congestion detection workflow. Congestion detection metrics. Congestion detection metrics and commands on Cisco MDS switches. Automatic A…...

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…...

重温设计模式--5、职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&am…...

C语言-08复合类型-结构体

一、结构体 1.结构体struct struct关键字&#xff0c;允许自定义复合数据类型&#xff0c;将不同类型的值组合在一起&#xff0c;这种类型称为结构体类型。 2.使用步骤 第一步&#xff1a;创建或声明结构体 第二步&#xff1a;定义结构体变量 第三步&#xff1a;调用并操作结…...

vue 基础学习

一、ref 和reactive 区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div id"app"><h1>{{Web.title}}</h1><h1&…...

Elasticsearch检索方案之一:使用from+size实现分页

前面两篇文章介绍了elasticsearch以及Kibana的安装&#xff0c;检索引擎以及可视化工具都已经安装完成&#xff0c;接下来介绍下如何使用golang的sdk实现简单的分页查询。 1、下载Elastic官方golang sdk 在讲解elasticsearch检索之前&#xff0c;需要先把golang的环境安装好&…...

Highcharts 饼图:数据可视化利器

Highcharts 饼图&#xff1a;数据可视化利器 引言 在数据可视化的领域中&#xff0c;饼图作为一种经典且直观的图表类型&#xff0c;被广泛应用于各种行业和场景中。Highcharts&#xff0c;作为一个功能强大且易于使用的JavaScript图表库&#xff0c;为我们提供了创建交互式和…...

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…...

后端接口设计

一、基本规范 1.URL设计 应遵循RESTful风格&#xff0c;使用动词名词的方式描述接口的功能。应简洁明了&#xff0c;易于理解和记忆。 2.请求协议及方法 使用HTTPS协议进行数据传输&#xff0c;保证数据在传输过程中的安全性。如无特殊情况&#xff0c;统一使用post方法。 …...

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…...

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. 卸载…...

动态住宅IP适合哪些数据采集项目?

在数据采集的广阔天地中&#xff0c;动态住宅IP代理能够灵活地变换身份&#xff0c;帮助我们在网络世界中自由地穿梭。这种代理IP因其住宅性质和动态变化的特点&#xff0c;成为了许多数据采集项目的理想选择。今天&#xff0c;我们就来聊聊动态住宅IP代理适合哪些数据采集项目…...

Git_撤销本地commit_查找仓库中大文件

Gitee普通账号的仓库总空间限制为5G&#xff1b; 右上角头像&#xff0c;下拉—》设置/账号设置—》数据管理下的仓库空间信息即可查看空间限额和各仓库空间大小&#xff1b;Gitee普通账号每次推送大小不能超过100MB&#xff0c;否则会推送失败&#xff1b;当提交大小超过100MB…...

golang windows打包为linux可执行文件

使用go的交叉编译功能 set GOOSlinux set GOARCHamd64然后再执行go build 可能会报异常, 所以贴出我的go env配置仅供参考 go env环境配置 D:\GoWork\src\go-tzv>go env set GO111MODULEauto set GOARCHamd64 set GOBIN …...

源码分析之Openlayers中GeometryCollection类

概述 本文主要介绍GeometryCollection类,GeometryCollection类继承于Geometry类,关于Geometry类,参考这篇文章源码分析之Openlayers中Geometry基类介绍 GeometryCollection类就是一组几何对象的集合. 源码分析 GeometryCollection类源码实现 GeometryCollection类源码实现…...

*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一…...

Redis大Key问题全解析

1. 引言 1.1 什么是Redis大Key&#xff1f; Redis大Key是指单个Key对应的数据量过大&#xff0c;占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种&#xff1a; String类型&#xff1a;单个字符串的长度过大。List类型&#xff1a;包含…...

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...

USB Hub 检测设备

系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到&#xff0c;当有 USB 插入时&…...

Python 正则表达式

正则在线实用工具&#xff1a;regex101 正则表达式&#xff08;regular expression&#xff09;是一种用于匹配字符串中字符组合模式的工具。它可以用来检查一个字符串是否匹配某个模式、提取字符串中的信息、替换字符串中的某些部分等。 Python 的 re 模块提供了对正则表达式…...

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端&#xff0c;进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…...

React 前端框架入门

这里写目录标题 React 前端框架入门什么是 React&#xff1f;核心特性基本概念1. JSX2. 组件3. State 和 Props4. 生命周期5. React Hooks React 应用示例项目结构如何启动 React 项目参考资料 React 前端框架入门 什么是 React&#xff1f; React 是由 Facebook 开发并开源的…...

复习打卡大数据篇——Hadoop YARN

目录 &#xff11;.什么是yarn &#xff12;.yarn的三大角色 &#xff13;.任务&#xff08;MR&#xff09;提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 &#xff11;.什么是yarn YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一个资源管…...

03.HTTPS的实现原理-HTTPS的工作流程

03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…...

idea部署maven项目步骤(图+文)

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

Eclipse 添加书签

Eclipse 添加书签 Eclipse 是一款非常受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛用于 Java、C、Python 等语言的开发。在处理大型项目时&#xff0c;开发者通常需要在不同文件和代码行之间频繁切换。为了提高工作效率&#xff0c;Eclipse 提供了书签功…...

ROSboard:为您的机器人提供强大的Web可视化工具

ROSboard&#xff1a;为您的机器人提供强大的Web可视化工具 rosboard ROS node that turns your robot into a web server to visualize ROS topics [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ro/rosboard 项目介绍 ROSboard 是一个专为机器人设计的 Web 服…...

InnoDB引擎的内存结构

InnoDB擅长处理事务&#xff0c;具有自动崩溃恢复的特性 架构图&#xff1a; 由4部分组成&#xff1a; 1.Buffer Pool&#xff1a;缓冲池&#xff0c;缓存表数据和索引数据&#xff0c;减少磁盘I/O操作&#xff0c;提升效率 2.change Buffer&#xff1a;写缓冲区&#xff0c…...

使用RTP 协议 对 H264 封包和解包,h264的avpacket和NAL的关系

学习内容&#xff1a; 本章探讨如何将h264的 avpacket的视频 数据&#xff0c;通过RTP协议发送到 流媒体 服务器 或者 对端接受者。 前提 我们在将 YUV数据变成avframe后&#xff0c;通过h264 编码变成AVPacket&#xff0c;例如&#xff0c;在安防项目中&#xff0c;或者直播…...

面试经典问题 —— 最大/小前K个数问题(top - K)问题

目录 常见思路更优的解法&#xff08;面试官喜欢的&#xff09; 常见思路 要选出最小的前K个数首先我们会想到排排升序建大堆&#xff0c;排降序建小堆 一个直观的想法是使用&#xff08;小根堆&#xff09;&#xff0c;起始将所有元素放入堆中&#xff0c;然后再从堆中取出k 个…...

HNUST-数据分析技术课堂实验

1.要求 1&#xff0c;从下列第一、二、三组实验中各至少选取一个算法进行实验&#xff0c;选修组实验不作强制要求&#xff1b;2&#xff0c;实验过程不限&#xff0c;目标在于锻炼算法实现过程&#xff0c;即可采用C、C、Java、Python&#xff08;建议&#xff09;等任意语言编…...

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…...

Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践

在现代 Web 应用中&#xff0c;性能优化直接影响用户体验和业务转化。Next.js 14 提供了多种内置的性能优化特性&#xff0c;今天我们就来深入探讨如何充分利用这些特性&#xff0c;以及一些实用的优化技巧。 图片和字体优化 1. 图片优化 Next.js 的 Image 组件供了强大的图…...