【Flink】Flink Checkpoint 流程解析

news2025/1/9 18:07:57

Flink Checkpoint 流程解析

Checkpoint 流程解析

  • Flink Checkpoint 流程解析
    • Checkpint 流程概括
    • Checkpoint 触发流程解析 (Flink 1.20)
      • 任务启动后 JobManager 开始定期对任务执行 Checkpoint
      • JobManager 使用 CheckpointCoordinator 触发 Checkpoint
        • CheckpointCoordinator 初始化 Checkpoint 所需要的信息
        • 触发所有 OperatorCoordinator Checkpoint
        • 触发 MastersHooks 状态快照
        • CheckpointCoordinator 通知子任务开始 Checkpoint
      • 子任务开始触发 Checkpoint
      • MailBoxProcessor 异步执行 Checkpoint 事件
        • 初始化输入端状态
      • 触发 StreamOperator 状态快照
      • 下游算子接收到 CheckpointBarrier 后开始 Checkpoint
      • CheckpointBarrierHandler 处理 Barrier

Checkpint 流程概括

任务运行后 JobMaster 定时执行 Checkpoint,JobMaster 会通过调用 CheckpointCoordinator 对作业进行 Checkpoint。

请添加图片描述

CheckpointCoordinator 开始进行 Checkpoint,它首先会先创建 PendingCheckpoint,然后开始给 Checkpoint 计时,再关闭网关开始触发 OperatorCoordinator 的 Checkpoint。

如果是 SourceOperatorCoordinator,则这时会调用 Source 的 getSplitSerializer,获取分片序列化器,然后将 SplitAssignmentTracker 中任务运行时分配的分片序列化创建 Snapshot,再将 Snapshot 放入 PendingCheckpoint 中。

OperatorCoordinator 状态触发完后,开始触发 MasterHooks 状态快照,MasterTriggerRestoreHook 由 UDFStreamOperator 内部的实现 WithMasterCheckpointHook 接口的 Function 创建,用于在 Master 触发 Checkpoint 时,Function 需要进行的操作。

MasterHooks 调用完后,CheckpointCoordinator 将给子任务 TaskManager 发送请求,通知它们开始 Checkpoint。

TaskExecutor 获取相应的任务 Task,Task 调用 StreamTask 开始进行 Checkpoint,StreamTask 调用 Mailbox 执行 Checkpoint 事件,Mailbox 执行 Checkpoint 事件时, Source 将不会从数据源读取数据。

Checkpoint 事件开始执行,如果 Checkpoint 需要强制对齐,那么需要异步创建 Channel 和结果分区的数据快照, 随后在执行传播 Barrier 前,SubtaskCheckpointCoordinatorImpl 会调用 OperatorChain 让 Operator 进行 Barrier 前的准备操作,然后开始往下游传播 Barrier。

SubtaskCheckpointCoordinatorImpl 创建 CheckpointBarrier 并将 CheckpointBarrier 发送给 RecordWriterOutput 将 Barrier 传输给下游任务,然后注册 Barrier 对齐超时计时器。

在这里插入图片描述
在这里插入图片描述

Barrier 传播完后,如果之前创建了 Channel 状态快照 ,那么还需要异步完成 Channel Output 的数据快照。

最后 SubtaskCheckpointCoordinatorImpl 开始对当前子任务的所有算子进行 Checkpoint,这时会进行算子创建快照时的操作,算子状态是存储在 OperatorStateBackend 和 KeyedStateBackend 中的, SubtaskCheckpointCoordinator 将会创建 OperatorStateBackend 和 KeyedStateBackend 的状态快照。

下游任务这时是正常处理上游发送过来的数据的,但是上游正在进行 Checkpoint,数据也是被发送过来的 CheckpointBarrier 分割开了,处理到后面会接收到上游的 CheckpointBarrier,也就表示着当前 Checkpoint 上游快照数据已经处理完,下游也开始进行 Checkpoint 了,下游进行 Checkpoint 的过程也是和上面的一样,继续调用 SubtaskCheckpointCoordinatorImpl 开始进行 Checkpoint。

总的来说,Checkpoint 将创建 Coordinator 状态、托管键值状态、托管算子状态、未处理的键值状态、未处理的算子状态、输入通道状态和结果分区状态的快照。

在这里插入图片描述


Checkpoint 触发流程解析 (Flink 1.20)

任务启动后 JobManager 开始定期对任务执行 Checkpoint

  • Task 任务恢复

    Task#restoreAndInvoke

    • 更新任务状态为 RUNNING 状态,TaskExecutor 通知 JobMaster 任务状态更新

      TaskManagerActions#updateTaskExecutionState

      TaskExecutor.TaskManagerActionsImpl#updateTaskExecutionState

      JobMasterGateway#updateTaskExecutionState

  • JobMaster 调用 SchedulerBase、DefaultExecutionGraph 更新任务状态,定期触发 Checkpoint

    JobMaster#updateTaskExecutionState

    SchedulerBase#updateTaskExecutionState

    DefaultExecutionGraph#updateState

    DefaultExecutionGraph#updateStateInternal

    • [CheckpointCoordinator 开始定期执行 Checkpoint](#JobManager 使用 CheckpointCoordinator 触发 Checkpoint)

      CheckpointCoordinator#startCheckpointScheduler

JobManager 使用 CheckpointCoordinator 触发 Checkpoint

  • JobMaster 触发 Checkpoint

    JobMaster#triggerCheckpoint

    • 调度器触发 Checkpoint

      SchedulerNG#triggerCheckpoint

      • 从 ExecutionGraph 中获取 CheckpointCoordinator,创建 CheckpointTriggerRequest,并使用 CheckpointCoordinator 通过 CheckpointRequestDecider 决定需要处理的 Checkpoint 请求触发 Checkpoint

        CheckpointCoordinator#triggerCheckpoint

        CheckpointRequestDecider#chooseRequestToExecute

        CheckpointCoordinator#startTriggeringCheckpoint

        • CheckpointCoordinator 初始化 Checkpoint 所需要的信息

        • 触发和通知所有 OperatorCoordinator 开始 Checkpoint

          OperatorCoordinatorCheckpoints#triggerAndAcknowledgeAllCoordinatorCheckpointsWithCompletion

        • 触发 MasterHooks 状态快照

          CheckpointCoordinator#snapshotMasterState

          MasterTriggerRestoreHook#triggerCheckpoint

        • CheckpointCoordinator 通知子任务开始 Checkpoint

CheckpointCoordinator 初始化 Checkpoint 所需要的信息
  • CheckpointCoordinator 初始化 Checkpoint 所需要的信息

    • 计算 Checkpoint 执行计划

    CheckpointPlanCalculator#calculateCheckpointPlan

    • 校验所有任务是否已经初始化

    • 如果有任务已经完成,那么创建所有任务完成后计算检查点的计划

      DefaultCheckpointPlanCalculator#calculateAfterTasksFinished

    • 如果没有任务完成,那么创建当所有任务都在运行时计算检查点的计划,该计划为所有任务都将标记为需要触发 Checkpoint,并将所有任务标记为需要等待和提交

      DefaultCheckpointPlanCalculator#calculateWithAllTasksRunning

    • 校验所有任务是否都在运行中

    • Checkpoint 计数加一

    • 创建待处理的的 Checkpoint

      CheckpointCoordinator#createPendingCheckpoint

      • 追溯待处理的 Checkpoint 状态

        CheckpointCoordinator#trackPendingCheckpointStats

        • 创建一个新的挂起检查点跟踪器

          CheckpointStatsTracker#reportPendingCheckpoint

        • 报告单个子任务的统计信息

          CheckpointCoordinator#reportFinishedTasks

      • 创建待处理的的 Checkpoint(PendingCheckpoint)

      • 开始 Checkpoint 计时,时间超时则取消 Checkpoint

      • 返回待处理的的 Checkpoint

    • 初始化 Checkpoint 地址

      CheckpointCoordinator#initializeCheckpointLocation

      • 如果该 Checkpoint 类型为 Savepoint,则初始化 Savepoint 地址

        CheckpointStorageCoordinatorView#initializeLocationForSavepoint

      • 否则,先初始化 Checkpoint Base 地址,再开始初始化地址

        CheckpointStorageCoordinatorView#initializeBaseLocationsForCheckpoint

        CheckpointStorageCoordinatorView#initializeLocationForCheckpoint

      • 返回 Checkpoint 地址

触发所有 OperatorCoordinator Checkpoint
  • 触发和通知所有 OperatorCoordinator 开始 Checkpoint

    OperatorCoordinatorCheckpoints#triggerAndAcknowledgeAllCoordinatorCheckpointsWithCompletion

    • 触发 OperatorCoordinator Checkpoint

      OperatorCoordinatorCheckpoints#triggerAllCoordinatorCheckpoints

      • 关闭网关,获取并等待所有事件完成

        OperatorCoordinatorHolder#closeGateways

        IncompleteFuturesTracker#getCurrentIncompleteAndReset

      • 网关标记当前的 Checkpoint

      • OperatorCoordinator 触发 Checkpoint

        OperatorCoordinator#checkpointCoordinator

      • 根据 Coordinator 的 Checkpoint 后的状态创建并返回 CoordinatorSnapshot

    • 通知所有 CheckpointCoordinator Checkpoint 结果

      OperatorCoordinatorCheckpoints#acknowledgeAllCoordinators

触发 MastersHooks 状态快照
  • 触发 MasterHooks 状态快照,MasterTriggerRestoreHook 由 UDFOperator 内部的实现 WithMasterCheckpointHook 接口的 UDF 创建,表示在 Master 触发 Checkpoint 时,UDF 可以做什么。

    CheckpointCoordinator#snapshotMasterState

    MasterTriggerRestoreHook#triggerCheckpoint

CheckpointCoordinator 通知子任务开始 Checkpoint
  • CheckpointCoordinator 给子任务发送 Checkpoint 请求

    CheckpointCoordinator#triggerCheckpointRequest

    • 发送任务 Checkpoint 请求

      CheckpointCoordinator#triggerTasks

      • 向所有的 Exeuction 对应的 Taskmanager 网关发送 Checkpoint 请求,子任务接收到请求后会开始触发 Checkpoint

        Execution#triggerCheckpointHelper

        TaskManagerGateway#triggerCheckpoint

    • 任务 Checkpoint 请求发送完后取消定时器

子任务开始触发 Checkpoint

  • TaskManager 触发指定子任务的 Checkpoint

    TaskExecutor#triggerCheckpoint

    Task#triggerCheckpointBarrier

    • 创建 Checkpoint 元数据 CheckpointMetaData

    • 算子 Mailbox 异步执行 Checkpoint,因为 Checkpoint 在 MailboxProcessor 执行,所以这时将不会有数据传入

      CheckpointableTask#triggerCheckpointAsync

      StreamTask#triggerCheckpointAsync

      • 如果 InputGateway 分区数据未处理完成,则触发未完成的数据通道 Checkpoint

        StreamTask#triggerUnfinishedChannelsCheckpoint

        这这情况是考虑已完成任务的 Checkpoint ,如果非 Source 任务成为新的主任务,则可能会通过 RPC 触发检查点。在这种情况下,他们将通知该检查点的 CheckpointBarrierHandle。

        • 创建一个 CheckpointBarrier,并通知所有未完成的 Channel 处理该 Barrier,并尝试触发 Checkpoint

          CheckpointBarrierHandler#processBarrier

      • 如果 InputGateway 分区数据已经处理完成,则直接开始触发 Checkpoint

        StreamTask#triggerCheckpointAsyncInMailbox

        • 初始化输入端 Channel 状态

          SubtaskCheckpointCoordinator#initInputsCheckpoint

        • SubtaskCheckpointCoordinatorImpl 开始执行 Checkpoint

          StreamTask#performCheckpoint

          SubtaskCheckpointCoordinator#checkpointState

MailBoxProcessor 异步执行 Checkpoint 事件

  • 算子调用 SubtaskCheckpointCoordinator 执行 Checkpoint

    SubtaskCheckpointCoordinatorImpl#checkpointState

    • 如果当前 Checkpint 被终止了,那么向下游发送 CancelCheckpointMarker事件,以防下游背压,并结束当前 Checkpoint。

    • 如果 Checkpoint 之前没有对齐过,并且 Checkpoint 配置的对齐类型是强制对齐,那么首先将当前 Checkpoint 类型设置为不再需要对齐了,然后初始化输入端的状态,可见初始化输入端状态

      CheckpointOptions#withUnalignedSupported

      SubtaskCheckpointCoordinatorImpl#initInputsCheckpoint

    • 准备 Checkpoint,算子执行 Snapshot 和 发送 Barrier 前的操作

      OperatorChain#prepareSnapshotPreBarrier

    • 创建 CheckpointBarrier,并往下游发送 CheckpointBarrier 事件,开始 Barrier 对齐操作

      OperatorChain#broadcastEvent

    • 注册对齐计时器以在超时时对齐未对齐的 barrier

      SubtaskCheckpointCoordinator#registerAlignmentTimer

    • 如果前面进行了 Channel Checkpoint,那么在这里完成状态通道 Writer 快照

      ChannelStateWriter#finishOutput

    • SubtaskCheckpointCoordinator 同步获取算子的所有的状态快照

      SubtaskCheckpointCoordinator#takeSnapshotSync

      • 如果 Checkpoint 是可超时和可不对齐的,则从 ChannelStateWriter 中获取通道状态写结果(ChannelStateWriteResult)

      • 解析 Checkpoint 存储地址

        SubtaskCheckpointCoordinatorImpl.CachingCheckpointStorageWorkerView#resolveCheckpointStorageLocation

      • 触发 OpeartorChain 状态快照

        OperatorChain#snapshotState

        • 如果是 RegularOperatorChain,则获取所有算子,并触发所有算子的状态快照

          RegularOperatorChain#buildOperatorSnapshotFutures

          • **构建 StreamOpeartor 算子状态快照 Future **

            StreamOperator#snapshotState

          • 如果算子是主算子或者是尾算子,那么将通道和结果分区的状态快照结果 Future 设置到AsyncCheckpointRunnable 中

        • 如果是FinishedOperatorChain,则只将通道和结果分区的状态快照结果 Future 设置到 OperatorSnapshotFutures 中

        • 向 CheckpointCoordinator 发送已接收 Checkpoint 事件

          OperatorChain#sendAcknowledgeCheckpointEvent

      • 清理 Checkpoint 缓存

        SubtaskCheckpointCoordinatorImpl.CachingCheckpointStorageWorkerView#clearCacheFor

      • 设置 Checkpoint 持续时间的指标

        CheckpointMetricsBuilder#setSyncDurationMillis

    • 如果获取 SnapShot 成功,则异步完成 Checkpoint

      SubtaskCheckpointCoordinator#finishAndReportAsync

      • 创建并异步执行 AsyncCheckpointRunnable

        AsyncCheckpointRunnable#start

        • 开始状态快照,并等待所有 SnapshotFuture 完成

          AsyncCheckpointRunnable#finalizedFinishedSnapshots

          AsyncCheckpointRunnable#finalizeNonFinishedSnapshots

        • 计算 Channel 和分区对齐时的状态大小,并设置相关指标

    • 否则,清理 SubtaskCheckpointCoordinator

      SubtaskCheckpointCoordinator#cleanup

初始化输入端状态
  • 子任务初始化 Checkpoint

    SubtaskCheckpointCoordinatorImpl#initInputsCheckpoint

    • 如果 Checkpoint 可不需要对齐

      • 初始化写状态通道

        ChannelStateWriter#start

        • 创建CheckpointStartRequest,并将请求分发到 Writer

          ChannelStateWriteRequestDispatcher#dispatch

          • 分发器处理 CheckpointStartRequest

            ChannelStateWriteRequestDispatcherImpl#handleCheckpointStartRequest

            • 为该子任务 Writer 注册 ChannelStateWriteResult,用于收集 Checkpoint 过程中传输过来的数据

              ChannelStateCheckpointWriter#registerSubtaskResult

      • 准备正在传输中的数据快照,等待输入端的数据达到 Barrier

        SubtaskCheckpointCoordinatorImpl#prepareInflightDataSnapshot

        • 准备输入端快照

          StreamTask#prepareInputSnapshot

          StreamTaskInput#prepareSnapshot

          • 网络输入端准备快照

            StreamTaskNetworkInput#prepareSnapshot

            • 获取所有还未处理的 Buffer,并添加到状态写状态通道中

              ChannelStateWriter#addInputData

            • 返回所有 Barriers 屏障接受 Future

        • 等所有 Barriers 屏障接受后,完成对给定检查点 id 的通道状态数据的写入

          • 将 CheckpointInProgressRequest 请求提交到通道状态写请求执行器(ChannelStateWriteRequestExecutor)中

          • 通道状态写请求执行器执行对应请求

            ChannelStateCheckpointWriter#completeInput

            • 完成状态写入,写入的状态存放在 ChannelStateWriteResult 中,里面存放着写入的状态柄 InputChannelStateHandle 和 ResultSubpartitionStateHandle

              ChannelStateCheckpointWriter#finishWriteAndResult

    • 如果 Checkpoint 是可超时的,那么除了上面准备输入端快照那一步骤外,其他步骤都需要进行

触发 StreamOperator 状态快照

  • 触发 StreamOperator 的 Checkpoint

    RegularOperatorChain#checkpointStreamOperator

    • StreamOperatorStateHandler 创建快照

      StreamOperatorStateHandler#snapshotState

      • 创建算子快照环境和算子快照 Futures

      • 真正的触发算子快照,该步操作可以通过算子自定义

        StreamOperatorStateHandler.CheckpointedStreamOperator#snapshotState

      • 算子和 Keyd 状态后端触发快照

        Snapshotable#snapshot

下游算子接收到 CheckpointBarrier 后开始 Checkpoint

  • 下游算子处理上游发送过来的事件

    CheckpointedInputGate#handleEvent

    • 如果接收到的事件为 CheckpointBarrier 事件,则开始处理 Barrier,尝试开始 Checkpoint

      CheckpointBarrierHandler#processBarrier

CheckpointBarrierHandler 处理 Barrier

  • CheckpointBarrierHandler 处理 Barrier

    CheckpointBarrierHandler#processBarrier

    • 如果该 Barrier Id 大于上一次 PendingCheckpoint 的 Id 并且当前开启的 Channel 只有一个,标记对齐开始和结束,并通知开始 Checkpoint,然后结束该次处理

      CheckpointBarrierHandler#markAlignmentStartAndEnd

      CheckpointBarrierHandler#notifyCheckpoint

      StreamTask#triggerCheckpointOnBarrier

      SubtaskCheckpointCoordinator#checkpointState

    • 否则尝试从等待的 Checkpoint 队列中寻找该 CheckpointBarrier

      • 如果找到了,则说明 Barrier 已经对齐,标记已经完成对齐,并开始触发 Checkpoint,可见[MailBoxProcessor 异步执行 Checkpoint 事件](#MailBoxProcessor 异步执行 Checkpoint 事件)

        CheckpointBarrierTracker#triggerCheckpointOnAligned

        CheckpointBarrierHandler#notifyCheckpoint

        StreamTask#triggerCheckpointOnBarrier

        SubtaskCheckpointCoordinator#checkpointState

      • 否则将该 Barrier 添加到Checkpoint 队列中,开始对齐

参考:
Flink Stateful Stream Processing:https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/concepts/stateful-stream-processing/

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

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

相关文章

MIT工具课第六课任务 Git基础练习题

如果您之前从来没有用过 Git,推荐您阅读 Pro Git 的前几章,或者完成像 Learn Git Branching 这样的教程。重点关注 Git 命令和数据模型相关内容; 相关内容整理链接:Linux Git新手入门 git常用命令 Git全面指南:基础概念…

Sui 主网升级至 V1.38.3

Sui 主网现已升级至 V1.38.3 版本,同时协议升级至 69 版本。请开发者及时关注并调整! 其他升级要点如下所示: 协议 #20199 在共识快速路径投票中设置允许的轮次数量。 节点(验证节点与全节点) #20238 为验证节点…

【AI系统】低比特量化原理

低比特量化原理 计算机里面数值有很多种表示方式,如浮点表示的 FP32、FP16,整数表示的 INT32、INT16、INT8,量化一般是将 FP32、FP16 降低为 INT8 甚至 INT4 等低比特表示。 模型量化则是一种将浮点值映射到低比特离散值的技术,可…

项目文章 | RNA-seq+WES-seq+机器学习,揭示DNAH5是结直肠癌的预后标志物

肿瘤突变负荷(TMB)已成为预测结直肠癌(CRC)患者预后和对免疫治疗反应的关键生物标志物。然而,全外显子测序(WES-seq)作为TMB评估的金标准,成本高且耗时。此外,高TMB患者之…

【NLP修炼系列之Bert】Bert多分类多标签文本分类实战(附源码下载)

引言 今天我们就要用Bert做项目实战,实现文本多分类任务和我在实际公司业务中的多标签文本分类任务。通过本篇文章,可以让想实际入手Bert的NLP学习者迅速上手Bert实战项目。 1 项目介绍 本文是Bert文本多分类和多标签文本分类实战,其中多分…

【CSS in Depth 2 精译_069】11.3 利用 OKLCH 颜色值来处理 CSS 中的颜色问题(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法(朴素版)2.2、Dijkstra算法(堆优化版)2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址:https://start.spring.io/ 修改为阿里云Server URL地址:https://star…

Git_如何更改默认路径

网上搜了一堆都不好使,其实可以直接使用git bash输入命令来解决 打开 Git Bash:首先打开 Git Bash 终端,这是一个类似于命令提示符的窗口,可在其中执行 Git 命令。设置 Git 默认存储路径:使用 git config 命令来修改 …

计算机毕业设计Python房价预测 房屋推荐 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

AndroidAutoSize实战教程:今日头条屏幕适配方案详解

如何在项目中结合 AndroidAutoSize 来进行今日头条屏幕适配,我会具体讲解如何用 AndroidAutoSize 实现屏幕适配,并结合 Kotlin 代码举例分析。 通过 AndroidAutoSize 库来实现屏幕适配,确保在不同的屏幕尺寸、分辨率、密度下,应用…

【HarmonyOS】层级轮播卡片效果

【HarmonyOS】层级轮播卡片效果 一、功能效果: 1.上下堆叠由大到小的卡片层叠效果。 2.上层卡片可手势左右滑动,自动左滑动。 3.三层卡片随滑动,内容进行依次切换。 二、开发思路 【完整代码见章节三】 1.最上层使用swiper进行轮播效果…

Postman自定义脚本Pre-request-script以及Test

这两个都是我们进行自定义script脚本的地方,分别是在请求执行的前后运行。 我们举两个可能经常运用到的场景。 (一)请求A先执行,请求B使用请求A响应结果作为参数。如果我们不用自定义脚本,可能得先执行请求A,然后手动复制响应结果…

一些引入依赖,提示引入方式报错的问题

背景 当我们使用gulp自动化处理文件的时候,难免会遇到需要按照一定条件过滤的需求,这里博主所遇到问题是,通过文件内容中是否包含 某一串字符串 决定过滤当前的文件 比如: 碰到文件中包含注释 * replace-note 此文件未被引用 ,那…

R语言 | 峰峦图 / 山脊图

目的:为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …

6月份stable diffusion animatediff等插件使用指南,又来更新了

插件一直会更新,包含了基本市面上流行的90%插件,好用的插件更是不会错过,往期插件请看往期文章,如果你没有时间一直关注sd更新的进展,请关注我,一个月用几个小时看一下我的文章,最短时间跟进sd。…

jmeter配置

单接口运行没问题,但是批量执行100个线程数发现总是提示请求不合法 最后发现 需要将配置改成 正好回归一下这个配置: Ramp-Up时间(秒)的定义: Ramp-Up时间是指在JMeter测试中,所有指定的线程&#xff08…

WPF中的VisualState(视觉状态)

以前在设置控件样式或自定义控件时&#xff0c;都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。 像这样&#xff1a; <Style TargetType"ListBoxItem"><Setter Property"Opacity" Value"0.5" /><Setter …

如何利用Java爬虫获得商品类目

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言&#xff0c;获取商品类目数据尤为重要&#xff0c;因为这些数据可以帮助他们更好地理解市场…

【Linux】程序的编译过程

程序的翻译过程 预处理&#xff08;头文件展开&#xff0c;条件编译&#xff0c;宏替换&#xff0c;去注释&#xff09;编译 &#xff1a;把c变成汇编语言汇编 &#xff1a;把汇编变成二进制&#xff08;不可执行&#xff0c;二进制目标文件&#xff09;链接 &#xff1a;把自…