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

Flink 任务调度机制

一、Task 任务调度执行流程

一、Graph 的概念

        Flink 中的执行图可以分为四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图。

  • StreamGraph:执行用户代码中的 env.execute() 方法后,根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。
  • JobGraph:StreamGraph 经过优化(合并算子链、设置并行度、优化分区策略等)后生成 JobGraph, 是客户端提交给 JobManager 的数据结构。
  • ExecutionGraph:JobManager 根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 JobGraph 的并行化版本,是调度层最核心的数据结构。
  • 物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个 TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构。

        例如 example 里的 WordCount 并行度为 2 (Source 为 1 个并行度)的四层执行图的演变过程如下所示:

public static void main(String[] args) throws Exception {// Checking input parametersfinal MultipleParameterTool params = MultipleParameterTool.fromArgs(args);// set up the execution environmentfinal StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// make parameters available in the web interfaceenv.getConfig().setGlobalJobParameters(params);// get input dataDataStream<String> text = null;if (params.has("input")) {// union all the inputs from text filesfor (String input : params.getMultiParameterRequired("input")) {if (text == null) {text = env.readTextFile(input);} else {text = text.union(env.readTextFile(input));}}Preconditions.checkNotNull(text, "Input DataStream should not be null.");} else {System.out.println("Executing WordCount example with default input data set.");System.out.println("Use --input to specify file input.");// get default test text datatext = env.fromElements(WordCountData.WORDS);}DataStream<Tuple2<String, Integer>> counts =// split up the lines in pairs (2-tuples) containing: (word,1)text.flatMap(new Tokenizer())// group by the tuple field "0" and sum up tuple field "1".keyBy(value -> value.f0).sum(1);// emit resultif (params.has("output")) {counts.writeAsText(params.get("output"));} else {System.out.println("Printing result to stdout. Use --output to specify output path.");counts.print();}// execute programenv.execute("Streaming WordCount");}

相关术语解释:

StreamGraph:

        StreamNode:用来代表 operator 的类,并具有所有的相关属性,如并行度、入边和出边等。

        StreamEdge:表示连接两个 StreamEdge 的边。

JobGraph:

        JobVertex:经过优化后符合条件的多个 StreamNode 可能会 chain 在一起生成一个 JobVertex,即一个 JobVertex 包含一个或多个 operator,JobVertex 的输入是 JobEdge,输出是 IntermediateDataSet。

        IntermediateDataSet:表示 JobVertex 的输出,经过 operator 处理产生的数据集。producer 是 JobVertex,consumer 是 JobEdge。

        JobEdge:代表了 JobGraph 中的一条数据传输通道。source 是 IntermediateDataSet,target 是 JobVertex。即数据通过 JobEdge 由 IntermediateDataSet 传递给目标 JobVertex。

 ExecutionGraph:

        ExecutionJobVertex:和 JobGraph 中的 JobVertex 一一对应。每个 ExecutionJobVertex 都有和并行度一样多的 ExecutionVertex。

        ExecutionVertex:表示 ExecutionJobVertex 的其中一个并行子任务,输入是 ExecutionEdge,输出是 IntermediateResultPartition。

        IntermediateResult:和 JobGraph 中的 IntermediateDataSet 一一对应。一个 IntermediateResult 包含多个 IntermediateResultPartition,其个数等于该 operator 的并行度。

        IntermediateResultPartition:表示 ExecutionVertex 的一个输出分区,producer 是 ExecutionVertex,consumer 是若干个 ExecutionEdge。       

        ExecutionEdge:表示 ExecutionVertex 的输入,source 是 IntermediateResultPartition,target 是 ExecutionVertex。source 和 target 都只能是一个。

        Execution:是执行一个 ExecutionVertex 的一次尝试。当发生故障或者数据需要重算的情况下 ExecutionVertex 可能会有多个 ExecutionAttemptID。一个 Execution 通过 ExecutionAttemptID 来唯一标识。JM 和 TM 之间关于 task 的部署和 task status 的更新都是通过 ExecutionAttemptID 来确定消息接收者。 

        归纳:       

  • 由于每个 JobVertex 可以有多个 IntermediateDataSet,所以每个 ExecutionJobVertex 可以有多个 IntermediaResult,因此每个 ExecutionVertex 也可以包含多个 IntermediateResultPartition;
  • ExecutionEdge 主要的作用是把 ExecutionVertex 和 IntermediateResultPartition 连接起来,表示它们之间的连接关系。

物理执行图:

        ResultPartition:代表由一个 Task 生成的数据,和 ExecutionGraph 中的 IntermediateResultPartition 一一对应。

        ResultSubPartition:是 ResultPartition 的一个子分区。每个 ResultPartition 包含多个 ResultSubPartition,其数目要由下游消费 Task 数和 DistributionPartition 来决定。

        InputGate:代表 Task 的输入封装,和 JobGraph 中 JobEdge 一一对应。每个 InputGate 消费了一个或多个的 ResultPartition。

        InputChannel:每个 InputGate 会包含一个以上的 InputChannel,和 ExecutionGraph 中的 ExecutionEdge 一一对应,也和 ResultSubpartition 一对一的相连,即一个 InputChannel 接收一个 ResultSubPartition 的输出。

二、Graph 生成的底层代码

2.1 StreamGraph 在 Client 生成

执行用户代码中的 StreamExecutionEnvironment.execute()

        -> execute(getJobName())

                -> execute(getSStreamGraph())

                        -> getStreamGraph(jobName,true)

StreamExecutionEnvironment.java

public StreamGraph getStreamGraph(String jobName, boolean clearTransformations) {StreamGraph streamGraph = getStreamGraphGenerator().setJobName(jobName).generate();if (clearTransformations) {this.transformations.clear();}return streamGraph;
}

调用了 StreamGraphGenerator 的 generate() 方法

public StreamGraph generate() {streamGraph = new StreamGraph(executionConfig, checkpointConfig, savepointRestoreSettings);shouldExecuteInBatchMode = shouldExecuteInBatchMode(runtimeExecutionMode);configureStreamGraph(streamGraph);alreadyTransformed = new HashMap<>();/*TODO transformations是一个list,依次存放了用户代码里的算子*/for (Transformation<?> transformation: transformations) {transform(transformation);}final StreamGraph builtStreamGraph = streamGraph;alreadyTransformed.clear();alreadyTransformed = null;streamGraph = null;return builtStreamGraph;
}

        一个关键的参数是 List<Transformation<?>> transformations。Transformation 代表了从一个或多个 DataStream 生成新的 DataStream 的操作。DataStream 的底层就是一个 Transformation,描述了这个 DataStream 是怎么来的。

        DataSteam 上常见的 transformation 有 map、flatmap、filter 等。这些 transformation 会构造出一个 StreamTransformation 树,通过这棵树转换成 StreamGraph。

        以 map 为例,分析 List<Transformation<?>> transformations 的数据:

DataStream.java

public <R> SingleOutputStreamOperator<R> map(MapFunction<T, R> mapper) {// 通过 java reflection 抽出的 mapper 的返回值类型TypeInformation<R> outType = TypeExtractor.getMapReturnTypes(clean(mapper), getType(),Utils.getCallLocationName(), true);return map(mapper, outType);
}public <R> SingleOutputStreamOperator<R> map(MapFunction<T, R> mapper, TypeInformation<R> outputType) {// 返回一个新的DataStream,StreamMap 为 StreamOperator 的实现类return transform("Map", outputType, new StreamMap<>(clean(mapper)));
}public <R> SingleOutputStreamOperator<R> transform(String operatorName,TypeInformation<R> outTypeInfo,OneInputStreamOperator<T, R> operator) {return doTransform(operatorName, outTypeInfo, SimpleOperatorFactory.of(operator));
}protected <R> SingleOutputStreamOperator<R> doTransform(String operatorName,TypeInformation<R> outTypeInfo,StreamOperatorFactory<R> operatorFactory) {// read the output type of the input Transform to coax out errors about MissingTypeInfotransformation.getOutputType();// 新的 transformation 会连接上当前 DataStream 中的 transformation,从而构建成一棵树OneInputTransformation<T, R> resultTransform = new OneInputTransformation<>(this.transformation,operatorName,operatorFactory,outTypeInfo,environment.getParallelism());@SuppressWarnings({"unchecked", "rawtypes"})SingleOutputStreamOperator<R> returnStream = new SingleOutputStreamOperator(environment, resultTransform);// 所有的 transformation 都会存到 env 中,调用 execute() 时遍历该 list 生成 StreamGraphgetExecutionEnvironment().addOperator(resultTransform);return returnStream;}

        从上方代码可以了解到,map 转换用户自定义的函数 MapFunction 包装到 StreamMap 这个 Operator 中,再将 StreamMap 包装到 OneInputTransformation,最后该 transformation 存到 env 中,当调用 env.execute() 时,遍历其中的 transformation 集合构造出 StreamGraph。分层实现如下图所示:

        另外,并不是每一个 StreamTransformation 都会转换成 runtime 层中的物理操作。有一些只是逻辑概念,比如 union、split / select、partition 等。如下图所示的转换树,在运行时会优化成下方的操作图。
        union、split / select、partition 中的信息会被写入到 Source -> Map 的边中。通过源码也可以发现 UnionTransformation、SplitTransformation、SelectTransformation、PartitionTransformation 由于不包含具体的操作,所以都没有 StreamOperator 成员变量,而其他的 StreamTransformation 的子类基本上都有。

        继续分析 StreamGraph 生成的源码:

        StreamExecutionEnvironment.getStreamGraph() -> StreamGraphGenerator.generator() -> StreamGraphGenerator.transform()

        StreamGraphGenerator.java

// 对每个 transformation 进行转换,转换成 StreamGraph 中的 StreamNode 和 StreamEdge
// 返回值为该 transform 的 id 集合,通常大小为 1 个(除 FeedbackTransformation)
private Collection<Integer> transform(Transformation<?> transform) {if (alreadyTransformed.containsKey(transform)) {return alreadyTransformed.get(transform);}LOG.debug("Transforming " + transform);if (transform.getMaxParallelism() <= 0) {// if the max parallelism hasn't been set, then first use the job wide max parallelism// from the ExecutionConfig.int globalMaxParallelismFromConfig = executionConfig.getMaxParallelism();if (globalMaxParallelismFromConfig > 0) {transform.setMaxParallelism(globalMaxParallelismFromConfig);}}// call at least once to trigger exceptions about MissingTypeInfo// 为了触发 MissingTypeInfo 的异常transform.getOutputType();@SuppressWarnings("unchecked")final TransformationTranslator<?, Transformation<?>> translator =(TransformationTranslator<?, Transformation<?>>) translatorMap.get(transform.getClass());Collection<Integer> transformedIds;if (translator != null) {transformedIds = translate(translator, transform);} else {transformedIds = legacyTransform(transform);}// need this check because the iterate transformation adds itself before// transforming the feedback edgesif (!alreadyTransformed.containsKey(transform)) {alreadyTransformed.put(transform, transformedIds);}return transformedIds;}
private Collection<Integer> translate(final TransformationTranslator<?, Transformation<?>> translator,final Transformation<?> transform) {checkNotNull(translator);checkNotNull(transform);final List<Collection<Integer>> allInputIds = getParentInputIds(transform.getInputs());// the recursive call might have already transformed thisif (alreadyTransformed.containsKey(transform)) {return alreadyTransformed.get(transform);}final String slotSharingGroup = determineSlotSharingGroup(transform.getSlotSharingGroup(),allInputIds.stream().flatMap(Collection::stream).collect(Collectors.toList()));final TransformationTranslator.Context context = new ContextImpl(this, streamGraph, slotSharingGroup, configuration);return shouldExecuteInBatchMode? translator.translateForBatch(transform, context): translator.translateForStreaming(transform, context);
}

        SimpleTransformationTranslator.java

public Collection<Integer> translateForStreaming(final T transformation, final Context context) {checkNotNull(transformation);checkNotNull(context);// 区分 map之类的转换算子(OneInput) 和 keyby值类的分区算子(partition)final Collection<

相关文章:

Flink 任务调度机制

一、Task 任务调度执行流程 一、Graph 的概念 Flink 中的执行图可以分为四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图。 StreamGraph:执行用户代码中的 env.execute() 方法后,根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的…...

设计模式之享元模式

1. 概念 享元模式(Flyweight Pattern), 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。 在享元模式中可以共享的相同内容称为内部状态(Intrinsic State)&…...

设计模式 - 策略模式Strategy

设计思想&#xff1a; 策略模式的就是定义一系列算法&#xff0c;将他们一个个封装起来&#xff0c;并且使它们可以相互替换&#xff0c;通常我们的代码中出现大量的if...else...或者switch语句时&#xff0c;我们都可以使用策略模式来优化代码 典型场景&#xff1a; 支付系…...

23种设计模式-行为型模式-策略

文章目录 简介场景解决代码关键实现细节 总结 简介 策略是一种行为设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#xff0c;以使算法对象能够被替换。 场景 你在开发一款导航应用&#xff0c;类似高德。你要实现自动路线规划的功…...

Ubuntu16.04配置远程连接

配置静态IP Ubuntu16.04 修改超管账户默认密码 # 修改root账户默认密码 sudo passwd Ubuntu16.04安装SSH # 安装ssh服务&#xff1a; sudo apt-get install ssh# 启动SSH服务&#xff1a; sudo /etc/init.d/ssh start # 开机自启 sudo systemctl enable ssh# 如无法连接&…...

window部署虚拟机VirtualBox来部署flink

window通过Cygwin部署flink-1.15.0失败 按理来说Cygwin可以在window模拟unix环境来部署运行flink&#xff0c; 但是在flink 不知从哪个版本开始&#xff0c;flink启动时会在window时创建临时文件夹&#xff0c;传递的文件夹名称参数中有冒号&#xff0c;导致文件夹创建失败&a…...

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…...

java基础使用- 泛型

泛型 泛型作用泛型语法(1) 泛型类/接口(2) 泛型方法 类型参数命名习惯类型通配符&#xff08;Wildcards&#xff09;(1) 无界通配符 <?>表示“未知类型”(2) 上界通配符 <? extends T>表示“T 或 T 的子类”。(3) 下界通配符 <? super T>表示“T 或 T 的父…...

Appium的学习总结-Inspector参数设置和界面使用(5)

环境搭建好后&#xff0c;怎么使用呢&#xff1f; 环境这里使用的是&#xff1a; Appium的Server端GUI 22版本 Inspector需要单独下载安装&#xff0c;GUI里并没有集成。 &#xff08;使用Appium v1.22.0,查看元素信息需要另外安装下载Appium Inspector&#xff09; 操作&…...

多孔介质电化学:原理、应用与展望

引言 多孔介质广泛存在于自然界与人工材料体系中&#xff0c;从土壤、岩石到电池电极、催化剂载体等。多孔介质电化学作为一门交叉学科&#xff0c;融合了电化学与多孔介质理论&#xff0c;聚焦于电流在充满电解液的多孔介质内的传输规律以及电化学反应在复杂多孔结构中的发生…...

使用Prometheus监控systemd服务并可视化

实训背景 你是一家企业的运维工程师&#xff0c;需将服务器的systemd服务监控集成到Prometheus&#xff0c;并通过Grafana展示实时数据。需求如下&#xff1a; 数据采集&#xff1a;监控所有systemd服务的状态&#xff08;运行/停止&#xff09;、资源占用&#xff08;CPU、内…...

网络游戏服务器如何构建全方位防御体系?DDoS与CC攻击实战防护指南

一、DDoS与CC攻击&#xff1a;游戏服务器的两大“隐形杀手” DDoS攻击&#xff1a;通过僵尸网络发起海量流量冲击&#xff0c;常见形式包括SYN Flood&#xff08;占满连接队列&#xff09;、UDP Flood&#xff08;耗尽带宽&#xff09;、DNS放大攻击&#xff08;小查询引发大流…...

geoserver搭建Docker一键直接安装并上传tif影像预览

geoserver搭建Docker一键直接安装 文章目录 geoserver搭建Docker一键直接安装前言一、Docker拉取Geoserver二、运行后使用geoserver进行数据管理进入geoserver调整语言登录geoserver上传一个tif影像建立工作空间并上传自己的tif数据建立图层预览 总结 前言 使用docker安装geos…...

ragflow本地部署(WSL下Ubuntu)

本地docker及 docker-compose版本 安装参考&#xff1a; 实践笔记-docker安装及配置镜像源实践笔记-docker-compose安装 1.下载源码 git clone https://github.com/infiniflow/ragflow.git2.运行docker-compose拉取镜像 cd ragflow/docker docker-compose up -d3.启动报错…...

面试题ing

1、js中set和map的作用和区别? 在 JavaScript 中&#xff0c;Set 和 Map 是两种非常重要的集合类型 1、Set 是一种集合数据结构&#xff0c;用于存储唯一值。它类似于数组&#xff0c;但成员的值都是唯一的&#xff0c;没有重复的值。Set 中的值只能是唯一的&#xff0c;任何…...

我的NISP二级之路-02

目录 一.数据库 二.TCP/IP协议 分层结构 三.STRIDE模型 四.检查评估与自评估 检查评估 自评估 五.信息安全应急响应过程 六.系统工程 七.SSE-CMM 八.CC标准 九.九项重点工作 记背: 一.数据库 关于数据库恢复技术&#xff0c;下列说法不正确的是&#xff1a…...

私有云平台总体建设方案

一、总体规划 二、项目建设...

前端使用正则表达式提取经纬度 度分秒值

经纬度&#xff1a;1240′0.0″&#xff0c;我想提取度分秒 const regex /(\d\.\d)\s*(\d\.\d)′\s*(\d\.\d)″/; const latMatches record.latDegreeMinuteSecond.match(regex); if (latMatches) {record.latDegree latMatches[1]; // 提取度record.latMinute latMatches[…...

如何在 Windows 11 上查找计算机的 IP 地址?

原文&#xff1a;如何在 Windows 11 上查找计算机的 IP 地址&#xff1f; | w3cschool笔记 在开始之前&#xff0c;我们先来了解一下什么是 IP 地址&#xff1a; 假设你住在一栋公寓楼里&#xff0c;快递员需要把包裹送到你家。为了确保快递能准确送到&#xff0c;你需要提供…...

JavaEE vs JavaSE:Java开发的两大世界深度解析

JavaEE vs JavaSE&#xff1a;Java开发的两大世界深度解析 &#x1f310;☕ 前言&#xff1a;Java世界的双子星座 作为一名Java开发者&#xff0c;你是否曾经困惑过JavaSE和JavaEE的区别&#xff1f;是否在选择学习路径时感到迷茫&#xff1f;别担心&#xff01;今天我们将彻…...

[环境配置] 2. 依赖库安装

依赖库安装 本文档详细介绍深度学习项目所需的核心依赖库安装过程&#xff0c;包括 CUDA、PyTorch 等组件的安装和配置。 CUDA和cuDNN安装 CUDA安装 检查显卡是否支持CUDA&#xff1a; 访问NVIDIA官网查看支持列表使用命令 nvidia-smi 查看显卡信息 下载安装CUDA Toolkit&a…...

No module named ‘keras.api._v2‘

No module named keras.api._v2 解解方法&#xff0c;同&#xff1a; No module named ‘keras.engine‘-CSDN博客...

线性方程组的解法

文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式&#xff1a;设有以下的 n n n阶线性方程组&#xff1a; A x b \mathbf{Ax}\mathbf{b} A…...

OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1

OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1 参考laval社区的文章&#xff1a;OpenHarmony带你玩转DeepSeekR1大模型 文章目录 OpenHarmony-5.0.0-Risc-V架构搭建DeepSeek-R1前言一、前期准备二、获取源码1.错误示范2.下载 三、编译llama.cpp1.生成makefile2.编译 四、模型文…...

Elixir语言的函数定义

Elixir语言的函数定义 Elixir是一种基于Erlang虚拟机&#xff08;BEAM&#xff09;的函数式编程语言&#xff0c;因其并发特性及可扩展性而受到广泛欢迎。在Elixir中&#xff0c;函数是程序的基本构建块&#xff0c;了解如何定义和使用函数对于掌握这门语言至关重要。本文将深…...

Spring MVC 数据绑定教程

一、数据绑定概述 将HTTP请求中的表单数据自动映射到Controller方法的参数中&#xff0c;支持多种数据类型绑定。 二、自动绑定数据类型 2.1 基本数据类型绑定 支持类型 基本类型&#xff1a;int, double 等包装类&#xff1a;Integer, Double 等String 类型 实现步骤 创…...

可发1区的超级创新思路(python 实现):基于时空解耦和对比学习的可解释性模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 目录 首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 二、模型解析 1.1 创新点深度解读 (1) 双路空间解耦架构(双路编码器…...

一个简单的php加密的理解

前言 原帖子 https://www.52pojie.cn/thread-1991616-1-1.html 一段简单的 php 代码加密&#xff0c;大佬使用了一段 python 代码给解密出来了&#xff0c;但是我没太理解整个逻辑 于是在本地跑了一遍&#xff0c;尝试理解整个解密流程&#xff0c;这里记录下整个学习过程 …...

基于微信小程序的高校寝室快修小程序研究

标题:基于微信小程序的高校寝室快修小程序研究 内容:1.摘要 随着高校规模的不断扩大&#xff0c;学生寝室数量增多&#xff0c;寝室设施维修需求日益增长。传统的维修报修方式效率低下&#xff0c;易出现信息传递不及时等问题。本文旨在研究基于微信小程序的高校寝室快修小程序…...

windows11在连接第二屏幕之后没有声音问题

博主在使用HDMI线连接第二个屏幕之后发现没有声音了。经过翻阅资料总结以下几个步骤。 1、拔开HDMI线&#xff0c;观察是否有声音&#xff0c;如果有声音就是HDMI线插上之后的声音输出设备选择问题。 观察下图&#xff1a; 声音输出设备&#xff1a;1、电脑麦克风&#xff0…...

手撕Tomcat

后端开发进阶&#xff1a;Web APP -> Web 服务器 Jerrymouse Server设计目标如下&#xff1a; 1、支持Servlet 6的大部分功能&#xff1a; 支持Servlet组件&#xff1b; 支持Filter组件&#xff1b; 支持Listener组件&#xff1b; 支持Sesssion&#xff08;仅限Cookie模式&a…...

oracle 快速创建表结构

在 Oracle 中快速创建表结构&#xff08;仅复制表结构&#xff0c;不复制数据&#xff09;可以通过以下方法实现&#xff0c;适用于需要快速复制表定义或生成空表的场景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 复制源表的全部列和数据类型&#xff0c;但不复制数据 C…...

InnoDB存储引擎的三大特性

InnoDB存储引擎的三大特性 Buffer Pool 原理&#xff1a;Buffer Poo 是InnoDB存储引擎用于缓存数据页和索引页的内存区域。他提高了数据库的读写性能&#xff0c;因为数据也和索引页在内存中读写比磁盘上快得多。需要访问数据时&#xff0c;InnoDB会在Buffer Pool 中查找&…...

算法初识-时间复杂度空间复杂度

注&#xff1a;观看Adbul Bari算法视频 算法概念 算法&#xff1a;先验分析&#xff0c;不依托于硬件&#xff0c;无语言限制&#xff0c;逻辑。 程序&#xff1a;后验测试&#xff0c;依托硬件&#xff0c;语言限制&#xff0c;实现。 特点&#xff1a; 输入-0或多个输出-至…...

MySQL8.0.40编译安装(Mysql8.0.40 Compilation and Installation)

MySQL8.0.40编译安装 近期MySQL发布了8.0.40版本&#xff0c;与之前的版本相比&#xff0c;部分依赖包发生了变化&#xff0c;因此重新编译一版&#xff0c;也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号&#xff0…...

一个简单的跨平台Python GUI自动化 AutoPy

象一下&#xff0c;你坐在电脑前&#xff0c;手指轻轻一点&#xff0c;鼠标自己动了起来&#xff0c;键盘仿佛被无形的手操控&#xff0c;屏幕上的任务自动完成——这一切不需要你费力&#xff0c;只靠几行代码就能实现。这就是AutoPy的魅力&#xff0c;一个简单却强大的跨平台…...

C++中常见函数

目录 stringstream ss(line); 为什么使用 stringstream while(ss>>num){} arr.push_back(num); numeric_limits ::min() pair result throw invalid_argument(""); vector arr;和int arr[];有什么区别&#xff1f; 数据结构的本质 内存管理 功能与易用…...

C++: 类型转换

C: 类型转换 &#xff08;一&#xff09;C语言中的类型转换volatile关键字 修饰const变量 &#xff08;二&#xff09;C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI &#xff08;一&#xff09;C语言中的类型转换 在C语言中…...

Linux驱动开发进阶(五)- 系统调用

文章目录 1、前言2、阻塞与非阻塞IO2.1、阻塞方式2.2、非阻塞方式2.3、小结 3、异步IO3.1、poll3.2、select3.3、epoll3.4、poll和epoll示例比较3.5、异步通知 4、unlocked_ioctl5、sysfs_notify 1、前言 学习参考书籍以及本文涉及的示例程序&#xff1a;李山文的《Linux驱动开…...

深度解析:文件或目录损坏且无法读取的应对之道

引言 在数字化办公与数据存储日益普及的今天&#xff0c;我们时常会遭遇各种数据问题&#xff0c;其中“文件或目录损坏且无法读取”这一状况尤为令人头疼。无论是个人用户存储在电脑硬盘、移动硬盘、U盘等设备中的重要文档、照片、视频&#xff0c;还是企业服务器上的关键业务…...

农业股龙头公司有哪些?

农业股票的龙头公司通常是指在农业领域具有较高市场份额、较强品牌影响力和较好财务表现的企业。以下是一些国内外知名的农业龙头公司&#xff1a; 国内农业龙头公司 中国中化 - 作为国内最大的化肥生产企业之一&#xff0c;主要从事化肥、种子、农药等产品的生产和销售。丰乐…...

【正点原子】如何设置 ATK-DLMP135 开发板 eth0 的开机默认 IP 地址

开机就想让 eth0 乖乖用静态 IP&#xff1f;别再被 DHCP 抢走地址了&#xff01; 三步教你彻底掌控 ATK-DLMP135 的网络启动配置&#xff0c;简单粗暴&#xff0c;实测有效&#xff01; 正点原子STM32MP135开发板Linux核心板嵌入式ARM双千兆以太网CAN 1. 删除 dhcpcd 自动获取…...

pyenv-virtualenv(python 版本管理工具)

推荐参考&#xff08;本人实测有用&#xff09; 参考文章pyenv 和 pyenv-virtualenv 的安装、配置和使用&#xff08;仅供参考&#xff09; 参考文章 pyenvpyenv-virtualenv&#xff08;仅供参考&#xff09; pyenv (windows)安装 手动安装 git clone https://github.com/pye…...

Solr admin 更新文档

<add><doc><field name"id">1904451090351546368</field><field name"companyName" update"set">测试科技有限公司</field></doc> </add>...

华为交换机上配置流量策略根据IP限速

一、配置ACL匹配目标IP 目的&#xff1a;通过ACL识别需要限速的IP地址或网段。 # 进入系统视图 system-view # 创建基本ACL&#xff08;例如ACL 3000&#xff09; acl 3000 rule 5 permit ip source 192.168.1.10 0 # 匹配单个IP&#xff08;源地址&#xff09; # 或匹配…...

3D数据共享标准——GLB文件格式揭秘

GLB 文件格式&#xff1a;跨平台 3D 数据共享的标准 简介 在这个数据爆炸的时代&#xff0c;3D 数据因其直观、逼真的特点而得到广泛应用。然而&#xff0c;不同 3D 软件和平台之间的兼容性一直是一个难题。 为了解决这一问题&#xff0c;GLB 文件格式应运而生。作为一种标准…...

Java 大视界 -- 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

基于springboot体育俱乐部预约管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;在科…...

【HTML-CSS】

一、概念 1、HTML 2、CSS 二、入门 HTML 教程 | 菜鸟教程 1、构架 注&#xff1a; 1、标签不区分大小写 2、属性可以使用单引号&#xff0c;也可以使用双引号 3、语法结构不严谨&#xff0c;但建议好好写 2、常见标签和样式 &#xff08;1&#xff09;标题 <span>没…...

UI自动化基础(1)

1、pip install selenium4.3.0&#xff0c;最好指定版本安装&#xff0c;因为不同的版本可能会有一些兼容 性的问题。 2、pip uninstall urllib3 &#xff0c;pip install urllib31.26.15 【执行版本安装】&#xff0c;goole是114.版本 3、装好浏览器&#xff0c;正确安装。最好…...