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

Flink的 RecordWriter 数据通道 详解

        本文从基础原理到代码层面逐步解释 Flink 的RecordWriter 数据通道,尽量让初学者也能理解。


1. 什么是 RecordWriter

通俗理解

        RecordWriter 是 Flink 中负责将数据从一个任务(Task)发送到下游任务的组件。想象一下,Flink 是一个巨大的工厂,数据像流水线上的包裹,RecordWriter 就是负责把包裹打包、贴上地址标签,然后通过“传送带”送到下一个站点的工人。

        在 Flink 的分布式计算中,数据处理分为多个并行任务(Task),每个任务可能需要把自己的处理结果发送给其他任务(比如下游的计算节点)。RecordWriter 的作用是:

  • 序列化数据:把数据变成可以在网络上传输的字节流。
  • 分配数据:决定数据应该发送到哪个下游任务(基于分区策略,比如 keyBy)。
  • 发送数据:通过底层的网络通道(比如 Netty)把数据传出去。

官方定义

        根据 Flink 官方文档,RecordWriter 是 Flink 数据流(DataStream)处理中用于将记录(Record)写入到输出通道的核心组件。它是 Flink 运行时(Runtime)层的一部分,位于任务的输出端,负责将上游算子处理后的数据发送到下游算子的输入端。


2. RecordWriter 的工作原理(宏观视角)

        为了让非专业人士理解,我们先从高层次看 RecordWriter 的工作流程,之后再深入到代码和底层细节。

工作流程(类比快递分拣)

  1. 接收包裹(数据记录)RecordWriter 从上游算子(比如 Map 或 Filter)接收到一条数据记录(Record),就像快递员拿到一个包裹。
  2. 贴标签(分区决策):根据用户定义的分区策略(比如 keyBy 或 broadcast),RecordWriter 决定这个包裹要送到哪个下游站点(下游子任务)。
  3. 打包(序列化):包裹不能直接扔到传送带上,RecordWriter 会把数据“打包”成字节流(序列化),方便在网络上传输。
  4. 选择传送带(通道选择):Flink 的任务之间通过逻辑通道(Channel)连接,RecordWriter 选择合适的通道(对应下游的子任务)。
  5. 送上传送带(发送数据)RecordWriter 把打包好的数据通过底层的网络栈(Netty)发送到下游任务。

核心问题

  • 如何确保数据高效传输? Flink 使用缓冲区(Buffer)管理数据,避免频繁的网络调用。
  • 如何保证数据顺序或分区正确? 依赖分区器(Partitioner)和通道选择器(ChannelSelector)。
  • 如何处理分布式环境中的复杂性? Flink 的运行时通过 ResultPartition 和 RecordWriter 抽象化网络通信。

3. 深入 RecordWriter 的源码实现

        现在我们结合 Flink 源码(基于 1.17 版本),从底层逐步分析 RecordWriter 的实现。我会用注释和伪代码的方式解释关键部分,并尽量用类比让逻辑清晰。

3.1 RecordWriter 的类结构

        RecordWriter 的核心代码位于 org.apache.flink.runtime.io.network.api.writer 包中。主要类是 RecordWriter,它是一个抽象类,实际使用的是其子类,比如 RecordWriterDelegate 或 ChannelSelectorRecordWriter

public abstract class RecordWriter<T> {protected final ResultPartitionWriter partitionWriter; // 输出分区protected final int numberOfChannels; // 下游通道数量protected final Random random; // 用于随机分区protected RecordWriter(ResultPartitionWriter writer) {this.partitionWriter = writer;this.numberOfChannels = writer.getNumberOfSubpartitions();this.random = new Random();}// 核心方法:发送一条记录public abstract void emit(T record) throws IOException, InterruptedException;
}
  • ResultPartitionWriterRecordWriter 依赖的分区写入器,负责管理输出缓冲区和实际的网络发送。
  • numberOfChannels:下游子任务的数量,决定了数据可以发送到多少个通道。
  • emit:核心方法,负责将一条记录发送出去。

3.2 数据发送的核心流程(emit 方法)

        emit 方法是 RecordWriter 的核心入口,我们以 ChannelSelectorRecordWriter(支持自定义分区策略的实现)为例,逐步分析其实现。

源码分析(简化和注释)

以下是 ChannelSelectorRecordWriter 的 emit 方法的核心逻辑(简化版,带详细注释):

public class ChannelSelectorRecordWriter<T> extends RecordWriter<T> {private final ChannelSelector<T> channelSelector; // 通道选择器(决定分区)private final SerializationDelegate<T> serializationDelegate; // 序列化代理public ChannelSelectorRecordWriter(ResultPartitionWriter writer,ChannelSelector<T> channelSelector,SerializationDelegate<T> serializationDelegate) {super(writer);this.channelSelector = channelSelector;this.serializationDelegate = serializationDelegate;}@Overridepublic void emit(T record) throws IOException, InterruptedException {// 1. 设置待序列化的记录serializationDelegate.setInstance(record);// 2. 使用通道选择器决定目标通道int channelIndex = channelSelector.selectChannel(record);// 3. 将记录写入目标通道的缓冲区partitionWriter.emitRecord(serializationDelegate.getSerializedData(), // 序列化后的数据channelIndex // 目标通道索引);}
}
步骤拆解与类比
  1. 设置记录(serializationDelegate.setInstance)

    • 类比:快递员拿到包裹,先登记包裹内容。
    • 原理serializationDelegate 是一个序列化代理,负责将用户的数据(比如 Java 对象)变成字节流。Flink 使用 SerializationDelegate 包装用户记录,延迟实际序列化操作,以提高性能。
    • 源码细节serializationDelegate.setInstance(record) 只是简单地将记录存储到代理对象中,实际序列化发生在后续的 getSerializedData 调用时。
  2. 选择通道(channelSelector.selectChannel)

    • 类比:快递员根据包裹上的地址标签,决定送到哪个分拣中心。
    • 原理ChannelSelector 是 Flink 提供的分区逻辑接口,用户可以通过 keyBybroadcast 等算子自定义分区策略。selectChannel 方法返回一个整数(channelIndex),表示数据应该发送到哪个下游子任务。
    • 常见实现
      • KeyGroupStreamPartitioner:基于 Key 的哈希分区(keyBy)。
      • BroadcastPartitioner:将数据广播到所有下游子任务。
      • ForwardPartitioner:直接发送到对应的下游任务(一对一)。
    • 推导
      • 假设用户定义了 keyBy(x -> x.getId())ChannelSelector 会提取记录的 id 字段,计算哈希值(比如 id.hashCode()),然后通过取模(hash % numberOfChannels)决定目标通道。
      • 公式:channelIndex=hash(key)mod  numberOfChannels
      • 这确保相同 key 的记录总是发送到同一个下游任务,满足 keyBy 的语义。
  3. 写入缓冲区(partitionWriter.emitRecord)

    • 类比:快递员把包裹装进集装箱(缓冲区),等待卡车运走。
    • 原理ResultPartitionWriter 是 Flink 运行时中管理输出分区的组件。emitRecord 方法将序列化后的数据写入目标通道的缓冲区(Buffer)。Flink 使用内存池(MemoryPool)管理缓冲区,避免频繁分配内存。
    • 源码细节
      public void emitRecord(BufferBuilder bufferBuilder, int targetSubpartition)throws IOException, InterruptedException {// 将序列化数据写入 BufferBuilderBufferConsumer bufferConsumer = bufferBuilder.createBufferConsumer();// 添加到目标子分区的队列addBufferConsumer(bufferConsumer, targetSubpartition);
      }
      
      • BufferBuilder:用于构建缓冲区,负责将数据写入内存。
      • BufferConsumer:表示一个可消费的缓冲区,供下游任务读取。
      • addBufferConsumer:将缓冲区加入目标子分区的队列,等待网络层发送。

3.3 序列化与缓冲区管理

序列化和缓冲区是 RecordWriter 性能的关键。

  • 序列化

    • Flink 使用 TypeSerializer(用户定义或自动推导)将数据对象转为字节流。
    • 类比:把包裹的内容拍成照片(字节流),方便通过网络传输。
    • 源码:SerializationDelegate.getSerializedData 调用 TypeSerializer.serialize
      public class SerializationDelegate<T> {private T instance;private final TypeSerializer<T> serializer;public StreamElement getSerializedData() throws IOException {// 使用序列化器将 instance 转为字节流return serializer.serialize(instance);}
      }
      
  • 缓冲区管理

    • Flink 的缓冲区基于 NetworkBufferPool,每个缓冲区是一个固定大小的内存块(默认 32KB)。
    • 类比:快递员把多个小包裹装进一个大集装箱,避免频繁调用卡车。
    • BufferBuilder 动态分配缓冲区,当缓冲区满时,会触发 BufferConsumer 的创建,并交给 ResultPartitionWriter

3.4 网络传输

  • 底层实现RecordWriter 不直接处理网络传输,而是通过 ResultPartitionWriter 将缓冲区交给 Flink 的网络栈(基于 Netty)。
  • 类比:集装箱装满后,卡车(Netty)把数据送到下游站点。
  • 原理
    • ResultPartitionWriter 将缓冲区写入 PipelinableSubpartition 的队列。
    • Flink 的网络层定期检查队列,使用 Netty 的 Channel 将数据发送到下游 TaskManager。
    • Netty 使用 TCP 协议,确保数据可靠传输。

4. 完整步骤总结(带推导)

        为了让初学者彻底理解,我将 RecordWriter 的工作流程总结为以下步骤,并为每一步提供通俗解释和公式推导(如果适用)。

  1. 接收数据记录

    • 描述:上游算子调用 RecordWriter.emit(record),传入一条数据。
    • 类比:快递员收到一个包裹。
    • 推导:无复杂计算,只是将 record 传递给 serializationDelegate
  2. 选择目标通道

    • 描述:ChannelSelector.selectChannel(record) 返回目标通道索引。
    • 类比:快递员看包裹地址,决定送到哪个分拣中心。
    • 推导:
      • 对于 keyBy 分区:
        • 提取 key:key=keySelector(record)
        • 计算哈希:hash=key.hashCode()
        • 选择通道:channelIndex=hashmod  numberOfChannels
      • 对于广播分区:返回所有通道索引。
      • 公式:channelIndex=f(record,numberOfChannels)
  3. 序列化数据

    • 描述:serializationDelegate.getSerializedData() 将记录转为字节流。
    • 类比:把包裹内容压缩成数字信号。
    • 推导:序列化过程依赖 TypeSerializer,复杂度为 O(size of record)。
  4. 写入缓冲区

    • 描述:partitionWriter.emitRecord 将字节流写入目标通道的缓冲区。
    • 类比:把包裹装进集装箱。
    • 推导:
      • 缓冲区大小固定(默认 32KB)。
      • 如果缓冲区满,触发 BufferBuilder.finish(),创建一个新的 BufferConsumer
      • 公式:bufferSize≤maxBufferSize
  5. 发送数据

    • 描述:缓冲区通过 Netty 传输到下游任务。
    • 类比:卡车把集装箱运到下一个站点。
    • 推导:网络传输的吞吐量取决于 Netty 的配置(线程数、TCP 参数等)。

5. 非专业人士的通俗总结

如果你完全不了解编程或分布式系统,可以把 RecordWriter 想象成一个智能快递员:

  • 任务:把包裹(数据)从一个工厂(任务)送到正确的下游工厂。
  • 步骤
    1. 拿到包裹,检查地址(分区策略)。
    2. 把包裹压缩打包(序列化)。
    3. 装进集装箱(缓冲区)。
    4. 选择正确的传送带(通道)。
    5. 交给卡车(网络)运走。
  • 聪明之处
    • 它会根据包裹的类型(key)确保送到正确的下游工厂。
    • 它会攒够一车包裹再送(缓冲区),避免浪费时间。
    • 它还能同时处理很多包裹(并行处理)。

6. 常见问题解答(Q&A)

Q1:RecordWriter 如何保证数据不丢失?

  • :Flink 的 RecordWriter 通过缓冲区和 Netty 的可靠传输(TCP)确保数据不丢失。如果下游任务失败,Flink 的检查点(Checkpoint)机制会回滚并重试。

Q2:为什么需要序列化?

  • :序列化把复杂的数据对象(比如 Java 类)变成字节流,方便通过网络传输。就像把一本书的内容拍成照片,方便快递寄出。

Q3:ChannelSelector 怎么决定分区的?

  • ChannelSelector 根据用户定义的逻辑(比如 keyBy 的 key)计算目标通道。对于 keyBy,它用哈希函数确保相同 key 的数据总是送到同一个下游任务。

7. 结合官方文档的补充

根据 Flink 官方文档(https://flink.apache.org/):

  • RecordWriter 是 Flink 运行时网络栈的一部分,位于 ResultPartition 和下游 InputGate 之间。
  • 它支持多种分区策略(StreamPartitioner),用户可以通过 DataStream API 灵活配置。
  • Flink 的网络传输基于高效的缓冲区管理和 Netty 框架,RecordWriter 是这一流程的起点。

文档中还提到,RecordWriter 的设计目标是:

  • 高吞吐量:通过缓冲区批量发送数据。
  • 低延迟:优化序列化和通道选择逻辑。
  • 灵活性:支持用户自定义分区策略。

8. 总结

        RecordWriter 是 Flink 数据流处理中不可或缺的组件,负责将数据高效、正确地发送到下游任务。通过序列化、分区选择、缓冲区管理和网络传输,它实现了分布式环境下数据流的可靠传递。

相关文章:

Flink的 RecordWriter 数据通道 详解

本文从基础原理到代码层面逐步解释 Flink 的RecordWriter 数据通道&#xff0c;尽量让初学者也能理解。 1. 什么是 RecordWriter&#xff1f; 通俗理解 RecordWriter 是 Flink 中负责将数据从一个任务&#xff08;Task&#xff09;发送到下游任务的组件。想象一下&#xff0c;…...

从keys到SCAN:Redis批量删除的进化之路

标签:Redis、批量删除、前缀匹配、性能优化 一、痛点分析:为什么需要批量删除指定前缀的键? 在 Redis 使用过程中,我们经常会遇到这样的场景: 需要对某一类数据进行清理,例如用户会话、缓存数据等,而这些数据通常以某种前缀命名(如 user:session:*、cache:data:*)。如…...

uniapp实现目录树效果,异步加载数据

uniapp目录树 父组件调用目录树组件 <DaTreeVue2:data"treeData":field"{label: name,key: id,}"change"handleTreeChange":defaultCheckedKeys"addressDefaultCheckedKey":defaultExpandedKeys"addressDefaultCheckedKey&qu…...

机器学习--网格搜索

引言 在机器学习的广袤世界里&#xff0c;构建一个性能卓越的模型是众多从业者不懈追求的目标。而模型性能的好坏&#xff0c;很大程度上依赖于超参数的设置。今天&#xff0c;我们就来深入探讨一种常用且有效的超参数调优方法 —— 网格搜索。 一、什么是网格搜索 网格搜索…...

Asp.NET Core WebApi 创建带鉴权机制的Api

构建一个包含 JWT&#xff08;JSON Web Token&#xff09;鉴权的 Web API 是一种常见的做法&#xff0c;用于保护 API 端点并验证用户身份。以下是一个基于 ASP.NET Core 的完整示例&#xff0c;展示如何实现 JWT 鉴权。 1. 创建 ASP.NET Core Web API 项目 使用 .NET CLI 或 …...

同步电路与异步电路详解

一、基本概念与核心区别 特性同步电路异步电路时钟依赖依赖全局时钟信号&#xff08;如CLK&#xff09;统一触发所有操作无全局时钟&#xff0c;依赖事件&#xff08;如信号跳变&#xff09;或握手协议时序控制所有操作在时钟边沿&#xff08;上升/下降沿&#xff09;同步执行…...

Vccaux_IO在DDR3接口中的作用

一、Vccaux_IO在DDR3接口中的作用 1.vccaux_io通常为FPGA的IO bank的辅助电源&#xff0c;用于支持特定电压的IO标准 2.在DDR3接口中&#xff0c;FPGA的IO bank需要DDR3芯片的电压(1.5v/1.35v)匹配 3.Vccaux_IO用于为FPGA的DDR3接口I/O Bank供电&#xff0c;其电压值、噪声和稳…...

5分钟读懂ArgoCD:在Kubernetes中实现持续部署

Kubernetes中的Argo CD介绍 Argo CD是用于Kubernetes的声明式GitOps持续交付工具。它遵循GitOps模式&#xff0c;以Git仓库作为定义所需应用程序状态的唯一真实来源&#xff0c;能在指定的目标环境中自动部署应用程序&#xff0c;并持续监控应用程序的运行状态&#xff0c;确保…...

Redis与Caffeine的结合使用详解(高效的二级缓存解决方案)

目录 一、Redis与Caffeine的结合使用&#xff08;一&#xff09;引入依赖&#xff08;二&#xff09;配置缓存&#xff08;三&#xff09;配置 Caffeine 缓存&#xff08;四&#xff09;配置 Redis 缓存&#xff08;五&#xff09;使用缓存 二、总结 一、Redis与Caffeine的结合…...

leetcode 322. Coin Change

这道题也是完全背包问题。注意与第518题和第377题对比。 这道题要求的是最少可以用多少个物品装满背包&#xff0c;不关心所选物品的组合方式和排列方式。因此&#xff0c;外层循环既可以是对物品的遍历&#xff0c;也可以是对容量的遍历。 第518题&#xff0c;要求的是装满背…...

mac|使用scrcpy实现无线Android投屏

scrcpy是一个开源项目&#xff0c;从项目的releases可以得知它适用于windows、linux、mac github&#xff1a;https://github.com/Genymobile/scrcpy/releases github中提供了应用于mac系统的静态版本&#xff08;也就是上图的scrcpy-macos-aarch64-v3.1.tar.gz和scrcpy-macos…...

2025年04月11日Github流行趋势

项目名称&#xff1a;ml-course 项目地址url&#xff1a;https://github.com/girafe-ai/ml-course项目语言&#xff1a;Jupyter Notebook历史star数&#xff1a;2880今日star数&#xff1a;207项目维护者&#xff1a;neychev, girafeai, v-goncharenko, vmarchenkoff, HCL-271项…...

深入浅出Redis 缓存使用问题 | 长文分享

目录 数据一致性 先更新缓存&#xff0c;后更新数据库【一般不考虑】 先更新数据库&#xff0c;再更新缓存【一般不考虑】 先删除缓存&#xff0c;后更新数据库 先更新数据库&#xff0c;后删除缓存【推荐】 怎么选择这些方案&#xff1f;采用哪种合适&#xff1f; 缓存…...

PINN:用深度学习PyTorch求解微分方程

神经网络技术已在计算机视觉与自然语言处理等多个领域实现了突破性进展。然而在微分方程求解领域&#xff0c;传统神经网络因其依赖大规模标记数据集的特性而表现出明显局限性。物理信息神经网络(Physics-Informed Neural Networks, PINN)通过将物理定律直接整合到学习过程中&a…...

Ubuntu vs CentOS:Shell 环境加载机制差异分析

CentOS与Ubuntu Shell环境加载机制差异及解决方案 一、问题现象还原 在 Ubuntu 系统中&#xff0c;希望登录时 /etc/profile.d/ipenv.sh 脚本未自动执行&#xff0c;而在 CentOS 上正常工作的根本原因是&#xff1a; Ubuntu 和 CentOS 采用了不同的 shell 初始化机制&#x…...

在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤

在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级配置。以下是详细步骤&#xff1a; 在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级…...

C语言 |位域结构体

在C语言中&#xff0c;位域结构体&#xff08;Bit-field Structure&#xff09;是一种通过按位分配内存优化存储空间的数据结构&#xff0c;特别适用于需要精确控制二进制位操作的场景&#xff08;如嵌入式开发、硬件寄存器操作等&#xff09;。以下是关于位域结构体的核心要点…...

Charles抓包-安装和IOS抓包指导

网络抓包工具使用指南 下载安装 目前市面上主流的抓包工具包括Charles和Sniff Master。其中Charles是一款老牌抓包工具&#xff0c;功能强大&#xff1b;而Sniff Master作为后起之秀&#xff0c;界面简洁&#xff0c;操作更加人性化。 建议从官网下载最新版本&#xff1a; …...

Redis 学习目标

&#x1f3af; Redis 学习目标&#xff08;开发者视角&#xff09; ✅ 一、学习完成后能掌握的核心能力&#xff1a; 分类具体内容&#x1f4e6; 基础能力熟练掌握 Redis 五大数据结构&#xff08;String、List、Hash、Set、ZSet&#xff09;&#xff0c;会用也会选对场景&am…...

Redis最佳实践——性能优化技巧之Pipeline 批量操作

Redis Pipeline批量操作在电商应用中的性能优化技巧 一、Pipeline核心原理与性能优势 1. 工作机制对比&#xff1a; sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis--&g…...

Redis 集群(Cluster)

1. Redis 集群概述 Redis 集群是一种分布式架构&#xff0c;旨在提供数据分区和高可用性。它能够通过将数据分散到多个节点上来扩展 Redis&#xff0c;使其能够处理更多的数据量和更高的并发请求。Redis 集群实现了自动分片、故障转移和复制等功能。 Redis 集群与传统的单节点…...

XSS 跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本

#MXSS &#xff1a; https://www.fooying.com/the-art-of-xss-1-introduction/ #UXSS &#xff1a; Universal Cross-Site Scripting&#xff08;一般是浏览器自身的问题&#xff09; UXSS 是利用浏览器或者浏览器扩展漏洞来制造产生 XSS 并执行代码的一种攻击类型。 MICR…...

数据库主从延迟全解析:原因、影响与解决之道

目录 一、引言&#xff1a;理解数据库主从架构 二、数据库主从延迟的定义与测量 2.1 主从延迟的技术定义 2.2 如何测量主从延迟 2.3 主从延迟对系统的影响 三、主从延迟的常见原因分析 3.1 网络延迟因素 3.1.1 网络质量与带宽限制 3.1.2 地理位置分布造成的延迟 3.2 …...

BERT、T5、ViT 和 GPT-3 架构概述及代表性应用

BERT、T5、ViT 和 GPT-3 架构概述 1. BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09; 架构特点 基于 Transformer 编码器&#xff1a;BERT 使用多层双向 Transformer 编码器&#xff0c;能够同时捕捉输入序列中每个词的左右上下文信息…...

第十七天 - Jenkins API集成 - 流水线自动化 - 练习:CI/CD流程优化

前言 在DevOps实践中&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;是现代软件工程的核心支柱。作为业界使用最广泛的自动化服务器&#xff0c;Jenkins凭借其强大的插件生态和灵活的流水线配置能力&#xff0c;成为企业级CI/CD落地的首选工具。本文将深入解析J…...

SageAttention2

“SageAttention2: Efficient Attention with Thorough Outlier Smoothing and Per-thread INT4 Quantization”由Jintao Zhang等人撰写。文章提出SageAttention2&#xff0c;通过线程级INT4量化、Q矩阵平滑、两级累加策略等技术&#xff0c;在提升注意力计算效率的同时保持精度…...

.NET WPF 可视化树(Visual Tree)

.NET WPF 可视化树&#xff08;Visual Tree&#xff09; WPF 的可视化树&#xff08;Visual Tree&#xff09;是描述用户界面元素层级关系的核心概念之一&#xff0c;它与逻辑树&#xff08;Logical Tree&#xff09;共同构成了 WPF 的 UI 架构。以下是关于 WPF 可视化树的详细…...

磁盘存储下红黑树、B 树与 B + 树的原理、操作及对比

前置知识 磁盘 在计算机系统中&#xff0c;数据存储与检索效率深刻影响着整体性能。磁盘作为大容量数据的主要载体&#xff0c;其独特的 I/O 特性与树状数据结构的结合&#xff0c;催生出 B 树与 B 树这两种经典方案。了解它们如何适配磁盘存储&#xff0c;是揭开数据库、文…...

kubernetes》》k8s》》Volume 数据卷 PVC PV NFS

为啥需要数据卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重…...

支持多格式且免费的图片转换工具推荐

软件介绍 今天要给大家推荐一款超好用的开源图片格式转换工具。这款工具完全免费&#xff0c;没有广告的干扰&#xff0c;让用户在使用过程中极为舒心。 ImageConverter图片格式转换 这款工具使用起来相当便捷&#xff0c;无需进行安装操作&#xff0c;只要轻轻双击图标&…...

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额—操作篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读396次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

K8S-证书更新时-误删除组件-

K8S 证书更新时-吴删除组件 [rootmaster ~] eth0 172.17.64.32 # docker rm -f docker ps | grep -E apiserver|scheduler|controller-manager| awk {print$1} 7856f2a3068e 2e1a6956d8a1 e9e3cb7870a9 31b19f4e2b22 c028146f88a5 abe4207808a3 [rootmaster ~] eth0 172.17.…...

第二章 Python爬虫篇—数据解析与提取

目录 一.数据解析概述 二.re解析和正则表达式 三.bs4解析-HTML语法 四.Xpath解析 此章节主要讲解&#xff1a;数据解析概述、re模块、bs4解析-html语法、xpath解析以及正则表达式。其中正则表达式我已经写过相关笔记&#xff0c;这里浅略叙述&#xff0c;如果不懂请看我笔记…...

数据仓库标准库模型架构相关概念浅讲

数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考&#xff1a;数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之&#xff0c;数据库是为捕获数据而设计&#xff0c;数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中&#xff0c;其会有自…...

【区块链+ 人才服务】特范云区块链教学管理平台 | FISCO BCOS 应用案例

北京特范云科技有限公司利用大数据与人工智能等核心技术优势&#xff0c; 构建了“学、练、赛、评”一体化智慧体育课堂&#xff0c;促进教育技术、体育科学、IT 技术与体育教学的深度融合。公司首次提出了“体育动作积木”的教学概念&#xff0c; 通过区块链技术将学生的体测体…...

第一节:React 基础篇-React虚拟DOM原理及Diff算法优化策略

必考点&#xff1a;虚拟DOM树对比&#xff08;同级比较、Key的作用、组件类型判断&#xff09; 延伸&#xff1a;React 18中并发更新对Diff算法的影响 React虚拟DOM原理及Diff算法优化策略 虚拟DOM核心原理 概念&#xff1a; • 虚拟DOM&#xff08;Virtual DOM&#xff09;…...

MQTT的构成、使用场景、工作原理介绍

一、MQTT内容简介 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备之间的…...

idea光标变成白色方块的解决方法

在使用 IDEA 进行编程时&#xff0c;你可能会遇到这样一个情况&#xff1a;原本纤细的光标突然变成了白色粗块&#xff0c;这不仅影响视觉体验&#xff0c;还可能在输入时带来困扰。别担心&#xff0c;本文将为你详细剖析该问题出现的原因&#xff0c;并提供有效的解决办法。​…...

python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]

1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…...

如何为C++实习做准备?

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1…...

Linux 安装 vscode

使用包管理器安装&#xff08;推荐&#xff09; 对于基于 Debian 的系统&#xff08;如 Ubuntu&#xff09;&#xff1a; sudo apt update sudo apt install software-properties-common apt-transport-https wget -qO- https://packages.microsoft.com/keys/microsoft.asc …...

淘宝商品数据实时抓取 API 开发指南:从接口申请到数据解析实战

一、引言​ 在当今电商蓬勃发展的时代&#xff0c;淘宝作为国内电商巨头&#xff0c;其平台上汇聚了海量商品信息。对于电商从业者、数据分析爱好者以及众多依赖淘宝商品数据开展业务的企业而言&#xff0c;能够实时获取淘宝商品数据具有极高价值。例如&#xff0c;电商运营者…...

明远智睿SSD2351核心板在物联网领域的应用实践

物联网作为当今科技发展的热门领域&#xff0c;将无数设备连接在一起&#xff0c;实现数据的采集、传输与共享&#xff0c;构建起一个智能化的世界。在这庞大的物联网体系中&#xff0c;核心板扮演着至关重要的角色&#xff0c;明远智睿SSD2351核心板以其独特优势&#xff0c;在…...

这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件

这种情况是应为VScode的版本太新了&#xff0c;更新到1.86版本后要求远程连接服务器的内核版本不符合条件 解决方法 vscode降级&#xff0c;使用1.86以前的版本。亲测这种方法成功解决 首先关闭VSCode自动更新 Windows下载1.85版本链接&#xff1a;https://update.code.visua…...

996引擎-源码学习:PureMVC Lua 中的 Facade 类

996引擎-源码学习:PureMVC Lua 中的 Facade 类 1. 核心概念1.1 外观模式1.2 多例模式2. 关键组件NotificationController:ModelView3. 主要功能4. 初始化流程5. 通信机制6. 生命周期管理1. Facade 初始化流程图2. 发送通知时序图中介者 PlayerBestRingLayerMediatorOpenLayer …...

前端学习10—Ajax

1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大优势为&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方…...

python的多线程和多进程程序编程

CPU密集型使用多进程&#xff0c;IO密集型使用多线程 查看进程ID和线程ID的命令分别是os.getpid()和threading.current_thread() 多进程使用multiprocessing就可以了&#xff0c;通常使用进程池来完成操作&#xff0c;阻塞主进程使用join方法 多线程使用threading模块&#…...

Python代码解释

文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下&#xff1a; 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...

DNS正反向解析复习,DNS主从服务,转发服务及DNS和nginx联合案例(不断更新)

正向解析 1、配置主机名 [rootlocalhost ~]# dnf install bash-completion -y #一个按tap键补全的软件 [rootlocalhost ~]# hostnamectl hostname dns #改主机名为dns [rootlocalhost ~]# exit ssh root你的IP地址 要重启才会生效2、安装bind [rootdns ~]# dnf install b…...

甜心速达智慧潮流精选超市、即时零售新业态,打造可持续发展商业模式

四川甜心速达科技有限公司、现公司运营高管团队均为美团高级运营师&#xff0c;公司高管团队人均获得“全国工商联人才交流服务中心”创业指导师、市场营销师等、公司致力于优化线上店铺人效比和资源匹配等问题&#xff0c;已经实现了对即时零售行业的资源整合&#xff0c;并融…...