学术加油站|机器学习应用在数据库调优领域的前沿工作解读

news2025/1/10 17:07:07

编者按

本文系北京理工大学科研助理牛颂登所著,本篇也是「 OceanBase 学术加油站」系列稿件第八篇。

「牛颂登:北京理工大学科研助理。 硕士期间在电子科技大学网络空间安全研究院从事聚类和强化学习相关算法研究,在应用聚类研究个性化在线学习和强化学习的奖励函数设计方向取得了一定成果,目前研究方向为机器学习和数据库相结合的领域。」

本文以 VLDB 2021 的三篇 database tuning 论文为例,对机器学习应用在数据库调优领域的前沿工作做了总结和概述。希望阅读完本文,你可以对“database tuning”有新的认识,有什么疑问也可以在底部留言探讨。


现代数据库管理系统(database management systems,下简称 DBMS)公开了许多可配置的控制运行时行为的旋钮。 正确选择 DBMS 的配置对于提高系统性能和降低成本至关重要。但是由于 DBMS 的复杂性,调优 DBMS 通常需要有经验的数据库管理员(database administrators,简称 DBAs)付出相当大的努力。 最近关于使用机器学习(Machine Learning,ML)的自动调优方法的研究表明,与专业 DBA 相比,基于 ML 的自动调优方法获得了更好的性能。

 

An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems[1]

 

(一)调优过程

 

为了更好地理解 DBMS 的配置调优,探究在真实的企业级 DBMS 上 ML 调优方法的效果,论文通过运行在具有非本地存储的虚拟计算设施上的 Oracle DBMS 实例来比较企业数据库真实工作负载跟踪下的三种 ML 算法(GPR、DNN、DDPG)的调优效果。

论文的主要工作主要是扩展了 OtterTune 调优服务来支持三种 ML 调优算法,并提出了对三种算法的优化,在实验的过程中发现了一些自动调优技术领域中被忽略的部署和度量问题。

 

Image

图 1 OtterTune 架构

 

OtterTune 是一个调优服务,它用来为 DBMS 的旋钮配置找到合适的设置,由controller 和 tuning manager 组成。 其中 controller 充当目标 DBMS 和 tuning manager 之间的中介,它在目标 DBMS 上执行目标工作负载,并收集运行时数据(包括旋钮配置和系统的度量)。Tuning manager 使用 controller 提供的调优会话信息更新其数据存储库,并使用这些信息建立 DBMS 如何响应不同旋钮配置的 ML 模型,然后用这些模型来指导实验并推荐新的配置给 controller,以将配置部署到 DBMS 上。这样的迭代过程一直持续到用户对配置的改进满意为止。

 

▋ Target Database Application:

 

因为论文探究的是真实企业 DBMS 的 ML 自动调优对系统性能提升的效果,作者在 Société Générale (SG)多国银行的实际业务数据下对 OtterTune 框架进行了评估。论文中使用了 TicketTracker 这一数据和工作负载跟踪的应用程序,对 SG 的工作单据进行 2 小时的跟踪,收到包含超过 360 万个查询调用。

作者使用 Oracle Recovery Manager 工具从 TicketTracker 数据库的生产服务器上创建了快照,复制了磁盘上未压缩的 1.1 TB 大小的数据库,并做了分析,其中 27%为表数据,19% 为表索引,54% 为大对象(Large objetcs)。TicketTracker 数据库包含 1226 个表,其中只有 453 个有数据的表,数据库基于它们包含 1647 个索引。

论文中使用 Oracle 的 real application testing(RAT) 工具来捕获在 DBMS 实例上执行的查询,RAT 支持在测试数据库上使用原始工作负载的精确时间、并发性和事务特征对实例上的查询进行多次重放;重放的时间被限制在一个 10 分钟的片段(包含 23 万条查询)。

TicketTracker 数据库相比于之前一些 ML 调优采用的工作负载 benchmark——TPC-C,有数百个表,而 TPC-C 只有 9 个表;TPC-C 查询的写的比率占到46%,而 TicketTracker 里只占了 9%。这也表明实际的企业级 DBMS 与已有研究中的 benchmark 有很大不同。

优化算法的目标函数设置为 Oracle 的 DB Time,它用于度量数据库在处理用户请求时所花费的总时间,也是 SG 专业 DBA 首选的指标。论文在 SG 私有云的单独 Oracle v12.2 安装上部署了 TicketTracker 数据库和工作负载的五个副本。

 

(二)调优算法

 

Image

图2 GPR/DNN调优管道

 

论文中的 GPR 实现基于 OtterTune 支持的原始算法,采用高斯过程作为先验函数,计算测试点与所有训练点之间的距离,该算法利用核函数来预测测试点的值和不确定度。由两阶段组成,第一个是数据预处理阶段,它在 Otter Tune 的数据存储库中准备旋钮配置和系统的度量数据。第二个是旋钮推荐阶段,为旋钮选择合适的值。

数据预处理: 目的是为了降低度量的维度,并选出最重要的一些的 knobs。在这一阶段首先确定 DBMS 度量的子集,算法使用因子分析(factor analysis)的降维技术,能够将度量减少到更小的因子集合。将度量降维后,继续计算对目标函数影响最大的旋钮的排序列表。论文使用了 Lasso 的特征选择方法,其中旋钮数据作为输入 X,输出的是结合已经修剪过的度量的目标数据。Lasso 在 X 和 y 之间的回归过程中确定了重要的旋钮顺序。

旋钮推荐: 负责在调优会话的每次迭代结束时生成一个新的旋钮配置建议。该算法使用上一阶段的输出数据在给定旋钮排序列表的情况下预测目标 DBMS 工作负载的度量值。然后,算法使用目标工作负载和当前最相似工作负载的数据构建一个GPR 模型。将给定的旋钮数组(x)作为输入,模型输出目标值(y)和不确定性值(u)的对(y, u)。算法计算 y 和 u 之和的置信上限(UCB)。然后在 UCB 上进行梯度上升,以找到能导致良好目标值的旋钮配置。

因为高斯过程模型在较大的数据集和高维特征向量上表现不佳[2],所以,论文修改了 OtterTune 最初的基于 GPR 的算法,使用深度神经网络(DNN)代替高斯模型。二者遵循相同的 ML 管道,都是先进行数据预处理,然后进行旋钮推荐。

DNN 依赖于对输入应用线性组合和非线性激活的深度学习算法,模型的网络结构有两个隐含层,每层有 64 个神经元。所有各层均以整流线性单元(ReLU)作为激活函数完全连接。模型实现了一种称为 dropout 正则化的流行技术,以避免模型过拟合并提高其泛化。DNN 还在旋钮推荐步骤期间将高斯噪声添加到神经网络的参数中,以控制探索和利用。

 

Image

图 3 DDPG调优管道

 

DDPG 方法首先由 CDBTune[3]提出,它是在连续动作空间环境中搜索最优策略的一种深度强化学习算法。DDPG 由三个组件组成:(1)actor (2)critic 和(3)replay memory。actor 根据给定的状态选择一个动作(例如,对一个 knob 使用什么值)。critic 根据状态对选定的动作(即旋钮值)进行评估,并且提供反馈来指导 actor。actor 的输入是 DBMS 的度量,输出推荐的旋钮值。critic 将之前的度量和推荐的旋钮作为输入,输出一个 Q 值,DDPG 神经网络的 Q 值计算的是对未来所有预期奖励的叠加。replay memory 存储按预测误差降序排列的训练数据。

对于每个旋钮 k, DDPG 构造一个元组,其中包含 (1) 先前的度量 m_pre,(2) 当前的度量 m,以及(3)当前的奖励值 r。在接收到一个新的数据时,CDBTune 首先通过比较当前、之前的和初始目标值来计算奖励。训练时从 memory 中获取一个小批量排名靠前的 tuple,并通过反向传播更新 actor 和 critic 的权重。最后,CDBTune 将当前度量 m 输入 actor 以获得下一旋钮 k_next 的推荐。

论文对 CDBTune 的 DDPG 算法进行了一些优化,以提高 DDPG 的收敛速度(新方法被叫做 DDPG++)。首先,DDPG++ 使用即时奖励而不是累积的未来奖励作为 Q 值。第二点,DDPG++ 使用了一个更简单的奖励函数,不考虑之前的或基础目标值。第三点,DDPG++ 在得到一个新的结果时,从 replay memory 中获取多个小批量,以训练网络更快地收敛。

 

(三)实验结果

 

第一个实验评估了由 DBA 选出旋钮后再由 ML 调优算法在增加调优的旋钮数量时生成的配置的质量。图 4 显示了算法生成的优化配置在三个 vm 上的平均性能改进。(每个条的暗和亮部分分别代表每个算法的最小和最大性能)。

 

Image

图4 DBA选出的调优旋钮

 

为了理解为什么配置执行起来效果不同,作者手动检查了每个旋钮配置,并确定了三个最重要的 Oracle 旋钮,当算法没有正确设置它们时,会对 DB Time 产生最大的影响。其中前两个参数控制 DBMS 的主缓冲区缓存的大小,第三个旋钮启用基于 Oracle 版本的优化器特性。

作者发现,GPR 在四个算法中总是快速收敛,但是 GPR 很容易陷入局部极小值。DNN 的性能是整体最好的,而 DDPG 和 DDPG++需要更多的迭代次数才能达到好的优化性能。

第二个实验是将人工完全排除在调优过程中。首先为了生成旋钮列表排序,使用Lasso 算法,根据旋钮对目标函数的估计影响程度对其进行排序,并将排序列表分为 10knobs 和 20knobs,以供 ML 算法进行调优。图 5 显示了 10 和 20 个knobs 配置的平均性能改进。

 

Image

图5 OtterTune选出的调优旋钮

 

论文中认为,20knobs 配置的 DBMS 整体性能较差,部分原因是在 2020 年 8 月初作者进行这些实验时,私有云存储上存在更多的共享噪声,论文中对性能测量的可变性支持了这一解释。

第三个实验,作者先在一个工作负载上训练 ML 生成的模型,然后使用模型去调优另一个工作负载的 DBMS,分析另一工作负载上由 ML 生成的配置的质量。首先使用 OLTP-Bench 执行的 TPC-C 工作负载为每个算法训练模型。然后使用 TPC-C 训练的模型对 TicketTracker 工作负载上的 DBMS 进行迭代调优。图 6 是算法在每个虚拟机上对 SG 默认配置的性能改进。

 

Image

图6 对不同工作负载的适应性

 

CGPTuner: a Contextual Gaussian Process Bandit Approach for the Automatic Tuning of IT Configurations Under Varying Workload Conditions[4]

 

(一)背景知识

 

这篇论文做的主要工作跟上一篇有些类似,都是为了找到 DBMS 中能够提升系统性能的配置,不同的是这篇论文首先认为 DBMS 处于整个 IT 栈的最顶端,下面的 JVM、操作系统的配置调优也都会影响 DBMS 的性能;第二点,DBMS 的性能还跟它所处的工作负载有关,即这篇论文分析的是实时的、在线的自动调优;论文的第三个亮点是它认为目前软件版本更新的比较快,而且版本更新会修改其可用的参数,那么从以前的知识库中重用信息就让调优的问题变得比较复杂,因此它提出的方法是不需要利用以前的知识库的。

 

Image

图7 改变MongoDB缓存大小和虚拟机dirty_ratio Linux参数对DBMS性能的影响

 

Image

图8 改变JVM并发垃圾收集器的线程和Linux内核的read_ahead_kb参数对Cassandra性能的影响

 

从图 7 和图 8 中可以看到,DBMS、JVM 和 OS 的配置都会影响 DBMS 的性能。

 

(二)所提模型

 

Image

图 9 调优过程和架构

 

论文所提模型的优化目标就是在给定的工作负载 w 下,找到一个配置向量 x,将其应用在 IT 栈上面来优化系统的性能指标 y。需要注意的是,调优器能够利用先前所有迭代的 x,w 和 y,但是不需要其他额外的知识,这点是跟比如 OtterTune 这些需要利用其他知识的自动调优不同的地方。

概率模型:贝叶斯优化

替代模型: 高斯过程

采集函数: GP-Hedge。GP-Hedge 采用了多种获取函数的组合,即EI(预期的改进)、PI(改进概率)、LCB(低置信区间)等。

之所以叫基于上下文的高斯过程优化,是因为作者认为某些工作负载下的优化是相关的,比如工作负载 w 下得到的数据,可能为另一工作负载 w’ 提供一些有用的信息。基于此作者为高斯过程定义了新的正定核和新的协方差函数,作者认为如果两个(x,w)组成的点是相似的只要它们的x是相似的或者 w 是相似。但是在优化的时候,作者只优化了配置空间这一子空间,在每次优化的时候是固定了另一维度进行探索和利用。采用基于上下文的高斯过程优化的好处是在迭代过程中,所有工作负载的信息是共享的。

论文是用 MongoDB 和 Cassandra DBMS 来评估 CGPTuner,用了 YCSB 来模拟了三种不同的工作负载模式。实验时的优化目标是在不增加响应时间的前提下最小化内存消耗,来提升部署的效益。作者手动选出了调优的参数, 包含 IT 栈不同的组件(DBMS、JVM 和 OS)的参数。为了验证调优器对于工作负载变化的适应能力,论文中设计了两种工作负载模式,分别是对三种不同读写比例工作负载在一天中(也就是 1 次重复)中持续不同的迭代次数。运行的线程数也是变化的,以此来模拟一天中不同的工作负载密度。

 

(三)实验结果

 

在实验时,作者通过两种方式来比较不同调优器的度量,一种是以在线的,也就是让调优器直接在生产系统上运行,另一种是离线的,在测试环境上复制生产系统。

作者用了两个指标来衡量这两种方式下的调优器的质量,分别是在线调优的累计奖励 Calculative Reward(CR)和离线调优的迭代最佳值 Iterative Best(IB)。如果保持跟默认配置相同的配置,CR 将始终是 0,如果找到的配置比默认配置还差,将会导致负的 CR。也就是说,CR 反映了调优器理解问题和适应工作负载变化的能力。IB 值记录了当前迭代下记录的最高的标准性能改进,它反映了调优器快速探索并且找到良好配置的能力。

 

Image

图10 在Cassandra DBMS上运行单峰workload模式

 

图 10 是加载单峰的工作负载的结果,从 IB 值得变化可以看到 CGP 相较于另外两种在线调优算法,能更快找到良好的配置,并且找到的配置质量高于另外两种算法;从 CR 值的变化情况可以看到,OpenTuner 和 BestConfig 的累计奖励值在持续地负向增加,也就是说这两种算法找的配置始终比默认的设置更差,而 CGPTuner 在第 3 天开始 CR 值开始正向增加,并且在第六天累计奖励的值开始为正值并不断增加;在另一种工作负载模式上的结果类似。

 

Image

图 11 Cassandra 单峰调优的非标准化内存和吞吐量

 

除了从优化的角度比较了各种算法外,作者还从吞吐量和内存消耗的角度来比较了三种算法。图 11 中的点是 Cassandra DBMS 在单峰工作负载模式上每个调优器获得的中值。可以看到,在调优的第二天,CGP 已经基本上收敛,它为 Cassandra 缓存设置了一个较低的值,并根据传入的工作负载改变了 JVM 堆的大小,而且这两个参数都非常接近于最佳配置。而 OpenTuner 和 BestConfig 都没有达到收敛,始终为这两个内存参数寻找更高的值。至于吞吐量方面,CGP 在大多数工作负载上都能获得更好的结果。

综上,基于上下文的调优器能实现更高吞吐量的同时分配更少的内存,同时能根据到来的工作负载变化 JVM 堆的尺寸。

 

The Case for NLP-Enhanced Database Tuning: Towards Tuning Tools that “Read the Manual”[5]

 

(一)背景知识

 

本篇论文认为从文本文档中挖掘提示可以为现在的自动调优方法如主动学习、DRL 等加速收敛,以及减少训练所需的数据量,作为这些方法的补充。数据库调优知识是以自然语言文本的形式提供的。例如,数据库管理员在最大限度地提高不熟悉的系统的性能时,都会首先查阅数据库系统手册。除了手册之外,在网络上的博客、在线论坛或科学论文中还发布了无数的调优提示。相关知识不仅隐藏在文本文档中。甚至配置文件中调优参数的名称以及相关的注释,可能也提供了一些直观的语义和值得尝试的值。

 

(二)所提模型

 

Image

图12 NLP增强的数据库调优器

 

图 12 显示了 NLP 增强型数据库调优工具的模板,系统、数据和查询相关的文本用于形成优化的先验。首先,从系统手册、网上博客、论坛、关联的注释以及科学论文里抽取出相关知识作为先验文本。然后论文所提的原型系统可以从输入的先验文本中挖掘数据库系统的调优提示。

 

Image
图13 论文所提原型概述

 

管道的第一阶段首先用基于 Robert-a 语言预处理模型提取出含有建议特定参数的值或者范围的关键语句,以及上下文。

 

Image

图14 通过谷歌查询“Postgres数据库调优”和MySQL数据库调优

得到的前十个调优提示网页文档的子集

 

以 Postgres 和 MySQL 的手册为例,可以提取出这些关键语句和上下文。例如第一条语句,(满足条件 RAM 的内存大于 1GB 时)可以将其转换为等式 shared_buffers = ¼ memory。

接下来,使用 Robert-a 的分类器根据关键语句的类型对其进行分类,这里假设的是每个提示都可以被转换成一个涉及所引用参数的等式。语句按类型分为建议参数为特定值的提示、定义下限、上限或推荐值集合的提示。然后根据分类后的关键语句,提取参数名称和提示的值。最后对不同文档提取出的提示进行汇总,为了减少噪声和剔除相矛盾的属性,论文最终用到的提示是过滤后的,至少在独立的文档中出现两次的调优提示。

这篇论文相比前两篇配置调优的论文,有一些缺点,就是所提原型的文本分析不支持不同工作负载下的调优;另外,仅支持提取特定的参数值以及主内存的百分比,对于参数值范围的提取不适用。

 

(三)实验结果

 

为了使任务更具挑战性,论文使用提示为一个数据库系统训练两个分类器,用来自一个分类器的文档训练分类器,并处理为另一个系统检索的所有文档,即在以另一个系统为目标的文档上测试用第一个系统的数据训练的分类器。

 

Image
图15 Postgres训练产生提示后处理MySQL提示时的质量度量

 

Image

图16 MySQL训练产生提示后处理Postgres提示时的质量度量

 

综上,该论文建议使用文本文档和片段作为数据库调优中的一个额外的信息源,提出并评估了一个 NLP 增强型数据库调优器的简单原型来利用这些信息作为补充或证实其他信息源,并演示了与默认配置相比,自动解析来自Web的信息可以产生显著的加速。

本文通过三篇数据库调优相关论文对其各自工作进行概述,希望能在带给读者相关概念的同时,启发创新灵感。由于篇幅所限,本文并未列出所有数据库调优相关论文,而只是以近年论文为起点,给出些大致的研究方向,感兴趣的读者还需要在此基础上继续探索。

 

*参考文献:

[1] An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems. PVLDB, 2021.

[2] Black or White? How to Develop an AutoTuner for Memory-based Analytics. SIGMOD, 2020.
[3] An End-to-End Automatic Cloud Database Tuning System Using Deep Reinforcement Learning. ICMD, 2019.

[4] CGPTuner: a Contextual Gaussian Process Bandit Approach for the Automatic Tuning of IT Configurations Under Varying Workload Conditions. PVLDB, 2021.

[5] The Case for NLP-Enhanced Database Tuning: Towards Tuning Tools that “Read the Manual”. PVLDB, 2021.

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

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

相关文章

Python之Hermite多项式

文章目录Hermite多项式求导和积分求根和反演拟合其他Hermite多项式 Hermite多项式是一种非常重要的正交多项式,尤其在量子力学中,是谐振子的本征态,在物理学中,其定义为 Hn(x)(−1)nex2dndxne−x2H_n(x)(-1)^ne^{x^2}\frac{\text…

算法之动态规划实战

目录 前言: 如何量化两个字符串的相似度? 如何编程计算莱文斯坦距离? 如何编程计算最长公共子串长度? 参考资料 前言: 利用 Trie 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输…

【Python+pandas】学生测试成绩求和排序

✨博文作者 wangzirui32 💖 喜欢的可以 点赞 收藏 关注哦~~ 👉本文首发于CSDN,未经许可禁止转载 😎Hello,大家好,我是wangzirui32,最近时间不够充足,鸽了几个月,这是2023…

【蓝桥杯第十三届C++B组】真题训练(5 / 8) - java写法

目录 4402.刷题统计 - 数学模拟 4403. 修剪灌木 - 思维 4404. X 进制减法 - 进制运算 贪心 4405. 统计子矩阵 - 前缀和 双指针​​​​​​​ 1、一维前缀和 2、二维前缀和 4406. 积木画 - dp 1、找规律dp 4402.刷题统计 - 数学模拟 4402. 刷题统计 - AcWing题库 思…

素数(prime)总结

素数的介绍 素数定义 质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。 根据算术基本定理,每一个…

linux 文件夹多用户共享 解决文件删除的Permission denied

linux文件属性基础 Linux文件属主和属组 通过命令ls 可以查看文件属性: zcargo-MS-7D53:~/Desktop/parent_ceshi$ ll -lh total 16K drwxrwxr-x 2 zc zc 4.0K 1月 10 13:59 ceshi/ drwxrwxr-x 2 zc zc 4.0K 1月 10 13:59 ceshi02/以上展示命令的意思&#xff1…

大数据概念及Hadoop介绍

大数据概念及Hadoop介绍大数据概念数据存储单位大数据定义大数据的特点(5V特征)大数据部门组织架构分布式技术负载均衡故障转移伸缩性分布式技术总结分布式和集群的区别Hadoop介绍Hadoop核心组件Hadoop发展简史Hadoop特性优点与行业应用Hadoop特性优点行业应用Hadoop发行版本及…

14、Java网络编程

一、 网络编程概述Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里&…

【广度优先搜索遍历 + 染色法】判断二分图

还记得当时才大一,上离散数学课,当时觉得很不屑,就是觉得这学的什么玩弄啥用没有,但是其实很多的算法思想在解决题目时很有价值。 本文就将使用染色法解决判断二分图问题,使用广度优先搜索遍历和 Java 语言实现 一、题…

车辆逆行识别检测系统 opencv

车辆逆行识别检测系统通过opencvyolo网络深度学习技术,对现场画面中车辆逆向行驶行为进行检测抓拍预警。 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多…

嵌入式 LINUX 驱动开发 day02 字符设备驱动 字符设备驱动 虚拟串口, 一个驱动支持多个设备

1. 驱动开发 字符设备驱动 代码&#xff1a; vser.c #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h>#include <linux/fs.h> /***** 设备相关信息 ******/ static unsigned int VSER_MAJOR 256; //主设备号…

青铜到王者,9本最好的Python从入门到进阶的书

春节长假还有2周了&#xff0c;是时候囤一些书充充电了&#xff01;新的一年群里很多小伙伴开始想学Python&#xff0c; 无论是准备转行的&#xff0c;还是想多学一份技能提高职场竞争力的&#xff0c;都想选择Python赛道&#xff0c;下面给大家推荐一些非常不错的Python入门到…

【Flask框架】—— 30 Flask-RESTful

前后端分离和前后端不分离 前后端不分离 在前后端不分离的应用模式中&#xff0c;前端页面看到的效果都是由后端控制&#xff0c;由后端渲染页面或重定向&#xff0c;也就是后端需要控制前端的展示&#xff0c;前端与后端的耦合度很高。 这种应用模式比较适合纯网页应用&…

iclr 2022 Compositional attention: Disentangling search and retrieval

Mittal S, Raparthy S C, Rish I, et al. Compositional attention: Disentangling search and retrieval[J]. arXiv preprint arXiv:2110.09419, 2021. 目录Mittal S, Raparthy S C, Rish I, et al. Compositional attention: Disentangling search and retrieval[J]. arXiv p…

【Kettle报错】kettle7.0链接MySQL显示:No appropriate protocol

【Kettle7.0链接本地MySQL数据库报错】 1. 问题描述 报错问题&#xff1a;kettle7.0报错&#xff0c;提示No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 错误原因&#xff1a; Caused by: javax.net.ssl.SSLHandshakeException: No a…

Vue实现路由(Vue-router,参数传递,编程式路由导航)

目录 路由是什么&#xff1f; 怎么实现路由 第一步 创建一个文件夹 router &#xff0c;里面创建一个index.js 内容是 第二步 在main.js中引入和应用 router 第三步 在Vue中 通过两个标签进行配置 跳转路由时的参数传递 query params query参数和 param参数的区别 编…

原型链和JSON

对象的封装、继承和多态 封装、继承和多态是面向对象编程的三大特征&#xff0c;在JavaScript中也可以使用这些特征来实现面向对象的的编程。 封装是指将对象的属性和方法封装在对象内部&#xff0c;只提供必要的接口给外部访问。封装可以让我们隐藏对象的实现细节&#xff0c;…

项目管理:制定项目进度计划的好处有哪些?

项目管理计划确定了项目执行、监控及结束项目的整个过程&#xff0c;在项目开始之前&#xff0c;如能制定清晰的计划&#xff0c;并让项目成员都了解项目的目标和自己的责任&#xff0c;会对项目的推进有很大的帮助。 制定项目进度计划的好处有哪些&#xff1f; 1、目标导向…

高级树结构之二叉查找树

文章目录一 二叉查找树简介二 创建和插入操作三 查找操作3.1 查找思路3.2 代码实现四 删除操作4.1 情况讨论4.2 代码实现五 完整代码5.1 二叉查找树的结构5.2 完整代码内容一 二叉查找树简介 二叉查找树【二叉搜索树或是二叉排序树】 左子树中所有结点的值&#xff0c;均小于其…

(十一)devops持续集成开发——jenkins流水线发布一个docker harbor仓库版的前端vue项目

前言 本节内容&#xff0c;我们使用jenkins的流水线功能发布一个docker harbor私服仓库版的前端vue项目&#xff0c;延续前一节的内容&#xff0c;这里需要我们事先安装好一个docker harbor仓库用来存放我们项目的镜像&#xff0c;前端项目依然是通过nginx基础镜像构建&#x…