Flink系列之Flink中Checkpoint容错机制

news2024/10/7 18:29:04

title: Flink系列


三、Flink Checkpoint 容错机制原理概述

​ Flink 提供了 Exactly once 特性,是依赖于带有 barrier 的分布式快照 + 可部分重发的数据源功能实现的。而分布式快照中,就保存了 operator 的状态信息。

​ Flink 的失败恢复依赖于 检查点机制 + 可部分重发的数据源。

  • 一、检查点机制:Checkpoint 定期触发,产生快照,快照中记录了:
  1. 当前检查点开始时数据源(例如 Kafka)中消息的 offset。

  2. 记录了所有有状态的 Operator 当前的状态信息(例如 sum 中的数值)。(Application/Job Operator / / Task

  3. 通俗的解释:每隔一段时间,就给这个 job 中的所有 Task 的state 做一次持久化,所以所有 Task State 的持久化成功了,则意味着这个 job 在这个时刻的 checkpoint 就成功了, 也就意味着给这个 job 在当前时刻做了一次 checkpoint

  • 二、可部分重发的数据源:Flink 选择最近成功完成的检查点,然后系统重放整个分布式的数据流,然后给予每个 Operator 他们在该检查点快照中的状态。数据源被设置为从合适位置开始重新读取流。例如在 Apache Kafka 中,那意味着告诉消费者从偏移量 offset 开始重新消费。
  1. 通俗的解释:我从你哪儿拉取一部分数据执行消费,数据拉取成功了,但是消费失败。 我要重来一次。那到底从那个地方继续呢?

(1)如果数据源具备数据重放功能:那么没有消费处理成功的数据,就再拉取处理一次

(2)如果数据源不具备数据重放功能: 失败之后就再也拿不到之前拉取的数据了。数据丢失了

分布式消息系统:kafak rocketmq 都是具备数据重放能力的组件。

探讨一个问题:现在让你实现 Flink 的检查点机制的 功能,该怎么做?

图零 整体的:CheckPoint简单设计

在这里插入图片描述

图一:当任务失败的时候

当任务运行失败的时候:

在这里插入图片描述

拍摄快照的时候,有两种结果是可以接受的:

如果标记放在 7 的后面: offset =7, sum_odd = 16, sum_even = 12    
如果标记放在 6 的后面: offset =6, sum_odd = 9, sum_even = 12
如果标记放在 5 的后面: offset =5, sum_odd = 9, sum_even = 6

如果直接把上图中的每个 Task 的状态直接保存,那么就是不合理的(有些数据,上游已经处理了,但是下游没有被处理):

offset =7, sum_odd = 9, sum_even = 12 XXXXXXXXXXXX, 如果 job 从这个状态中执行恢复,则 offset = 7 的这条数据就丢失了,没有参与计算

就一个需求:需要保证每一条数据,都完整的通过了这条处理链路(Source —> Transform ----> Sink)

然后我们重启应用,对应的状态数据已经丢失了。

图二:重启应用

在这里插入图片描述

图三:CheckPoint恢复数据

Flink应用程序从checkpoint恢复数据:

在这里插入图片描述

图四:Flink应用程序继续运行

Flink应用程序继续运行:

在这里插入图片描述

四、Flink CheckPoint 算法原理深入剖析

​ State 是管理一个 Task 的状态,那么一个 Flink Job 在运行过程中,是由很多的 Task 分布式并行运行组成的。保管和管理一个 Task 的状态,对于一个 Task 的容错来说,非常重要,同样,保存和管理这个 Job 的所有 Task 的状态,并保持一致,也同样非常重要。这是 Flink 的 Job 容错的最终解决方案。

​ Flink 容错机制的核心是对数据流做连续的分布式快照(snapshots),我们把每一次 take snapshot 动作称之为 Checkpoint。Checkpoint 是 Flink 实现容错机制最核心的功能,它能够根据配置周期性地基于 Stream 中各个 Operator/Task 的状态来生成快照,从而将这些状态数据定期持久化存储下来,当 Flink 程序一旦意外崩溃时,重新运行程序时可以有选择地从这些快照进行恢复,从而修正因为故障带来的程序数据异常。

​ 具体的概念(重要的总结):Flink 的 Checkpoint 机制基于 chandy-lamport 算法,在某一个时刻,对一个 Flink Job 的所有 Task 做一个快照拍摄(逻辑上解释),并且将快照保存在 内存/磁盘 中永久保存,这样子,如果 Flink Job 重启恢复,就可以从故障前最近一次的成功快照中进行状态恢复,从而实现保证 Flink 数据流式数据的一致性。当然,为了配合 Flink 能实现状态快照,并且 job 状态恢复,必须数据源具备数据回放功能。

​ 简单地说,Checkpoint 是一种分布式快照:在某一时刻,对某个 Flink 作业所有的 Task 做一个快照(snapshot),并且将快照保存在 memory / filesystem 等存储系统中。这样,在任务进行故障恢复的时候,就可以还原到任务故障前最近一次检查点的状态,从而保证数据的一致性。当然,为了保证 exactly-once / at-leastonce 的特性,还需要数据源支持数据回放。

​ 实现 Checkpoint 的核心是:Stream Barrier,它和普通消息无异,Stream barrier 作为一种标记信息插入到数据流和正常数据一起流动。barriers 永远不会超过记录,数据流严格有序,barrier 将数据流中的记录隔离成一系列的记录集合,并将一些集合中的数据加入到当前的快照中,而另一些数据加入到下一个快照中。每个 barrier 都带有快照的 ID,并且 barrier 之前的记录都进入了该快照。 barriers 不会中断流处理,非常轻量级。 来自不同快照的多个 barrier 可以同时在流中出现,这意味着多个快照可能并发地发生。

​ Flink 应用程序中的消息抽象其实是:BufferOrEvent(DataStream 数据流中的每条 记录 的数据抽象对象),它包含两个方面的信息:

01、Buffer:正常的待处理的数据
02、Event:嵌入到数据流中增强引擎流处理能力的特殊消息,包含 CheckpointBarrier 和 WaterMark
03、一个 DataStream 数据流中的数据其实有多种类型: data,checkpointbarrier,watermark

​ Flink 的 Checkpoint Coordinator 在需要触发检查点的时候要求数据源向数据流中注入 Stream Barrier(具体实现: CheckpointBarrier(checkpointID,timestamp)),当执行 Task 的 Operator 从他所有的 InputChannel 中都收到了 Stream Barrier 则会触发当前的 Operator 的快照拍摄,并向其下游 Operator发送 Stream Barrier。当所有的 SinkOperator 都反馈完成了快照之后, Flink Checkpoint Coordinator 认为 Checkpoint 创建成功。

​ 为了方便大家清楚理解 Checkpoint 的工作机制,在此提供了三张图:

图一:

在这里插入图片描述

图二:

在这里插入图片描述

图三:

在这里插入图片描述

​ 为什么要做对齐?

​ 目的是为了 确保 一条数据如果被一个 Operator/Task 消费,那么就一定要被所有 Operator/Task 消费。否则如果一条数据 被 上游Operator/Task 消费了,但是没有被下游 Operator/Task 消费,那么就会出现数据重复消费或者漏消费!

五、Chandy-Lamport 算法详解

​ Flink Checkpoint机制是 Flink 可靠性的基石,可以保证 Flink 集群在某个算子因为某些原因(如异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 证应用流图状态的一致性。

​ Flink 的 Checkpoint 机制就是依靠 Chandy-Lamport 算法进行设计实现。

5.1 步骤一:任务开启

步骤一:任务开启

在这里插入图片描述

5.2 步骤二:JobMananger 发起 Checkpoint

步骤二:JobMananger 发起 Checkpoint

1、JobManager 中有一个专门用来负责定期触发 Checkpoint 的定时任务的工作组件: CheckpointCoordinator
2、每次当触发 checkpoint 的时候,其实就是 JobManager 发送 triggerCheckpoint 的 RPC 请求给运行了给 job 的 Souorce Operator Task 所在的从节点(看一下下图,其实就是 Source Operator Task1 和 Source Operator Task)
3、Source Operator 每个 Task 接收到 triggerCheckpoint RPC 请求的时候,其实就是往数据流中嵌入一个 CheckpintBarrier 的消息记录。另外,CheckpintBarrier 拥有全局唯一的 ID, 同一次 checkpoint 的 CheckpointBarrier 的 id 是一样的。
4、当 Source Operator Task1 接收到到 CB(CheckpointBarrier) 的时候,要把 offset = 3 给持久化起来,同样的 Source Operator Task2 也是需要做这个事情。

在这里插入图片描述

5.3 步骤三:Source 上报 Checkpoint

步骤三:Source 上报 Checkpoint

1、由于 Source Operator Task1 和 Source Operator Task2 都接收到了一个 CB(CheckpointBarrier), 所以会将自己的 state 状态持久化保存。
2、这两个Source Operator Task 还得向 JobManager 中的 CheckpointCoordinator 进行汇报。那么也就意味着 Source Operator Task1 和 Source Operator Task2 对于此次 Checkpoint 已经执行完了。但是对于整体来说, CheckpointCoordinator 并不会认为这次 checkpoint 成功。因为整体上需要等到所有的 Task 都接收到这个 CB(CheckpointBarrier) 之后执行 state 的checkpiont 成功。
也就是说目前有两个task执行成功了已经汇报给JobManager了,但是其他的task可能还没有汇报。所以要等所有的汇报完毕,才代表整体OK。
3、如果当前 Task 处理 CB(CheckpointBarrier)成功了,那么需要将这个 CB(CheckpointBarrier) 广播到下游 Task 。也就是说下游出现分流的情况,需要在所有的流分区中都嵌入这个CheckpointBarrier 。 看下面图中的中间的四个红颜色的CB。

在这里插入图片描述

5.4 步骤四:Task的数据处理

步骤四:Task的数据处理

这个 绿色的4 要不要处理,其实是用来来定的

1、对齐:需要等待所有输入流中的同一个 checkpointID 的 checkpointBarrier 都接收到,然后再做checkpoint
2、非对齐:本该应该要等待所有输入数据流上的同一个 checkpointID 的 checkpointBarrier 都到齐之后做checkppoint,但是没有等。
看下图,本来 绿色的4是属于 CB 之后,也就是说是下一次 checkpoint 本该计算的数据,但是由于没有等待,所以这个Sum Operator Task1 也完成了绿色的4的计算。 造成了重复计算

这一个步骤中的重点:当某一个 Task 没有接收到 所有的 输入流中的同一个 checkpointID 的 checkpointBarrier 的话,是不会执行 checkpoint 的,那么这样的话:先接收到 CB 的输入流中的数据,就会被缓存起来。

CB(checkpointBarrier )之前的数据,都要执行处理
CB(checkpointBarrier )之后的数据,都不执行处理

在这里插入图片描述

5.5 步骤五:CheckpointBarrier 对齐

步骤五:CheckpointBarrier 对齐

1、第一个输入流上的 CB 接收到了之后,然后又接收到了 4 和 6, 但只是缓存起来,不做处理。
2、第二个输入流上的 CB 到了之后,那么也就意味着 Sum Operator Task1 的某一次 checkpointID 的所有的 CB 都到了,那就可以执行 checkpoint,所谓执行checkpoint也就是将 Task 的 state 做持久化。
3、工作顺序:当对齐之后,先做 checkpoint ,然后消费缓存中的数据。

在这里插入图片描述

5.6 步骤六:Task处理缓存数据

步骤六:Task处理缓存数据

在这里插入图片描述

5.7 步骤七:Sink 上报 Checkpoint

步骤七:Sink 上报 Checkpoint

在这里插入图片描述

最后得到的结论:

分布式流快照算法的思路:
当触发 checkpoint 的时候,往数据流中嵌入 checkpointbarrier, 其实这个checkpointbarrier就是个标记,表示当前这个checkpointbarrier标记之前的数据需要全部处理完成,标记之后的数据,在做checkpoint 之前不要处理,缓存起来。

其实这一次 checkpoint 执行成功了也就意味着当初嵌入到 CB 之前的数据,都已经执行完了,CB之后的数据都没有执行。

六、Flink Checkpoint 源码级配置详解

​ Flink 默认 Checkpoint 功能是 disabled 的,想要使用的时候需要先启用,checkpoint 开启之后,checkPointMode 有两种,Exactly-once 和 At-least-once,默认的checkPointMode 是 Exactly-once,Exactly-once 对于大多数应用来说是最合适的。At-least-once 可能用在某些延迟超低的应用程序(始终延迟为几毫秒)。

// 默认 checkpoint 功能是 disabled ,想要使用的时候需要先启用
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 每隔 1000ms 进行启动一个检查点   [设置checkpoint的周期]
env.enableCheckpointing(1000);

// 高级选项:
// 设置模式为 exactly-once (这是默认值)
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

// 检查点必须在一分钟内完成,或者被丢弃     【checkpoint 的超时时间】
env.getCheckpointConfig().setCheckpointTimeout(60000);

// 同时允许多个 checkpoint, 推荐不要改,就是 1 。
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);

// 确保检查点之间有至少 500ms 间隔   【 checkpoint 最小间隔】  下面都是测试数据,仅供参考。没有生产环境参考性。生产环境中自己根据实际情况设置。
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(6000);

// 表示 Flink 的处理程序被 cancel 后,会保留 Checkpoint 数据,以便根据实际需要恢复到指定的Checkpoint
env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

上述代码中,设置的关于 checkpoint 的参数,最终都是给 Jobmanager 中的 CheckpointCoordinator 去使用。

每个版本的参数有点不太一样,具体参照源码中的参数和解释:

// 该方法就是帮助我们去解析 checkpoint 有关所有的配置
public class CheckpointConfig{

    /**
     * Sets all relevant options contained in the {@link ReadableConfig} such as e.g. {@link
     * ExecutionCheckpointingOptions#CHECKPOINTING_MODE}.
     *
     * <p>It will change the value of a setting only if a corresponding option was set in the {@code
     * configuration}. If a key is not present, the current value of a field will remain untouched.
     *
     * @param configuration a configuration to read the values from
     */
    /**
     * AA  这个方法的内存的参数解析,是在所有所有的和checkpoint有关的参数解析。
     * @param configuration
     */
    public void configure(ReadableConfig configuration) {
        configuration
                //AA  checkpoint 的模式  ,模式是  EXACTLY_ONCE
                .getOptional(ExecutionCheckpointingOptions.CHECKPOINTING_MODE)
                .ifPresent(this::setCheckpointingMode);
        configuration
                //AA  两次checkpoint之间的间隔时间  。 通过 execution.checkpointing.interval 这个参数来进行设置。
                .getOptional(ExecutionCheckpointingOptions.CHECKPOINTING_INTERVAL)
                .ifPresent(i -> this.setCheckpointInterval(i.toMillis()));
        configuration
                //AA  execution.checkpointing.timeout = 10 min
                .getOptional(ExecutionCheckpointingOptions.CHECKPOINTING_TIMEOUT)
                .ifPresent(t -> this.setCheckpointTimeout(t.toMillis()));
        configuration
                //AA  最多同时运行的checkpoint的数量
                .getOptional(ExecutionCheckpointingOptions.MAX_CONCURRENT_CHECKPOINTS)
                .ifPresent(this::setMaxConcurrentCheckpoints);
        configuration
                //AA  两次checkpoint之间的停顿时间   默认是 0 
                .getOptional(ExecutionCheckpointingOptions.MIN_PAUSE_BETWEEN_CHECKPOINTS)
                .ifPresent(m -> this.setMinPauseBetweenCheckpoints(m.toMillis()));
        configuration
                .getOptional(ExecutionCheckpointingOptions.TOLERABLE_FAILURE_NUMBER)
                .ifPresent(this::setTolerableCheckpointFailureNumber);
        configuration
                .getOptional(ExecutionCheckpointingOptions.EXTERNALIZED_CHECKPOINT)
                .ifPresent(this::setExternalizedCheckpointCleanup);
        configuration
                .getOptional(ExecutionCheckpointingOptions.ENABLE_UNALIGNED)
                .ifPresent(this::enableUnalignedCheckpoints);
        configuration
                .getOptional(ExecutionCheckpointingOptions.CHECKPOINT_ID_OF_IGNORED_IN_FLIGHT_DATA)
                .ifPresent(this::setCheckpointIdOfIgnoredInFlightData);
        configuration
                .getOptional(ExecutionCheckpointingOptions.ALIGNED_CHECKPOINT_TIMEOUT)
                .ifPresent(this::setAlignedCheckpointTimeout);
        configuration
                .getOptional(ExecutionCheckpointingOptions.FORCE_UNALIGNED)
                .ifPresent(this::setForceUnalignedCheckpoints);
        configuration
                .getOptional(CheckpointingOptions.CHECKPOINTS_DIRECTORY)
                .ifPresent(this::setCheckpointStorage);
    }
}

​ 默认情况下,如果设置了 Checkpoint 选项,则 Flink 只保留最近成功生成的 1 个 Checkpoint,而当 Flink 程序失败时,可以从最近的这个 Checkpoint 来进行恢复。但是,如果我们希望保留多个 Checkpoint,并能够根据实际需要选择其中一个进行恢复,这样会更加灵活,比如,我们发现最近 4 个小时数据记录处理有问题,希望将整个状态还原到 4 小时之前 Flink 可以支持保留多个 Checkpoint,需要在 Flink 的配置文件 conf/flink-conf.yaml 中,添加如下配置,指定最多需要保存Checkpoint 的个数:

state.checkpoints.num-retained: 3

这样设置以后就查看对应的 Checkpoint 在 HDFS 上存储的文件目录

hdfs dfs -ls hdfs://hadoop10/flink/checkpoints

如果希望回退到某个 Checkpoint 点,只需要指定对应的某个 Checkpoint 路径即可实现

如果 Flink 程序异常失败,或者最近一段时间内数据处理错误,我们可以将程序从某一个 Checkpoint 点进行恢复

bin/flink run -s hdfs://hadoop10/flink/checkpoints/xxxx/chk-xx/_metadata flink-job.jar

程序正常运行后,还会按照 Checkpoint 配置进行运行,继续生成 Checkpoint 数据。

当然恢复数据的方式还可以在自己的代码里面指定 Checkpoint 目录,这样下一次启动的时候即使代码发生了改变就自动恢复数据。

七、Flink SavePoint 企业生产实践方案

​ SavePoint 可以认为是用户手动触发的 checkpoint , checkpoint 是系统自动触发的一个定期执行的工作

​ SavePoint 是一个重量级的 Checkpoint,你可以把它当做在某个时间点程序状态全局镜像,以后程序在进行升级,或者修改并发度等情况,还能从保存的状态位继续启动恢复。可以保存数据源 offset,Operator 操作状态等信息,可以从应用在过去任意做了 SavePoint 的时刻开始继续消费。

​ Flink SavePoint 的使用

1、在 flink-conf.yaml 中配置 Savepoint 存储位置
不是必须设置,但是设置后,后面创建指定 Job 的 Savepoint 时,可以不用在手动执行命令时指定 Savepoint 的位置
state.savepoints.dir: hdfs://hadoop10/flink/savepoints

2、触发一个 Savepoint【直接触发或者在 cancel 的时候触发】
停止程序:bin/flink cancel -s [targetDirectory] jobId [-yid yarnAppId]【针对 on yarn 模式需要指定 -yid 参数】

3、从指定的 Savepoint 启动 job
bin/flink run -s savepointPath [runArgs]

Flink Checkpoint 和 SavePoint 的区别到底是什么,这是困扰大家的一个疑惑,整理一下:

维度CheckpointSavePoint
概念Flink 提供的一种自动 Task 级别容错机制Flink 提供的用于随时保存应用程序全局状态的镜像到 HDFS
目的用于程序自动容错,快速恢复 Task用于应用程序升级,集群迁移,并行度伸缩等
用户交互Flink 系统行为应用程序管理员手动触发
状态文件保留策略系统内服务自动删除,可以通过参数调整会一直保留,由管理员维护

​ 用户手动执行,是指向 Checkpoint 的指针,不会过期,在集群升级/代码迁移等情况下使用。

​ 注意:为了能够在作业的不同版本之间以及 Flink 的不同版本之间顺利升级,强烈推荐程序员通过 uuid(String) 方法手动的给算子赋予 ID,这些 ID 将用于确定每一个算子的状态范围。如果不手动给各算子指定 ID,则会由 Flink 自动给每个算子生成一个 ID。只要这些 ID 没有改变就能从保存点(savepoint)将程序恢复回来。而这些自动生成的 ID 依赖于程序的结构,并且对代码的更改是很敏感的。因此,强烈建议用户手动的设置 ID。



声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

B站: https://space.bilibili.com/1523287361 点击打开链接
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

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

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

相关文章

Zabbix技术分享——如何使用zabbix监控华为云RDS

在数字化大背景下&#xff0c;数据是重要的生产资料&#xff0c;这些数据存放在哪里&#xff0c;如何保障数据安全是所有企业都要考虑的事情。华为云RDS凭借安全可靠&#xff0c;可根据业务规模动态扩容的特性&#xff0c;受到越来越多中小企业的青睐&#xff0c;对华为云RDS监…

NR PUSCH power control(一)

这篇看下NR PUSCH power control的相关内容&#xff0c;主要内容集中在38.213 7.1章节&#xff0c;功率计算无非就是一个长公式&#xff0c;根据RRC配置的参数及后续DCI field 的内容作出功率的调整&#xff1b;最初这部分看的就云里雾里的&#xff0c;最近再看&#xff0c;相比…

upload-labs通关

upload-labs通关 shell &#x1f349; 目录upload-labs通关PASS-01、PASS-02PASS-03PASS-04PASS-05PASS-06PASS-07PASS-08PASS-09PASS-10PASS-11PASS-12PASS-13PASS-14PASS-15PASS-16PASS-17PASS-18PASS-19PASS-20PASS-21shell能上传并能解析就算成功 PASS-01、PASS-02 图片…

最近要考pmp,哪个培训机构比较好?

你说的几个都是我着重了解过的&#xff0c;作为过来人&#xff0c;把我做的各大机构的优缺点给你参考吧~ PMP 机构排名的话&#xff0c;没有官方数据&#xff0c;网上数据仅供参考。这篇机构对比的文章&#xff0c;主流机构都有&#xff0c;你可以看看 下面说下我收集的每个机…

【数据库数据恢复】无法启动MongoDB服务的数据恢复案例

关于MongoDB数据库&#xff1a; MongoDB数据库存储方式是将文档存储在集合之中&#xff0c;而不是像Oracle、MySQL一样的关系型数据库。 MongoDB数据库是开源数据库&#xff0c;也提供具有附加功能的商业版本。 MongoDB中的数据是以键值对(key-value pairs)的形式显示的&…

[附源码]Python计算机毕业设计Django校友社交系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

“云办公”如何用任务协同工具搞定项目和团队管理?

导语&#xff1a;远程参加会议、团队协同作业、项目负责人进行任务分配、团队成员多人协同编辑文件及同时推进项目、人力部门在线进行审批报销……&#xff0c;随着“云办公”的加速普及&#xff0c;人们只需一台电脑、一部手机、一根网线&#xff0c;就能随时进入办公状态&…

云服务器及域名到期后,公安联网注销指南

云服务器及域名到期后&#xff0c;公安联网注销指南 公安联网备案及注销的操作流程都写在了官方文档中&#xff0c;可以进入全国互联网安全管理服务平台&#xff0c;在下载中心找到并下载 《互联网站安全服务平台操作指南》&#xff0c;按照操作指南进行备案及撤销。 以下图…

JS实现关闭图片窗口

JS实现关闭图片窗口 有趣的小案例池子&#xff1a; JS实现定时器 JS实现关闭图片窗口 JS实现输入检验 获取焦点后隐藏提示内容的输入框 JS实现获取鼠标在画布中的位置 聊天信息框显示消息 JS点击切换背景图 自动切换背景的登录页面 JS制作跟随鼠标移动的图片 JS实现记住用…

K8S Pod控制器详细讲解

文章目录一、Pod控制器介绍二、ReplicaSet(RS)三、Deployment(Deploy)1.镜像更新&#xff1a;2.版本回退3.金丝雀发布/灰度发布四、Horizontal Pod Autoscaler(HPA)五、DaemonSet(DS)六、Job七、CronJob(CJ)结尾一、Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在…

ArcGIS矢量化并进行拓扑检查

土地利用数据每年都在发生变化&#xff0c;故每年都要根据去年的数据进行修改。请根据以下要求&#xff0c;修改A区域的数据并对B区域已做好的数据进行拓扑检查。 01 数据说明 1. 地类图斑A.shp&#xff1a;A区域需要编辑修改的图斑数据。 2. 影像.tif&#xff1a;编辑A区域…

Docker数据卷自定义Docker镜像

目录 宿主机与容器之间的文件拷贝 引言&#xff1a;利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 数据卷 数据卷容器 Dockerfile自定义镜像 自定义tomcat8&#xff08;熟悉几乎所有的Dockerfile命令&#xff09; 宿主机与容器之间的文…

集群配置步骤_java培训

配置步骤 复制3个ZooKeeper zookeeper-3.4.9.tar.gz解压后拷贝到/myzookeeper目录下并重新名为zk01&#xff0c;再复制zk01形成zk02、zk03&#xff0c;共计3份 新增目录 进入zk01/02/03分别新建文件夹&#xff0c;mydata、mylog 新建配置文件 分别进入zk01-zk03各自的conf文件…

perflab 课程设计

初始状态 rotate 版本I 因为本题步步都在寻址而寻址的目标每一步又不同&#xff0c;并且在一个地址的值一次就赋值完毕&#xff0c;不会对同一个地址进行二次寻址&#xff0c;所以我首先想的改进方向就是使得寻址更加快速&#xff0c;于是我使得寻址的地址更加连续。 int i,…

【面试题】 javaScript 进阶之路 --- 《加深理解回调函数》

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 一. 函数 回调函数的基本概念我之前的文章虽然有些过&#xff0c;但是为了引入下文&#xff0c;在这里还是简单再提一嘴…

苹果电脑ntfs如何打开硬盘?mac能读取的硬盘格式

如今&#xff0c;使用Mac电脑的用户越来越多&#xff0c;但是不少用户却面临着一个问题&#xff0c;那就是Mac无法正常读写自己的NTFS格式的外置硬盘&#xff0c;硬盘上面保存着很多重要的文件数据&#xff0c;想要进行复制或者是编辑等&#xff0c;压根没有办法在Mac电脑上进行…

axios和SpringMVC数据交互(一维二维数组,JSON/form形式,@RequestBody/@RequestParam)

目录需求环境准备前端后端成功实现的案例以JSON形式发送double数组以JSON形式发送对象&#xff0c;对象中有数组以JSON形式发送对象&#xff0c;对象中有二维数组以x-www-form-urlencoded形式发送一维数组需求 前端或postman发送数组&#xff0c;后端controller做为入参接收 …

汽车专场 | 新能源汽车动力电池PACK CAE分析实例解读

一、PACK为什么需要CAE分析&#xff1f; PACK是新能源汽车最重要的组成部分&#xff0c;可称之为心脏&#xff0c;电池系统需要满足汽车运营条件下的苛刻力学环境的要求。按照传统研发方式&#xff0c;设计-样包-测试-优化-样包-测试&#xff0c;反复循环&#xff0c;这种传统…

学完高性能计算后的发展怎么样?

高性能计算行业是指从事高性能计算相关性质的生产、服务的单位或个体的组织结构体系的总称。深刻认知高性能计算行业定义&#xff0c;对预测并引导高性能计算行业前景&#xff0c;指导行业投资方向至关重要。 一、什么是高性能计算&#xff1f; 高性能计算指通常使用很多处理…

音视频学习(十四)——rtsp详解

概念 rtsp&#xff08;Real Time Streaming Protocol&#xff0c;RFC2326&#xff09;&#xff0c;实时流传输协议&#xff0c;是TCP/IP协议体系中的一个应用层协议。 该协议主要规定了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP体系结位于RTP和RTCP之上&#…