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

Flink 数据源

原理

在 Flink 中,数据源(Source)是其中一个核心组件,负责从各种来源读取数据供 Flink 程序处理。

  • Flink 的数据源类型丰富,涵盖了从简单测试到生产环境使用的各种场景。
  • Kafka、Socket、文件和集合是 Flink 中最常见的几种数据源类型。
  • 用户还可以通过实现自定义的 SourceFunction 接口来创建符合自己需求的数据源。
  • Flink 的连接器生态也在不断发展壮大,为用户提供了更多的数据源选择。

核心组件

一个数据 source 包括三个核心组件:分片(Splits)、分片枚举器(SplitEnumerator) 以及 源阅读器(SourceReader)。

  1. 分片(Split)
  • 分片是对一部分source数据的包装,如一个文件或者日志分区。
  • 分片是source进行任务分配和数据并行读取的基本粒度。
  1. 分片枚举器(SplitEnumerator)
  • 分片枚举器负责生成分片,并将它们分配给SourceReader。
  • 该组件在JobManager上以单并行度运行,负责对未分配的分片进行维护,并以均衡的方式将其分配给reader。
  1. 源阅读器(SourceReader)
  • 源阅读器会请求分片并进行处理,例如读取分片所表示的文件或日志分区。
  • SourceReader在TaskManagers上的SourceOperators并行运行,并产生并行的事件流/记录流。
    Source 类作为API入口,将上述三个组件结合在了一起。
    在这里插入图片描述
    流处理和批处理的统一
    Data Source API 以统一的方式对无界流数据有界批数据进行处理。
    事实上,这两种情况之间的区别是非常小的:在有界/批处理情况中,枚举器生成固定数量的分片,而且每个分片都必须是有限的。但在无界流的情况下,则无需遵从限制,也就是分片大小可以不是有限的,或者枚举器将不断生成新的分片。

数据源构建

Flink中的数据源(Data Source)是Flink作业的起点,它可以从各种数据来源获取数据,例如文件系统、消息队列、数据库等。数据源可以是内置的(如基于集合、文件、Socket等),也可以是自定义的,或者是通过第三方连接器(如Kafka、RabbitMQ等)获取的。

数据读取与分配

  1. 数据读取
    SourceReader负责读取分片中的数据。对于不同的数据源,Flink提供了不同的读取方式。例如,对于Kafka数据源,SourceReader使用KafkaConsumer读取所分配的分片(Topic Partition)。
  2. 数据分配
    分片枚举器(SplitEnumerator)会生成分片并将它们分配给SourceReader。分配过程旨在确保数据的均衡读取,从而提高整体的处理效率。

Flink Data Source的原理主要涉及三个核心组件:分片、分片枚举器和源阅读器。数据源通过这三个组件的协作,实现了从各种数据源中读取数据,并将数据分配给相应的处理任务进行处理。通过这种方式,Flink可以高效地处理来自不同来源的大量实时数据。

API

Source API 是一个工厂模式的接口,用于创建以下组件。

  • Split Enumerator
  • Source Reader
  • Split Serializer
  • Enumerator Checkpoint Serializer

除此之外,Source 还提供了 Boundedness 的特性,从而使得 Flink 可以选择合适的模式来运行 Flink 任务。
Source 实现应该是可序列化的,因为 Source 实例会在运行时被序列化并上传到 Flink 集群。

SplitEnumerator

SplitEnumerator是数据源(Source)架构中的一个关键组件,它负责生成和管理数据分片(Splits),并将这些分片分配给SourceReader进行并行处理。以下是对SplitEnumerator的详细解释,基于参考文章的内容进行组织:

  1. 作用
  • 生成分片:SplitEnumerator负责生成数据源的分片,这些分片是数据读取的基本单位。
  • 分配分片:生成的分片会被SplitEnumerator分配给SourceReader,以便在TaskManagers上并行读取和处理数据。
  • 负载均衡:SplitEnumerator负责维护等待中的分片的积压平衡,并以均衡的方式将它们分配给SourceReader,以确保数据处理的效率和公平性。
  1. 主要方法
    参考文章提到SplitEnumerator包含以下方法:
  • start():启动分片枚举器。
  • handleSplitRequest(int subtaskId, @Nullable String requesterHostname):处理来自SourceReader的分片请求。
  • addSplitsBack(List splits, int subtaskId):当SourceReader失败时,收回已经分配但尚未被确认的分片。
  • addReader(int subtaskId):注册新的SourceReader。
  • snapshotState(long checkpointId) throws Exception:在检查点(checkpoint)时保存分片枚举器的状态。
  • close() throws IOException:关闭分片枚举器。
  1. SplitEnumerator与SourceReader的交互
  • SplitEnumerator与SourceReader之间存在紧密的交互关系。SourceReader会向SplitEnumerator请求分片,并处理接收到的分片数据。
  • 当SourceReader失败时,SplitEnumerator会调用addSplitsBack()方法收回已经分配但尚未被确认的分片,以便重新分配。

SourceReader

Flink的SourceReader是数据源架构中的一个关键组件,主要负责从SplitEnumerator获取分片(Split),并读取和处理这些分片中的数据。SourceReader是并行运行在Task Managers的source算子中,并且产出并行的时间流/记录流。

核心功能

  • 请求分片:SourceReader向SplitEnumerator请求分片,这是数据处理的起点。
  • 读取数据:一旦获得分片,SourceReader会读取分片中的数据,并准备进行后续的处理。
  • 数据处理:SourceReader对读取的数据进行处理,将其转换为Flink内部可以处理的格式,如DataStream。

交互过程

  1. 与SplitEnumerator的交互:SourceReader通过SplitEnumerator获取分片,并在处理完一个分片后,根据需要向SplitEnumerator请求更多的分片。
  2. 与Task Managers的交互:SourceReader运行在Task Managers上,与Task Managers进行交互以获取计算资源和执行环境。

状态与轮询

SourceReader提供了一个拉动式(pull-based)处理接口,Flink任务会在循环中不断调用pollNext(ReaderOutput)轮询来自SourceReader的记录。pollNext(ReaderOutput)方法的返回值指示SourceReader的状态,可能包括以下几种:

  • MORE_AVAILABLE:表示SourceReader有可用的记录。
  • NOTHING_AVAILABLE:表示SourceReader现在没有可用的记录,但是将来可能会有记录可用。
  • END_OF_INPUT:表示SourceReader已经处理完所有记录,到达数据的尾部。

优化

为了提高性能,SourceReader可以在一次pollNext()调用中返回多条记录。然而,除非有必要,SourceReader的实现应该避免在一次pollNext(ReaderOutput)的调用中发送多个记录,因为对SourceReader轮询的任务线程工作在一个事件循环(event-loop)中,且不能阻塞。

Flink的SourceReader是数据源架构中的核心组件,负责从SplitEnumerator获取分片,读取并处理这些分片中的数据。通过拉动式处理接口和与Task Managers的交互,SourceReader能够高效地处理大量实时数据,并产出并行的时间流/记录流供后续处理使用。

SplitReader API

核心的 SourceReader API 是完全异步的, 但实际上,大多数 Sources 都会使用阻塞的操作,例如客户端(如 KafkaConsumer)的 poll() 阻塞调用,或者分布式文件系统(HDFS, S3等)的阻塞I/O操作。为了使其与异步 Source API 兼容,这些阻塞(同步)操作需要在单独的线程中进行,并在之后将数据提交给 reader 的异步线程。
在 Flink 的数据源实现中,数据读取通常涉及以下组件和概念:

  1. SplitEnumerator:这是一个负责生成、管理和分配数据分片的组件。它运行在 JobManager 上,并与 SourceReader 交互,将分片分配给它们进行读取。
  2. SourceReader:这是实际执行数据读取的组件,它运行在 TaskManager 上。SourceReader 会从 SplitEnumerator 请求分片,并读取这些分片中的数据。
  3. SourceFunction:这是 Flink 数据源 API 的主要接口,用于定义如何从外部系统读取数据。在 SourceFunction 的实现中,开发者会处理与 SplitEnumerator 和 SourceReader 的交互逻辑。
    Spl
    itReader 是基于同步读取/轮询的 Source 的高级(high-level)API,例如 file source 和 Kafka source 的实现等。

核心是上面提到的 SourceReaderBase 类,其使用 SplitReader 并创建提取器(fetcher)线程来运行 SplitReader,该实现支持不同的线程处理模型。

SplitReader

SplitReader API 只有以下三个方法:

  • 阻塞式的提取 fetch() 方法,返回值为 RecordsWithSplitIds 。
  • 非阻塞式处理分片变动 handleSplitsChanges() 方法。
  • 非阻塞式的唤醒 wakeUp() 方法,用于唤醒阻塞中的提取操作。

SplitReader 仅需要关注从外部系统读取记录,因此比 SourceReader 简单得多。 请查看这个类的 Java 文档以获得更多细节。

SourceReaderBase

常见的 SourceReader 实现方式如下:

  • 有一个线程池以阻塞的方式从外部系统提取分片。
  • 解决内部提取线程与其他方法调用(如 pollNext(ReaderOutput))之间的同步。
  • 维护每个分片的水印(watermark)以保证水印对齐。
  • 维护每个分片的状态以进行 Checkpoint。

为了减少开发新的 SourceReader 所需的工作,Flink 提供了 SourceReaderBase 类作为 SourceReader 的基本实现。 SourceReaderBase 已经实现了上述需求。要重新编写新的 SourceReader,只需要让 SourceReader 继承 SourceReaderBase,而后完善一些方法并实现 SplitReader 。

SplitFetcherManager

SourceReaderBase 支持几个开箱即用(out-of-the-box)的线程模型,取决于 SplitFetcherManager 的行为模式。 SplitFetcherManager 创建和维护一个分片提取器(SplitFetchers)池,同时每个分片提取器使用一个 SplitReader 进行提取。它还决定如何分配分片给分片提取器。

例如,如下所示,一个 SplitFetcherManager 可能有固定数量的线程,每个线程对分配给 SourceReader 的一些分片进行抓取。
在这里插入图片描述

示例代码(概念性)

  1. 定义 Split 类(代表数据的一个分片)
// 这不是 Flink API 的一部分,只是示例  
class FileSplit {  private String filePath;  private long startOffset;  private long endOffset;  // 构造函数、getter 和 setter 等...  
}
  1. 实现 SplitEnumerator(负责管理 Split 的分配)
// 这不是 Flink API 的一部分,只是示例  
class FileSplitEnumerator implements SplitEnumerator<FileSplit, Void> {  // ... 省略其他实现细节 ...  @Override  public void start() {  // 启动时初始化分片,例如从文件系统中扫描文件  }  @Override  public CompletableFuture<SplitEnumeration<FileSplit>> getSplitsForSubtask(int subtaskId) {  // 根据 subtaskId 分配分片  // 这里只是一个简单的示例,实际中可能需要根据并行度等条件分配  List<FileSplit> splits = ...; // 从某处获取分片列表  return CompletableFuture.completedFuture(new ListSplitEnumeration<>(splits));  }  // ... 其他必要的方法实现 ...  
}
  1. 实现 SourceReader(负责读取 Split)
// 这不是 Flink API 的一部分,只是示例  
class FileSourceReader implements Runnable {  private final FileSplit split;  private final SourceOutput<String> sourceOutput; // 假设这是 Flink 提供的输出接口  public FileSourceReader(FileSplit split, SourceOutput<String> sourceOutput) {  this.split = split;  this.sourceOutput = sourceOutput;  }  @Override  public void run() {  try (BufferedReader reader = new BufferedReader(new FileReader(split.getFilePath()))) {  reader.skip(split.getStartOffset()); // 跳过之前的数据  String line;  while ((line = reader.readLine()) != null && reader.skipBytes(0) < split.getEndOffset()) {  // 将读取到的数据发送到 Flink 的 SourceOutput  sourceOutput.collect(line);  }  } catch (IOException e) {  // 处理异常  }  }  
}
  1. 在 SourceFunction 中使用
// 这才是 Flink 的 API 部分  
public class FileSourceFunction implements SourceFunction<String> {  private transient FileSplitEnumerator splitEnumerator;  private transient List<FileSourceReader> readers = new ArrayList<>();  @Override  public void run(SourceContext<String> ctx) throws Exception {  splitEnumerator = new FileSplitEnumerator();  splitEnumerator.start();  // 假设我们只有一个并行度,简单起见  SplitEnumeration<FileSplit> splits = splitEnumerator.getSplitsForSubtask(0).get();  for (FileSplit split : splits) {  FileSourceReader reader = new FileSourceReader(split, ctx::collect);  new Thread(reader).start(); // 注意:这里仅为示例,实际中应使用 Flink 的执行模型  readers.add(reader);  }  // 等待所有 reader 完成(这里只是概念性示例,实际中可能更复杂)  for (FileSourceReader reader : readers) {  // 假设有某种机制可以等待 reader 完成  }  // 通知 Flink 数据源已经完成  ctx.close();  }  // ... 其他必要的方法实现 ...  
}

提示:上述代码只是为了解释如何在 Flink 数据源内部实现类似于 SplitReader 的逻辑。在真实的 Flink 数据源实现中,需要使用 Flink 提供的 SourceFunction API 和相关的上下文(如 SourceContext)来正确地与 Flink 运行时集成。

相关文章:

Flink 数据源

原理 在 Flink 中&#xff0c;数据源&#xff08;Source&#xff09;是其中一个核心组件&#xff0c;负责从各种来源读取数据供 Flink 程序处理。 Flink 的数据源类型丰富&#xff0c;涵盖了从简单测试到生产环境使用的各种场景。Kafka、Socket、文件和集合是 Flink 中最常见…...

在本地电脑中如何用命令操作远程服务器上的数据库

日常做服务器维护&#xff0c;经常操作的2个事情&#xff0c;一个是备份远程服务器上的数据库到本地电脑&#xff0c;一个是将备份下来的数据库是恢复到本机做测试用。下面以阿里云的mysql为例&#xff0c;看看怎么弄。电脑是win10系统&#xff0c;先打开cmd命令行模式&#xf…...

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList&#xff1a;是父组件传递过来的值 通过 watch 监听&#xff08;在父组件中也同样可以使用&#xff0c;跟VUE的监听数据变化同理&#xff09; watch:{//监听组件中的数据变化swiperList(ol…...

Python容器化技术的15个Docker实践

今天&#xff0c;我们将一起探索如何利用Docker这一强大的容器化工具&#xff0c;来提升你的Python项目开发、部署效率。通过一系列由浅入深的实践案例&#xff0c;你将学会如何将Python应用装入“小盒子”&#xff0c;让它在任何地方都能轻松运行。 1. Docker入门&#xff1a…...

QT天气预报项目(写在简历上)

一、ui设计 实现功能:可以搜索不同的城市进行天气的查询,并且显示未来7天内的天气,并绘制出当天的最高气温和最低气温曲线图。 学到的知识: stylesheet界面美化 Json数据解析 HTTP通信get请求 使用事件过滤器绘制温度曲线 多控件处理(利用数组) 代码整合调试能力 二…...

从零到一建设数据中台 - 数据可视化

从零到一建设数据中台(八)- 数据可视化 一、数据可视化大屏 数据可视化是借助于图形化手段,清晰有效地传达与沟通信息。 将一些业务的关键指标通过数据可视化的方式展示到一块或多块LED大屏上,以大屏为主要展示载体的数据可视化设计。 在数据可视化大屏构建过程中,为了…...

一步步实现知乎热榜采集:Scala与Sttp库的应用

背景 在大数据时代&#xff0c;网络爬虫技术发挥着不可或缺的作用。它不仅能够帮助我们快速地获取互联网上的信息&#xff0c;还能处理和分析这些数据&#xff0c;为我们提供深刻的洞察。知乎&#xff0c;作为中国领先的问答社区&#xff0c;汇聚了各行各业的专家和广大用户的…...

Windows和Linux系统部署Docker(2)

目录 一、Linux系统部署docker 前置环境&#xff1a; 1.安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能 2.添加阿里云 docker-ce 仓库 3.安装docker软件包 4.启动 docker并设置开机自启 5.查看版本&#xff1a; 二、windows系统部署docker 1.查看…...

PyCharm中快速搭建Python虚拟环境的指南

在 PyCharm 中创建一个新的 Python 虚拟环境可以帮助你为不同的项目管理不同的依赖包&#xff0c;避免版本冲突。以下是在 PyCharm 中创建虚拟环境的步骤&#xff1a; 打开或创建一个项目: 如果你还没有打开 PyCharm&#xff0c;首先打开它&#xff0c;然后选择“Open”打开一个…...

C++模板元编程

C模板元编程 为什么需要模板函数&#xff1f; 避免重复写代码 模板函数定义 使用template <class T> 或者template <typename T>其中T是可以变成任何类型调用时候T会替换成需要的类型 twice<int>会将T替换成int template <class T> T twice(T t) {re…...

Lambda表达式与函数式接口

### 泛型&#xff08;Generics&#xff09; 泛型是Java SE 5引入的一个重要特性&#xff0c;它允许在类、接口和方法中使用类型参数&#xff0c;从而提供编译时的类型安全检查和更高的重用性。java public class GenericsExample {public static <T> void printList(Li…...

Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型&#xff0c;是开发过程中最常用的类型。 String类型的声明及初始化与基本数据类型非常相似&#xff1a; String name "lcy";但是String类型是引用类型&#xff0c;有着非常丰富的处理字符串的方法。正是因为其重…...

互联网政务应用安全管理规定:使用安全连接方式访问

前几日&#xff0c;由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部等4部门联合制定的《互联网政务应用安全管理规定》&#xff08;以下简称规定&#xff09;发布了&#xff0c;规定定义了互联网政务应用&#xff0c;也对互联网政务应用…...

安全测试用例及解析(Word原件,直接套用检测)

5 信息安全性测试用例 5.1 安全功能测试 5.1.1 标识和鉴别 5.1.2 访问控制 5.1.3 安全审计 5.1.4 数据完整性 5.1.5 数据保密性 5.1.6 软件容错 5.1.7 会话管理 5.1.8 安全漏洞 5.1.9 外部接口 5.1.10 抗抵赖 5.1.11 资源控制 5.2 应用安全漏洞扫描 5.2.1 应用安全漏洞扫描 5.3…...

github将默认分支main改为master

github将默认分支main改为master 1.进入github&#xff0c;点击setting 2.在setting中&#xff0c;选择Respositories&#xff0c;更新默认分支为master 3.选择要更新的项目&#xff0c;在项目中选择setting->general->切换默认分支...

java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader

问题描述&#xff1a;在maven项目中&#xff0c;给SAXReader创建实例&#xff0c;启动tomcat服务器后报异常java.lang.NoClassDefFoundError: org/dom4j/io/SAXReader。我在pom文件中是引入了dom4j依赖得&#xff0c;但是不知道为什么在上传到web时就找不到了 解决办法&#x…...

读后感:《SQL数据分析实战》运营SQL实用手册

学习SQL&#xff0c;先有用起来&#xff0c;有了使用价值&#xff0c;之后才是去了解它的原理&#xff0c;让使用更加顺畅。 在大部分业务场景中&#xff0c;通过SQL可以快速的实现数据处理与统计。《SQL数据分析实战》区别于其他工具书&#xff0c;它并没有介绍SQL是什么&…...

建设人工智能平台,主流GPU卡选型分析

国内外主流GPU卡性能分析&#xff01;2024&#xff01; 大模型兴起助推算力需求激增 2024年&#xff0c;深度学习与人工智能技术飞速跃进&#xff0c;Transformer、GPT-3等大模型在自然语言处理、图像识别、语音合成等领域大放异彩&#xff0c;开启AI新纪元。其庞大的参数与数…...

RTSPtoWebRTC、RTSPtoWeb ( 自HTML播放):页面中预览摄像机视频,无插件的播放方式,适合局域网使用,无需流媒体服务器

文章目录 引言I 环境准备II RTSPtoWebRTC2.1 下载和编译2.2 配置config.jsonIII RTSPtoWebRTC问题优化: 使用http接口生成视频资源进行播放3.1 调用http接口生成视频资源进行播放3.2 启动关闭IV RTSPtoWeb4.1 config.json4.2 RTSPPlayersee also引言 需求: 海域感知,云台监控…...

C语言| 三个整数从小到大排序

【分析思路】 三个整数从小到大排序 这个程序的算法是&#xff1a; 先把第一个数num1跟它后面所有的数相比较&#xff0c;找出最小的&#xff0c;通过中间变量temp交换,赋给num1&#xff1b; 接着中间值num2和它后面所有的数相比较&#xff0c;找出第二小的&#xff0c;然后赋给…...

C语言基础编程题目解析:探索逻辑与算法的奥秘

C语言基础编程题目解析&#xff1a;探索逻辑与算法的奥秘 在编程的世界里&#xff0c;C语言作为一门基础且强大的编程语言&#xff0c;其题目往往涵盖了丰富的逻辑和算法知识。下面&#xff0c;我们将从四个方面、五个方面、六个方面和七个方面&#xff0c;对一系列C语言基础编…...

jmeter基础入门练习题

jmeter存在A,B两个线程组的情况下&#xff0c;默认设置下&#xff0c;运行顺序是&#xff1a;A A&#xff1a;A,B同时运行 B&#xff1a;先运行A&#xff0c;在运行B C&#xff1a;先运行A&#xff0c;等待2s运行B D:先A运行完&#xff0c;等待默认设置时间后运行B 下列说法正…...

大数据技术原理(三):HDFS 最全面的 API 操作,你值得收藏

&#xff08;实验二 熟悉常用的HDFS操作&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解 HDFS在 Hadoop体系结构中的角色。 HDFS是一个分布式文件系…...

Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)

在上面篇文章中已经对flink进行了简单的介绍以及了解了Flink API 层级划分&#xff0c;这一章内容我们主要介绍DataStream API 流程图解&#xff1a; 一、DataStream API Source Flink 在流处理和批处理上的 source 大概有 4 类&#xff1a; &#xff08;1&#xff09;基于本…...

最好的电脑数据恢复软件是什么

由于硬件故障、恶意软件攻击或意外删除而丢失文件可能会造成巨大压力。数据丢失会扰乱日常运营&#xff0c;造成宝贵的业务时间和资源损失。在这些情况下&#xff0c;数据恢复软件是检索丢失或损坏数据的最简单方法。 数据恢复软件何时起作用&#xff1f; 对于 Windows 数据恢…...

机器学习模型调试学习总结

1.学习内容 模型调试方法&#xff1a;冻结部分层&#xff0c;训练剩余层 实践&#xff1a;在一个预训练的 BERT 模型上冻结部分层&#xff0c;并训练剩余的层 模型调试方法&#xff1a;线性探测&#xff08;Linear Probe&#xff09; 实践&#xff1a;在一个预训练的 BERT …...

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…...

【C++进阶】深入STL之string:掌握高效字符串处理的关键

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. STL基本…...

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…...

nginx搭建简单负载均衡demo(springboot)

目录 1 安装nignx 1.1 执行 brew install nginx 命令&#xff08;如果没安装brew可百度搜索如何安装brew下载工具。类似linux的yum命令工具&#xff09;。 1.2 安装完成会有如下提示&#xff1a;可以查看nginx的配置文件目录。 1.3 执行 brew services start nginx 命令启动…...

SpringBoot的第二大核心AOP系统梳理

目录 1 事务管理 1.1 事务 1.2 Transactional注解 1.2.1 rollbackFor 1.2.2 propagation 2 AOP 基础 2.1 AOP入门 2.2 AOP核心概念 3. AOP进阶 3.1 通知类型 3.2 通知顺序 3.3 切入点表达式 execution切入点表达式 annotion注解 3.4 连接点 1 事务管理 1.1 事务…...

react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 一、首先我们做动态f…...

halcon程序如何导出C#文件

1.打开halcon文件&#xff1b; 2.写好需要生成C#文件的算子或函数&#xff1b; 3.找到档案-输出&#xff0c;如下图&#xff1b; 4.点击输出&#xff0c;弹出如下窗口 &#xff08;1&#xff09;可以修改导出文件的存储路径 &#xff08;2&#xff09;选择C#-HALCON/.NET &…...

RabbitMQ三、springboot整合rabbitmq(消息可靠性、高级特性)

一、springboot整合RabbitMQ&#xff08;jdk17&#xff09;&#xff08;创建两个项目&#xff0c;一个生产者项目&#xff0c;一个消费者项目&#xff09; 上面使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;很多的代码都是重复书写的&#xff0c;使用springboot可以简化代码的…...

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…...

Centos升级Openssh版本至openssh-9.3p2

一、启动Telnet服务 为防止升级Openssh失败导致无法连接ssh&#xff0c;所以先安装Telnet服务备用 1.安装telnet-server及telnet服务 yum install -y telnet-server* telnet 2.安装xinetd服务 yum install -y xinetd 3.启动xinetd及telnet并做开机自启动 systemctl enable…...

茉莉香飘,奶茶丝滑——周末悠闲时光的绝佳伴侣

周末的时光总是格外珍贵&#xff0c;忙碌了一周的我们&#xff0c;终于迎来了难得的闲暇。这时&#xff0c;打开喜欢的综艺&#xff0c;窝在舒适的沙发里&#xff0c;再冲泡一杯香飘飘茉莉味奶茶&#xff0c;一边沉浸在剧情的海洋中&#xff0c;一边品味着香浓丝滑的奶茶&#…...

揭秘:Java字符串对象的内存分布原理

先来看看下面寄到关于String的真实面试题&#xff0c;看看你废不废&#xff1f; String str1 "Hello"; String str2 "Hello"; String str3 new String("Hello"); String str4 new String("Hello");System.out.println(str1 str2)…...

Vue.js - 生命周期与工程化开发【0基础向 Vue 基础学习】

文章目录 Vue 的生命周期Vue 生命周期的四个阶段Vue 生命周期函数&#xff08;钩子函数 工程化开发 & 脚手架 Vue CLI**开发 Vue 的两种方式&#xff1a;**脚手架目录文件介绍项目运行流程组件化开发 & 根组件App.vue 文件&#xff08;单文件组件&#xff09;的三个组成…...

Element-UI 快速入门指南

Element-UI 快速入门指南 Element-UI 是一套基于 Vue.js 的桌面端组件库,由饿了么前端团队开发和维护。它提供了丰富的 UI 组件,帮助开发者快速构建美观、响应式的用户界面。本篇文章将详细介绍 Element-UI 的安装、配置和常用组件的使用方法,帮助你快速上手并应用于实际项…...

2024华为OD机试真题-整型数组按个位值排序-C++(C卷D卷)

题目描述 给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序, 十进制最低位相同的元素,相对位置保持不变。 当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。 输入描述 给定一个非空数组,其元素数据类型…...

善听提醒遵循易经原则。世界大同只此一路。

如果说前路是一个大深坑&#xff0c;那必然是你之前做的事情做的不太好&#xff0c;当坏的时候&#xff0c;坏的结果来的时候&#xff0c;是因为你之前的行为&#xff0c;你也就不会再纠结了&#xff0c;会如何走出这个困境&#xff0c;是好的来了&#xff0c;不骄不躁&#xf…...

CrossOver有些软件安装不了 用CrossOver安装软件后如何运行

CrossOver为用户提供了三种下载软件的方式分别是&#xff1a;搜索、查找分类、导入。如果【搜索】和【查找分类】提供的安装资源不能成功安装软件&#xff0c;那么我们可以通过多种渠道下载安装包&#xff0c;并将安装包以导入的方式进行安装。这里我们以QQ游戏为例&#xff0c…...

在vue中如何使用leaflet图层展示地图

在vue中如何使用leaflet <template><div id"map" class"map"></div> </template><script> export default {data () {return {};},mounted(){this.initMaps()},methods: {initMaps () {const map L.map(map, {zoomControl…...

mybatisplus 字段存的是json 在查询的时候怎么映射成对象

数据库交互对象 TableName(value "表名", autoResultMap true)TableField(typeHandler JacksonTypeHandler.class, value "user_info")private User user;autoResultMap 是一个 MyBatis-Plus 中的注解属性&#xff0c;用于控制是否自动生成结果映射。…...

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…...

Git系列:rev-parse 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

【Java数据结构】详解LinkedList与链表(一)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.ArrayList的缺陷 3.链表的概念及结构 4.无头单向非循环链表的实现 4.1成员属性 4.2成员方法 createList display——打印链表 addFirst——头插 addLast…...

PDF高效编辑器革新:一键智能转换PDF至HTML,轻松开启文件处理全新时代!

信息爆炸的时代&#xff0c;PDF文件因其跨平台、不易修改的特性&#xff0c;成为了商务、教育、出版等领域不可或缺的文件格式。然而&#xff0c;PDF文件的固定性也带来了诸多不便&#xff0c;特别是在需要对其内容进行编辑或格式转换时。这时&#xff0c;一款高效、易用的PDF编…...

JDBC知识

JDBC是什么? 这工作中我们针对数据库的操作,实际上很少会用到SQL语句,通过命令行/图形化来操作数据库,更多的是通过主流的编程语言来对数据库进行操作,即使通过代码来操作数据,我们还是会使用到SQL语句,所以掌握SQL语句也是很重要的. 如何通过代码操作数据库? 通过代码操作…...