论文阅读-一种用于大规模分布式文件系统中基于深度强化学习的自适应元数据管理方案

news2024/11/16 1:47:37

名称: An Adaptive Metadata Management Scheme Based on Deep Reinforcement Learning for Large-Scale Distributed File Systems

I. 引言

如今,大型集群文件系统的规模已达到PB甚至EB级别,由此产生的数据呈指数级增长。系统架构师不断设计和优化技术和方法,以向用户提供理想的服务。在这种情况下,元数据管理在提高系统性能中扮演着关键角色。元数据描述了文件系统的组织信息,包括目录内容、文件属性、文件块指针、物理空间的组织和状态信息等。尽管元数据通常只占整个数据空间的0.1%到1%,但在EB级别的文件系统中,它的规模仍可达到PB级别。此外,元数据操作通常占典型工作负载中50%到70%的比例。因此,一个高效的元数据管理方案对于提高大规模分布式文件系统的吞吐量至关重要。

许多传统的商业文件系统使用集中式元数据管理策略,即采用单个元数据服务器(MDS)来管理元数据。尽管这种方法简化了系统设计,但唯一的MDS可能会遭受密集的并发访问请求和单点故障,从而降低系统的效率和可靠性。一个分布式管理策略,通过多个元数据服务器来管理元数据,可以自然地克服这些缺陷。它首先利用元数据分布方案将元数据命名空间树进行划分,然后应用元数据分配方法将划分的单元分配给不同的MDS。一个有效的分布式元数据管理方案旨在将命名空间树中的元数据节点动态分配给不同的MDS,以便在MDS之间平衡工作负载,同时保持元数据的局部性。然而,设计这样的方案可能具有挑战性:(i)上述两个目标相互矛盾。(ii)文件访问模式是不确定的且随时间变化的。(iii)这将导致分布式元数据处理。

图1展示了一个简单的例子,目标是将命名空间树中的元数据节点分布到四个MDS中。根据POSIX风格标准,访问一个元数据节点需要访问其所有的祖先节点直到根节点以进行权限检查(例如,图1左侧的“/root/home/b”的访问需要连续访问三个节点:“/root”、“/root/home”、“/root/home/b”)。一种策略是子树划分方案,它将一个子树分配给一个服务器,如图1右侧所示。这种方法保持了良好的元数据局部性,因为访问一个节点时只需要在MDS之间进行少量跳转。然而,一些子树可能成为热点(例如,MDS3中的“/home”子树),导致某些MDS过载。因此,我们应该将一些热点元数据节点从过载的MDS迁移到负载较轻的MDS(例如,我们将元数据节点n5从MDS3迁移到MDS5)。如果我们想要最大化系统负载平衡,一个更好的平衡分区策略是基于元数据节点的路径名进行哈希映射,均匀分布每个元数据节点。然而,这种策略破坏了元数据的局部性,因为访问一个元数据节点可能需要在MDS之间进行更多跳转。

分布式元数据管理策略的示意图。整个命名空间树首先被分区并分配给四个MDS。然后,位于MDS3中的子树“/home”成为一个热点。我们进一步将元数据n5从负载较重的MDS3迁移到负载较轻的MDS4,以平衡系统负载。

对于节点分布的动态调整,传统的元数据管理方案,包括基于哈希映射和子树划分的方案,采用了静态策略,不会自动重新分配元数据节点,因此无法适应变化的访问模式。近期的工作开始设计动态方案。然而,这些方案主要采用基于历史的粗粒度更新策略。例如,DROP通过基于历史访问频率重新计算每个MDS管理的哈希值范围来重新分配节点。Deep-Hash通过迁移虚拟节点来重新平衡系统。这种设计存在两个主要限制。首先,分布更新基于周期性的历史统计数据,然后会落后于访问模式的变化。其次,粗粒度迁移不可避免地导致冗余的迁移成本,因为一些非热点节点会频繁地与热点节点一起移动。这也限制了性能的提升。例如,从过载服务器迁移的热点子树可能导致另一个服务器过载(例如,如果我们简单地将“/home”整个子树从MDS3迁移到MDS4,MDS4将会过载)。

因此,我们希望有一个高度适应时间变化访问模式的分布式元数据管理方案,并且可以对节点的分配进行最小且成本有效的调整。考虑到深度强化学习(DRL)在解决复杂且变化环境中的序列决策问题方面的成功,如AlphaGo和Atari系列,我们在本文中探索利用DRL方法实现基于动态迁移。此外,基于我们对元数据访问跟踪的分析,我们发现元数据访问模式具有长尾特性:大多数查询指向少部分元数据(热点节点)。由于元数据访问的这种特性,一个基本的直觉是热点节点对局部性级别或负载平衡程度有重大影响。因此,我们提出了一种基于DRL的自适应细粒度元数据管理方案(AdaM)。在每个时间步骤,AdaM作用于个别热点节点而不是子树或一系列具有连续哈希值的节点,以减少非热点节点移动引起的不必要成本。AdaM高度适应变化的访问模式,可以动态地在不同的MDS之间迁移热点节点,以保持负载平衡并保留元数据局部性。

此外,分布式元数据管理将引入跨服务器的元数据操作。在这种情况下,不同MDS上的操作必须同时成功或失败。否则,将导致元数据不一致。现有的元数据系统采用两阶段提交(2PC)以确保元数据一致性。然而,2PC在性能和可靠性方面存在瓶颈。为了解决这个问题,我们提出了一种称为基于MST的2PC的高效分布式元数据处理协议,该协议结合了本地消息状态表(MST)和面向消息的中间件,以实现高性能。此外,为了提高元数据查询效率,我们提出了一种自适应缓存策略,可以在服务器端或客户端之间自动切换缓存策略。通过这种策略,我们可以灵活地缓存热点元数据节点以减少网络开销,从而获得高查询性能。

本文扩展了初步研究,通过(i)调研最新文献并在第二节总结元数据管理方案的比较;(ii)利用网络嵌入技术将元数据节点转换为特征表示,在第四节B部分提高训练效率,同时保持命名空间树的结构;(iii)在第四节E部分引入几种技术(例如,经验回放、随机动作生成和软更新)以增加DRL模型的稳定性;(iv)在第五节A部分设计自适应缓存策略,以提高元数据查询的效率;(v)在第五节B部分提出一种称为基于MST的2PC的一致性处理协议,用于有效执行分布式元数据事务;以及(vi)在第六节中使用Amazon EC2平台对真实世界数据集进行更全面的实验研究。

II. 相关工作

随着大型文件系统从集中式发展到分布式,MDS架构对可扩展性、可用性、效率和性能有更高的要求。已经提出了显著的元数据分布方案,以优化元数据访问和维护开销。图2显示了元数据管理技术发展中的里程碑和代表性工作的时间线。

A. 静态子树划分

静态子树划分是20世纪80年代引入的最早的静态分布方法之一。这是一种简单的方案,将元数据命名空间树划分为不重叠的子树,然后将每个子树分配给指定的MDS。这样,系统的局部性很好,因为目录的主要层次结构保留在单个MDS中。然而,当处理动态工作负载时,MDS之间的负载平衡并不保证。例如,当文件访问主要集中在短时间内的特定子树上时,它可以使相应的MDS过载并成为系统性能的瓶颈。此外,将改变文件系统层次结构的元数据操作,如“移动”和“重命名”,可以导致大量的元数据迁移。早期的分布式文件系统如NFS、AFS和Coda,以及较新的PVFS2、CXFS和HDFS采取了这一策略。

B. 基于表的分区

基于表的分布式方法后来被提出,以减少元数据迁移成本。它使用被复制到所有MDS的关键映射,以允许管理者和客户端相互定位。该映射本质上是一个表,指示物理机器与索引号之间的相关性。例如,xFS提取文件索引号中的位作为进入管理者映射的索引。zFS使用内部文件管理器表来维护居住信息。然而,这种管理元数据的方式通常忽略了文件局部性的保留,因为目录在整个存储系统中变得分散。此外,它实现的可扩展性有限,因为仍未解决不均匀的元数据分布问题,而且在大规模分布式文件系统中维护映射表的开销可能是无法承受的。

C. 基于哈希的分区

基于哈希的方案通过将文件的标识符(例如,文件路径名)哈希化为哈希值,并通过某种投影将其元数据分配给不同的MDS,最好地平衡了服务器之间的工作负载。它还避免了单点故障,因为客户端可以直接检索元数据。一些文件系统如Vesta、Lustre和CalvinFS采用静态哈希方法。它们哈希文件的名称或完整路径以获得良好的负载平衡,并简化了查找操作跟踪。这种方法的主要缺点是它破坏了元数据的局部性,这将导致连带问题,如路径名修改的开销、服务器规模变化和访问控制。Lazy Hybrid是一种结合了哈希和层次目录的策略,并提出了一种懒惰策略,以实现高效的元数据更新和重新定位。哈希方法演变为改善层次目录分布的可扩展性,如目录哈希和动态哈希。目录哈希与文件哈希相比采用了更大的粒度(即,目录),因此在大规模存储系统中具有更好的可扩展性。然而,静态哈希只旨在平衡存储空间,并没有解决热点问题。在动态哈希中,MDS节点持续测量它们当前的负载水平,并定期将元数据从繁忙节点转移到非繁忙节点,以在整个系统中实现相对的负载平衡。

D. 动态子树分区

与其静态版本不同,动态子树分区方法在维护命名空间树局部性和负载平衡之间做出了权衡。它通过将整个子树细分为子子树,并将它们从负载较重的服务器动态迁移到负载较轻的服务器,降低了MDS分配的单位粒度。因此,它可以在服务器之间平衡工作负载。CephFS、GIGA+和IndexFS是采用动态子树分区方法的典型文件系统。Dynamic DirGrain讨论了最大粒度的选择。它提出了一个三元组〈D, D, F〉来确定子树的最大粒度,并动态调整元数据的分布。尽管与静态子树和哈希相比性能更好,动态子树分区仍然缺乏对访问模式变化的敏感性,这将导致热点的偶尔出现。此外,元数据分布的更新涉及到冗余的迁移成本。

E. 基于DHT的分区

最近,基于分布式哈希表(DHT)的方法因其自组织特性而被研究。DHT是一个映射节点和数据项的表,具有唯一的节点标识符和唯一的键。基于DHT的方案允许像Kosha这样的文件系统控制分布的粒度,提高了可扩展性和容错能力,但如重命名子目录等操作可能很昂贵,系统可能会遭受极端不平衡的情况。其他利用具有局部性保持哈希函数(LPH)的DHT探索工作包括DROP、AngleCut和DeepHash。它们通过重新计算每个MDS负责的哈希值范围,动态调整节点的分布。

总的来说,与之前基于历史的粗粒度动态元数据管理方案不同,AdaM采用了一种关注个别热点节点的细粒度迁移策略,并可以通过深度强化学习动态更新元数据分布

III. 问题形式化

在本节中,我们根据[11]中的思想,提出了元数据管理问题核心概念的详尽和数学描述。然后我们将问题形式化为一个定义了符号的优化问题。最后,我们概述了深度强化学习技术。

A. 符号和定义

在一个典型的分布式元数据系统中,有N个元数据节点和M个MDS,令T = {ni | 1 ≤ i ≤ N}表示元数据命名空间树上所有元数据节点的集合,而S = {mj | 1 ≤ j ≤ M}表示所有MDS的集合。

定义1:定义跳数Ji为在从根节点向上递归搜索节点ni期间,在不同MDS之间的“切换”次数。

定义2:定义流行度Pi为节点ni的总访问次数,其中Pi = access(ni) + ∑nj∈Di access(nj),并且Di表示ni的后代节点集,它既包括对ni的访问,也包括对其后代节点的访问的总和。 通常,大量的跳数会导致分布式系统的局部性差。此外,不同流行度的节点对总跳数的贡献不同。因此,我们给出下面的定义,其中局部性是跳数加权和的倒数。

定义3:定义Loc为整个元数据管理系统的全局局部性程度,如公式(1)所示:

一个大的Loc意味着元数据的局部性很好,即命名空间树中相邻的元数据节点更可能由同一个MDS维护。因此,访问一个元数据节点需要较少的跳数,这可以减少网络成本并提高查询效率。Loc的范围为(0, +∞)。

定义4:定义负载作为MDS mj的当前负载,即MDS mj中节点的流行度之和。

定义5:定义容量Cj为MDS mj的最大负载能力。

为了评估元数据管理系统的负载平衡程度,我们可以计算不同MDS之间负载因子的平均方差。令表示系统的全局理想负载因子。由于Lj是根据样本数据计算出来的,因此我们使用统计方法定义负载平衡程度,如[11]所建议的。

定义6:定义Bal为整个元数据管理系统的全局负载平衡程度,可以表示为公式(2)。

负载平衡度大表示负载平衡程度高,这意味着每个MDS的负载接近理想负载。因此,由于系统中没有热点,客户端请求可以更有效地处理。Bal的范围是(0, +∞)。

B. 问题陈述

我们的目标是在保持数据局部性的同时,通过动态迁移不同MDS之间的热节点来平衡系统负载。值得注意的是,当节点从一个服务器移动到另一个服务器时,迁移成本是不可避免的。

定义7:定义常量ui为节点ni的迁移成本。

定义8:定义MigCost为涉及节点分布更新的总迁移成本,可以表示为公式(3),其中H表示迁移的热点集合:

在实现中,我们将MigCost简化为迁移的热点数量,而不考虑MDS的拓扑结构、网络带宽等因素。因此,MigCost的范围是[0,N]。

为了在低迁移成本的情况下最大化元数据局部性和系统负载平衡,我们设置三个系数α、β和γ,使用加权和方法将Loc、Bal和MigCost组合起来,将多目标转换为单目标优化。元数据管理问题可以被形式化为一个顺序决策任务,旨在实现公式(4)和公式(5)所示的目标。

值得注意的是,MigCost是一个最小化的目标。我们使用对偶原理通过乘以负一(-1)将MigCost(t)转换为最大化。此外,其他目标组合方法,如简单加权法(SAW)可以实现帕累托最优。

C. 深度强化学习(DRL)

在由一系列决策组成的任务中,RL智能体将通过一系列观察、动作和奖励与环境交互:在时间步骤t,智能体根据环境状态st采取行动a,然后当状态转移到st+1时获得回报rt。智能体的最终目标是根据策略π(s,a)采取行动a,在s状态下实现最大的累积未来回报(γ是折扣因子)。策略π(s,a)通常是状态s处行动a的概率分布:。然而,传统的RL方法受到状态大小的限制,只能处理低维状态输入的问题。在深度强化学习中,策略π(s,a)和状态-动作值函数Q(s,a)可以通过神经网络进行近似,因此智能体可以处理高维状态的任务。以下是两种使用深度神经网络分别逼近策略π(s,a)和值函数Q(s,a)的典型DRL方法。在AdaM中,我们采用一个结合这两种方法的DRL算法。

1)深度Q网络(DQN):DQN是值为基础的DRL方法的代表。DQN的出现使得RL智能体能够从具有深度神经网络的高维输入中推导出环境的有效表示,以逼近最优状态-动作价值函数。深度学习的目标是找到策略πθ(a|s),它可以最大化参数θ的网络奖励rt的期望总和。

在每个时间步 t 中,回放缓冲区[35]会将智能体的经验 et = (st,at,rt,st+1) 存储在数据集 Dt 中。在学习过程中,会从缓冲区中随机均匀抽样小批量(s,a,r,s′) 用于网络更新。网络会根据以下损失函数[35]进行每次迭代更新:

其中γ为折扣因子,θi是网络参数,θi−是目标网络的参数(θi−仅在每C步 [35]中与θi一起更新)。

2)策略梯度(PG):PG是一种基于策略的RL算法。(如果某个动作出现能提升最终汇报,则让这个动作出现概率变大)当与神经网络结合时,它可以直接通过参数化网络从给定状态中近似计算出随机策略π(s,a;θ),如图3所示。状态-动作值函数的贝尔曼方程式是

一种基于策略的深度强化学习方法的一般表示方法,它使用神经网络来近似策略。

[36]证明了对于任何马尔可夫决策过程,在平均奖励或起始状态表述中,更新的梯度为:

其中ρ是智能体的目标,θ是网络参数,dπ(s)代表π下状态的分布,Qπ(s,a)指状态-动作值函数[35]。

在确定性策略梯度(DPG)[37]中,其目标策略为确定性,策略可以描述为一个函数µ:S←A。可以避免方程式(7)中的内部期望值[38],并且Bellman方程式可以写成:

网络参数θµ的更新类似于方程式(8),其中dµ代表µ下状态的分布:

IV. ADAM设计

A. 概述

在分布式系统领域,最近已经使用DRL来处理复杂的决策问题[39],[40],例如容器和虚拟机迁移。对于分布式元数据管理,名称空间树是庞大且随时间不断变化的,使问题变得复杂且昂贵。同时,当向MDS分配元数据时,我们应该考虑元数据位置和系统负载平衡。此外,分布式元数据管理可以被视为顺序决策过程,在该过程中,下一个周期的元数据分配取决于文件系统的当前状态。因此,我们可以利用DRL来优化这个问题。

应用DRL方法在分布式元数据管理任务中的关键问题是智能体如何以成本效益的方式行动。 DRL智能体的操作可以以多种方式定义:重新计算每个MDS负责的哈希值范围,从子树到MDS的更新映射或从元数据节点到MDS的新映射。然而,所有这些定义的操作都会使DRL方法代价高昂,因为状态和操作空间很大。那么我们应该如何为DRL智能体定义操作?根据我们在第I节中提到的元数据访问模式分析,大多数访问指向少量元数据节点(热节点)。鉴于这种长尾分布的元数据访问情况,我们可以通过让智能体只对热节点进行操作来大规模减少操作空间。通过这种方式,迁移成本可以被限制为O(P)(假设在分布式元数据系统中有P个热节点),同时消除了迁移那些微不足道的节点的冗余成本

图4显示了我们方案的总体设计。AdaM由两个主要模块组成:Env-Monitor(EM)和Migration Manager(MM)。Env-Monitor经常观察环境以收集有关整个元数据系统的重要信息。一段时间之后,EM生成当前环境的状态。根据观察到的状态,Migration Manager会采取行动,这是从热节点到MDS的更新映射。有关Env-Monitor的详细信息将在第IV-C节中讨论,Migration Manager将在第IV-D节中详细说明。

AdaM的图解。环境监视器(中)从环境(左)收集重要的状态信息,并生成当前元数据系统的特征向量。迁移管理器(右)由一个行动者网络和一个批评者网络组成,其中行动者根据观察到的状态采取行动,批评者产生一个信号(梯度w.r.t.a)批评这些行为。然后,它会从环境中获得网络更新的奖励。

B. 元数据特征编码

由于文件路径名不适用于机器学习算法的输入,为了使用DRL方法训练Adam模型,我们需要获取元数据节点的特征表示。即,在命名空间树上的每个元数据节点都应该被编码成一个向量。为此,一种简单的方法是在命名空间树上构建一个坐标系,并根据它们的位置对每个节点进行编码。然而,这种方法对于命名空间树结构的动态变化来说是不可扩展的。

最近,随着机器学习的发展,网络嵌入技术[41]成为一个热门研究课题,旨在学习网络中节点的低维潜在表示。同时,网络结构可以被保留,即两个相邻的节点具有相似的特征表示。像DeepHash[15]一样,我们可以将命名空间树看作一个无向网络,并通过这种技术将每个元数据节点嵌入到一个编码向量中。本文中使用的网络嵌入方法称为DeepWalk[42],它使用短的随机游走来学习节点的表示,并且可以有效地探索网络中的局部信息。通过利用DeepWalk,每个元数据节点ni都被编码为一个固定长度的向量ci,在DRL过程中将被用作标识符。此外,如果命名空间树中的两个元数据节点相邻,它们的编码向量在向量空间中也会非常接近。由于DeepHash和AdaM都是基于机器学习的模型,它们都利用网络嵌入来获得元数据节点的特征向量。另一方面,DeepHash使用神经网络学习一个保持局部性质的哈希函数,可以将元数据节点映射到线性哈希空间中,而AdaM使用DRL学习精细的迁移策略,专注于热元数据节点

C. 环境监视器(EM)

EM是一个中间组件,观察环境并将异构状态信息嵌入到特征向量中,可以用作迁移管理器中神经网络的输入。通常,EM收集环境统计信息,包括当前访问期间每个热节点的访问频率和元数据节点在MDS上的当前分布。然后,它将元数据命名空间树和观察到的统计数据组合成一个向量作为状态特征,这可以适当地保留关键信息,如在一段时间内单个节点的相邻结构和访问模式。

通过EM收集的所有状态信息,命名空间树中的元数据节点包含三个属性:标识符、指示器和频率

  • 标识符ci是表示命名空间树中节点i特征的编码向量,是在第IV-B节中得到的。
  • 指示器d(t)i是一个独热向量,表示节点i在时间步t时所属的MDS。
  • 频率fi(t)是一个数字,指的是当前时间段内节点i的访问频率。

因此,在每个时间步t,系统的状态由矩阵表示,如公式(11)所示,其中矩阵的第i行为节点i的特征向量s(t)i,s(t)i是ci、d(t)i和fi(t)的连接:

EM的最终输出是拼接的状态特征向量,形式为{s(1t),s(2t),...,s(Nt)}。然后,迁移管理器以此向量作为输入。

D. 迁移管理器(MM)

迁移管理器是基于Deep Deterministic Policy Gradient算法[38]设计的DRL智能体。MM由基于Policy Gradient方法[36]的actor网络和基于Deep Q-Learning方法[35]的critic网络组成。通常,actor基于EM生成的输入采取动作,而critic生成信号来评价这些动作。下面详细分析MM。

1)DRL公式化

考虑一个包含M个服务器、N个元数据节点和P个热节点的分布式元数据存储系统。MM在每个批量访问后动态迁移P个热元数据节点。我们给出DRL公式中主要元素的表示方式:

  • 状态。为了从环境中检索尽可能多的信息,状态st由三个特征部分组成:命名空间树的结构、MDS上节点的当前分布和上次访问期间的统计数据。通过EM,时间步t的状态可以被表示为向量:
  • 动作。智能体所采取的动作是将节点映射到服务器,表示P个热节点将在时间t迁移到哪些MDS上。它可以简单地表示为一个向量,其中ki∈{1,2,...,M} (i=1,2,...,P)表示节点i将被移动到MDS ki 上:
  • 奖励。MM所采取的动作每次都会收到奖励评估,这些评估是在下一个时间段的所有访问之后接收到的。由于智能体的最终目标是提高整个系统的性能并解决权衡困境,我们可以根据公式(4)定义时间步t的奖励:

2)DRL分析

虽然DQN和PG在解决具有高维状态空间的问题方面有显著优势,但它们不能直接应用于具有高维动作空间的任务,例如本文讨论的元数据迁移问题。DQN依赖于找到最大化动作值函数的动作,而当动作数量随维数数量呈指数级增加时,这是不可行的[38]。例如,考虑一个具有M个服务器和P个热节点的分布式元数据系统,每个热节点都有M个选择要迁移到的服务器,那么选择的组合总数将是MP。对于PG,如果动作空间的大小像MP一样大,那么给出一个随机策略就很难了。算法的适应如DPG和Deep Deterministic Policy Gradient方法(DDPG)[38]选择考虑确定性策略而不是由PG给出的随机策略[37]。在确定性情况下,消除了整个动作空间的整合的必要性,这使得DRL算法能够处理具有高维动作空间的任务成为可能。因此,在本文中,我们尝试将DDPG应用于元数据迁移问题,并在下一节中提供详细的算法。

3)学习迁移

由于我们的迁移任务具有高维动作空间,因此我们采用DDPG[38]作为智能体的DRL算法,这是一种基于确定性策略的混合DQN、PG和Actor-Critic [43]技术。在DDPG中,actor函数指定了在当前状态下的确定性策略,而不是由PG给出的随机策略。将链式法则应用于公式(10)后,我们得到了确定性策略梯度定理

其中是由critic网络生成的,以近似。Silver等人在[37]中证明了公式(15)是用于最大化策略目标的actor网络的梯度。critic网络使用与DQN中公式(6)类似的损失函数来更新其网络参数\theta ^{Q}

E. AdaM训练和部署

完整的学习过程如Alg. 1所示,其中使用目标网络进行稳定学习,τ是一个小的值用于软更新。为了提高模型的稳定性和训练效率,我们引入了三种机制,包括经验回放随机动作生成目标网络的软更新

  1. 随机初始化评论家网络Q和演员网络µ的参数。
  2. 初始化目标评论家网络Q'和目标演员网络µ',并将其参数设置为与Q和µ相同。
  3. 初始化回放缓冲区R,用于存储历史经验。
  4. 对于每个episode(迭代循环),执行以下步骤: a. 从环境中接收初始状态s0。 b. 对于每个step(时间步),执行以下步骤: i. 根据当前状态st,使用演员网络µ生成动作at,并添加一定的高斯噪声Nt以增加探索性。 ii. 根据当前动作at,与环境交互,得到下一个状态st+1。 iii. 根据奖励函数计算即时奖励rt。 iv. 将经验转换(st,at,rt,st+1)存储到回放缓冲区R中。 v. 从回放缓冲区R中随机采样一个小批次的经验(si,ai,ri,si+1)。 vi. 使用目标演员网络µ'计算目标标签yi,用于更新评论家网络Q。目标标签的计算基于Bellman方程。 vii. 更新评论家网络Q的参数,以最小化损失函数L。 viii. 使用采样版本的方程(16)更新演员网络µ的参数θµ。 ix. 使用软更新(soft update)的方式更新目标评论家网络Q'和目标演员网络µ'的参数。
  5. 返回训练好的演员网络µ作为最终模型。

经验回放:当使用DDPG算法学习元数据管理策略时,DRL智能体(即迁移管理器)与分布式文件系统交互,获取大量历史轨迹(s1,a1,r1,s2,a2,r2,·····),其中st表示时间t时观察到的分布式文件系统的状态,at表示动作(即元数据迁移策略),rt是执行动作后的立即奖励(即式(14))。然而,在正式的监督学习中,训练数据应独立同分布,而历史轨迹中的连续样本(st,at,rt,st + 1)彼此相关,这会影响模型的训练效率。

为解决这个问题,我们维护一个“回放缓冲区”,其中我们将每个样本(st,at,rt,st + 1)独立记录为历史经验。我们通过从重放缓冲区中随机取样多个样本来训练神经网络,而不是使用每个模拟更新DRL智能体,如Alg. 1中的行10-11所示。这种机制在逻辑上将学习阶段与获取经验分开,具有两个优点。首先,获得大型分布式文件系统的实际经验成本高昂。我们可以通过多次使用重放缓冲区中的样本学习以更好地利用以前的元数据管理经验。其次,我们将完整的轨迹分解为样本,使得训练数据独立同分布,可以加速神经网络的收敛并提高训练效率。

随机动作生成:正如之前所讨论的,DDPG是一种确定性算法。该方法将基于分布式文件系统观察到的状态始终生成确定性元数据迁移策略,指示需要迁移哪些元数据。但是,由于模型参数在开始时是随机初始化的,直接使用确定性策略会强制网络从有限的动作空间中进行选择,这会影响模型的训练。例如,如果DRL智能体决定将元数据节点ni存储在MDS mj中,则智能体可能永远不会探索其他MDS,即使有更适合存储ni的MDS。

为增加DRL智能体的探索性并增加动作的多样性,我们引入一个均值为零的高斯噪声N进行动作选择,如Alg. 1中的行7所示。该机制使智能体能够探索更广泛的元数据管理策略空间,并提高模型的效果。
目标网络的软更新:为了提高训练稳定性,我们引入了两个目标网络Q'和µ',用于计算目标标签,如Alg. 1的行12-14所示。在优化Q'和µ'时,一种方法是直接从相应的评论家Q和演员µ每隔一定步数直接复制整个参数。然而,这种方法将导致网络参数的突然变化,从而使元数据迁移策略不稳定,导致大量元数据迁移。在本文中,我们采用一种称为“软更新”的技术,通过引入参数τ来实现。如Alg. 1的行15-16所示,我们制作目标网络参数的副本,并使它们缓慢跟踪学习网络的参数。在每次迭代中,目标网络通过先前和当前网络的加权和进行更新,可以保持模型的稳定性。

将AdaM部署到实际文件系统的过程可以分为两个阶段:离线训练在线训练。在离线训练时,我们首先使用实际数据集在模拟环境中训练AdaM。我们根据元数据局部性(即式(1))、负载平衡(即式(2))和迁移成本(即式(3))在整个训练过程中计算奖励(即式(14)),然后使用Alg. 1更新模型。获得预训练模型后,我们将其部署到实际系统中。在在线训练时,我们首先使用传统的元数据管理方案(例如基于哈希的映射或静态子树分区)对整个命名空间树进行分区和分布,并讨论初始化方法的影响(见第VI-F节)。在系统运行期间,我们将热元数据节点在MDS之间迁移,将每个元组(st,at,rt,st + 1)存储在回放缓冲区中。随着时间的推移,我们将从回放缓冲区中采样训练数据,并更新AdaM以适应当前环境。

V. 缓存管理和2PC协议

为了提高元数据查询效率,在本节中,我们介绍了分布式文件系统的详细架构,以优化其整体性能。首先,我们设计了一种自适应缓存策略,它可以根据不同的访问模式和迁移状态动态地更改每个文件的缓存策略。其次,我们提出了一种基于两阶段提交协议(2PC)的原子提交协议,以确保分布式元数据事务的一致性。

A. 自适应缓存策略

为了降低重复访问的成本,一个客户端可以在其客户端内存中缓存热元数据。缓存策略负责维护所有客户端缓存的一致性,即确保对MDS中元数据的任何修改都将广播到相应的客户端。我们提出了一种自适应策略,根据变化的访问模式和迁移状态动态地在特定文件的服务器端和客户端之间切换缓存策略,以最小化开销。

1)概述

首先,我们简要介绍两个缓存策略的基本思想。在基于服务器的策略中,MDS管理将缓存的元数据与相应客户端的表相关联。每当有元数据更新时他们发送失效消息以通知客户端。在基于客户端的策略中,客户端在特定租约期间向目标MDS发送重新验证消息,以验证其缓存中的元数据的新鲜度。考虑到不同策略下由客户端和服务器生成的控制消息数量,一个直观的想法是,当元数据更新频繁时,不适用于基于服务器的策略,否则必须在短时间内传递大量的失效消息。当修改率相对较低时,基于服务器的策略比较受欢迎,因为客户端可以直接引用缓存而不会产生额外的验证成本。

在本文中,我们提出了一种灵活的缓存策略,称为自适应缓存策略,将上述两种缓存策略结合起来以获得更好的性能。根据HopsFS [44]的数据,大约95%的元数据操作是列表、读取和统计操作,并不需要元数据更新。因此,大部分时间,文件应采用基于服务器的策略。就我们的模型而言,迁移管理器会在每次访问之后定期迁移热门元数据节点,以便在短时间内进行快速的元数据更新。当发生密集的元数据修改时,如果热门节点下的文件切换到基于客户端的策略,性能可以得到改善。因此,我们附加了额外的信息,表示每个元数据的缓存策略。非热门元数据使用基于服务器的策略,而热门元数据在迁移发生时切换策略

2)自适应缓存策略的一致性

保证MDS和文件的缓存策略一致性是必不可少的,以避免出现“死锁”。例如,如果一个MDS是基于客户端的(等客户端发验证信息),而客户端是基于服务器的(等服务器发失效信息),它们将永远不会相互发送控制消息。

当一个文件将其缓存策略从基于服务器的切换到基于客户端的时候,它需要通知所有客户端进行更改,从而产生大量额外的控制消息。为了减少额外的开销,我们限制只有在修改元数据时才能更改缓存策略。然后,MDS根据基于服务器的策略向客户端发送作废消息,并将其缓存策略切换为基于客户端的。客户端接收到消息后,删除过期的元数据,并同步缓存策略。切换回基于服务器的策略只需要等待客户端验证最新的缓存策略,无需额外的同步工作。一个文件可以随时将其缓存策略从基于客户端切换回基于服务器。

3)实现

自适应缓存策略的流程图如图5所示。当元数据迁移开始时,热门节点下的文件切换到基于客户端的策略。在此期间,我们使用悲观并发模型来支持并行的读写操作。当MDS从客户端接收到重新验证消息时,它会暂时锁定迁移过程,并延迟任何修改。然后,它将最新的元数据发送给客户端以实现对文件的访问。之后,客户端将发送解锁消息,允许MDS继续迁移。最后,热门节点下的文件切换回基于服务器的策略。

我们为基于服务器的策略设置了客户端缓存验证的有效时间,并在基于客户端的策略中采用基于时间的租约机制。因此,自适应缓存策略保持了缓存数据的一致性。

B. 分布式元数据处理协议

在分布式文件系统中,创建、删除、mkdir和rmdir等操作可能需要两个或多个MDS协同工作,因为目录和文件被划分到不同的MDS中。例如,mkdir会在父目录中插入一个新条目,并在MDS 1中更新父节点(子操作1)。同时,它会分配一个目录inode并在MDS 2中创建一个本地文件以存储目录的新条目(子操作2)。如果某个MDS发生故障,可能会导致系统不一致。因此,需要一个可靠的协议来保证事务的统一提交。两阶段提交协议(2PC)[18]是一种处理这个问题的基本协议。文件系统中的每个站点都有一个日志,记录事务过程中状态的变化。站点被分为协调者参与者。它们通过投票阶段提交阶段相互建立承诺。然而,正如图6(a)所示,这个协议在性能和可靠性方面存在瓶颈,因为整个过程需要一对站点之间的五条消息,并且每条消息都可能发生传输故障

1)MST-Based 2PC概述

在本文中,我们提出了基于MST的2PC,可以有效地保证分布式元数据事务的数据一致性。MST-based 2PC的流程图如图6(b)所示。根据对文件系统中元数据操作分布的研究,几乎不会出现需要多于两个MDS承诺的操作,例如链接和重命名[2]。因此,为了简化设计,我们只修改处理需要恰好两个MDS的操作的协议。2PC负责处理具有多个MDS的少量操作。在提出的方案中,我们将本地消息状态表(MST)和面向消息的中间件(MOM)结合起来,以实现更高的效率和可靠性。基于MOM的系统支持客户端和服务器之间的异步消息传递。MOM为客户端提供路由、传递和保留消息的服务,使客户端摆脱这些问题。此外,MOM的松耦合使得系统能够根据需求实现不同级别的可靠性和可扩展性。

协调者首先完成子操作1,并在MST中添加一个条目,使得该事务消息持久化。然后,它通过MOM向参与者发送准备消息(PREPARE),这不仅通知参与者要执行的子操作2,还暗示协调者已经在投票阶段中投了赞成票。参与者收到来自MOM的消息后,完成子操作2,并将结果写入其日志中,以防止重复执行。然后,它向MOM发送一个确认消息(ACK)和向协调者发送一个提交消息(COMMIT)。之后,MOM删除PREPARE消息,协调者删除MST中的事务消息,表示承诺结束。

2)处理故障

在上述过程中,每个消息传输都可能失败。在本节中,我们讨论了图6(b)中不同阶段的故障处理方式。

  • 如果①失败,整个事务将不会执行,因此两个站点保持不变。
  • 在②中,可以通过恢复系统来处理故障。恢复系统会定期检查MST中长时间未被删除的条目,一旦发现过期条目,就会向MOM重新发送PREPARE消息。
  • 如果③、④和⑤失败,MOM将无法从参与者获得ACK。它会重新发送未被删除的PREPARE消息,直到子操作2成功为止。
  • 如果⑥失败,恢复系统将执行与情况②相同的操作。

3)恢复系统

恢复系统负责处理协调者与MOM之间的消息传递故障。MST中的每个消息都有一个存在时间的计数器。恢复系统定期检查MST中的记录。只要计数器超过预设阈值(表示可能发生消息丢失),它就允许协调者向MOM重新发送相应的PREPARE消息。

通过这种方式,只要完成子操作1,MST就会监督参与者执行子操作2,从而确保两个站点的承诺。这种改进不仅减少了2PC协议中需要交换的总消息数,还防止了参与者被阻塞,并正确处理对一致性有害的故障。

VI. 评估

在本节中,我们使用一个真实的数据集对AdaM进行评估。 实验主要针对以下四个问题:1)与其他方案相比,AdaM在负载均衡和地域保护之间的权衡问题上表现如何。2)AdaM在现有动态方案中对时变访问模式的自适应程度如何。3)我们提出的精细迁移策略是否能有效降低迁移成本。4)初始化方案如何影响我们的模型性能。

A. 实验设置

1)数据集

我们在一个15.1 GB的真实跟踪数据集LiveMap上进行实验。我们从原始跟踪中过滤出一个与元数据相关的访问跟踪,并在其中测试AdaM,该跟踪包含了共计88,160,590条记录。

2)基线

AdaM与以下方案进行比较,包括基于哈希的方案和基于子树的方案:

  1. 基于哈希的映射。一种静态方法,注重工作负载的均匀分配[9]。
  2. 静态子树分区。一种静态策略,强调局部性[10]。
  3. 动态子树分区。一种动态方案,通过在服务器之间迁移子树来重新分配节点[13]。
  4. AngleCut。AngleCut采用一种新颖的保持局部性的哈希函数,并通过重新计算每个MDS负责的哈希值范围来动态调整节点-服务器映射[11]。

3)实现

我们使用Python 3.6实现了AdaM,使用流行的DRL框架Keras作为Tensorflow 1.8的后端,并在Amazon EC2上部署程序运行我们的实验。每个实例运行Ubuntu 17.04操作系统。迁移管理器中的actor网络包含两个全连接的隐藏层,分别有300个和500个神经元。评论家网络的两个隐藏层分别获得300个和600个神经元。与actor不同,评论家将状态和动作作为输入。为了获得更好的性能,我们为actor和评论家设置了不同的学习率(actor为0.00001,评论家为0.0001)。根据数据集,我们选择了三个系数α、β和γ的值为1×10^5、1×10^7和1.5。我们将前80%的跟踪用于在线训练,20%的跟踪用于测试。我们使用网格搜索[45]在小规模上观察演员-评论家网络损失的收敛来确定最优参数。此外,我们可以利用贝叶斯优化方法[46]进一步减少参数调整所花费的成本。

实验以以下方式进行。我们首先分析聚合吞吐量和缓存策略,见第VI-B节。然后在第VI-C节中评估元数据局部性保护程度和系统负载均衡。我们在第VI-D节中研究迁移成本。最后,在第VI-E节和第VI-F节分别研究分布式元数据处理和AdaM的初始化方法。

B. 性能和缓存策略

在这个实验中,我们评估了所提出方案的性能,如图7所示。我们将跟踪数据分为块,并将它们分配给多个客户端线程。每个数据块包含2000个查询项,包括查找和更新操作。为了更好地说明实验结果的合理性和效率,在核心元数据管理机制之外,所有这些方案都实现了前面讨论过的相同特性。

如图7(a)所示,我们使用吞吐量来衡量文件系统的性能,即系统每秒能处理的元数据操作数量。如图7(a)所示,由于精细迁移策略,AdaM在其他元数据管理方案中表现最佳。AdaM利用深度强化学习算法动态解决时变的元数据访问模式,从而获得更高的性能。此外,随着服务器规模的增加,AdaM的性能相应提高,这表明该方案具有良好的可扩展性。此外,当MDS数量较小时,静态子树分区的吞吐量比动态子树分区和AngleCut更高,因为它保持了良好的元数据局部性,从而有效地减少了响应延迟。

图7(b)显示了使用不同缓存策略的AdaM的吞吐量,“基于服务器的缓存”策略和“基于客户端的缓存”策略分别表示缓存验证过程由MDS或客户端控制。“自适应缓存”策略是一种灵活的缓存策略,根据查询工作负载模式获得更好的性能,如第V-A节所讨论的。如图7(b)所示,当没有缓存加速查询时,系统的性能最差。从前面的章节我们知道,大多数元数据操作不需要更新命名空间树。在这种情况下,AdaM采用的基于服务器的缓存策略可以消除多余的验证消息,优于基于客户端的缓存策略。此外,通过结合这两种策略的优点,“自适应缓存”策略可以根据当前系统状态灵活调整缓存策略,从而有效提高系统性能。

C. 元数据地域保护和系统负载均衡

在本部分中,我们评估AdaM在两个方面的能力:a)解决权衡问题的能力;b)适应时间变化和不确定访问模式的能力。我们分别在5、10和15个服务器上测试了AdaM和基准,并且它们每1000次访问更新一次节点分布。此外,我们使用静态子树分区来初始化AdaM的元数据节点映射。

1)元数据局部性

由于静态子树分区最好地保留了元数据的局部性,我们将其作为基准使用其局部性(Loc)。然后计算其他方案相对于静态子树分区的局部性比率,以表示它们在维护局部性方面的性能。图8展示了在不同规模的MDS集群中测试方案的Loc比率随时间的变化情况。图8(a)显示,在小规模MDS集群中,AdaM的平均性能接近AngleCut。由于元数据命名空间树只被划分到了5个服务器上,AngleCut和Dynamic Subtree Partition都可以保持很好的元数据局部性。然而,如图8(b)和图8(c)所示,随着MDS数量的增加,AdaM优于所有其他方案。需要注意的是,AdaM采用静态子树分区来初始化元数据节点映射,并且只迁移了一小部分热元数据节点以平衡系统,从而保持了很高的元数据局部性。相反,基于哈希映射的方案由于其哈希映射方案而导致元数据局部性较差。

2)负载均衡

对于负载均衡,我们使用基于哈希映射作为基准,因为它在前期工作中自然地保持了理想的负载均衡水平。同样,计算Bal比率以揭示方案保持负载均衡的能力。如图9所示,AdaM展示了比其他方案更好地保持负载均衡的能力,甚至在某些时间步骤中超过了基于哈希映射的方案。如图9(a)、图9(b)和图9(c)所示,随着MDS数量的增加,Adam与其他方案之间的性能差距变大,这表明AdaM具有很高的可扩展性。需要注意的是,基于哈希映射的方案可能会将一些热元数据节点分配到一个MDS中。采用细粒度迁移策略的AdaM,在负载平衡维护方面甚至比基于哈希映射的方案在某些时段表现更好。

3)适应不断变化的访问模式

为了说明方案对于不断变化的访问模式的适应能力如何,图10提供了在访问模式变化时10个MDS上负载分布的更直观的可视化结果,我们可以发现对元数据节点的访问集中在可能包含热子树的一个服务器上。随着动态更新的进行,原本负载较重的服务器继续负责大部分工作,在Dynamic Subtree Partition和AngleCut中都是如此,如图10(a)和图10(b)所示。相反,如图10(c)和图10(d)所示,DeepHash和AdaM的工作负载在大部分时间内在MDS之间平衡。DeepHash利用三阶段算法来迁移具有一致哈希的“虚拟节点”,以有效平衡系统负载。然而,由于DeepHash采用粗粒度的迁移策略,它可能表现得不够灵活,并导致较高的迁移成本,这将在第VI-D节中讨论。AdaM利用DRL对访问模式进行预测,并采用针对热节点的细粒度策略,可以减少响应时间以及系统的僵化性。因此,AdaM能够快速响应环境并采取有效的措施将一些热节点迁移到其他服务器,从而大大减轻了负载过重的服务器的负担。

D. 迁移成本评估

接下来,我们通过使用迁移元数据节点在命名空间树中所占比例作为衡量标准,评估动态方案的迁移成本,如图11所示。可以看到,AdaM的迁移成本远低于其他三种方案。原因是我们采用了细粒度的迁移方法,专注于个别热元数据节点,从而显著降低了不必要的成本。此外,由于AngleCut和DeepHash的迁移对象是具有连续哈希值的“虚拟节点”,它们的迁移成本低于Dynamic Subtree Partition,后者迁移整个子树。随着MDS数量的增加,Dynamic Subtree Partition越来越难以平衡系统负载,相应地导致更大的迁移成本。与AngleCut相比,DeepHash采用控制器来监视迁移过程,防止频繁的迁移过程。

E. 分布式元数据操作

在本节中,我们评估了基于MST的2PC(元数据处理的分布式原子提交协议)的性能。我们生成70%读操作和30%更新操作(即插入、更新和删除)的查询工作负载,以确保实验的有效性。图12显示了结果。分布式元数据处理通常涉及多个参与同一事务的服务器。如果用于协调跨服务器元数据操作的协议设计不好,将会导致进一步的操作阻塞。如图12所示,MST-based 2PC的性能优于2PC。原因是MST-based 2PC集成了本地消息状态表和面向消息的中间件,从而实现了更高效的设计。此外,随着MDS数量的增加,MST-based 2PC的性能提高,展示出更强的可扩展性。另一方面,2PC在MDS之间引入过多的网络通信,导致高网络延迟并遭受性能瓶颈。

F. 初始化方法的影响

最后,我们进行实验来观察初始化方式如何影响AdaM的性能。如图13(a)和图13(b)所示,将基于哈希映射的初始化方式与基于静态子树分区的初始化方式所得到的系统的负载均衡程度和元数据局部性进行了比较。如图13所示,使用基于哈希映射的初始化方式的负载均衡性能更好,但是这两种方案之间的负载均衡程度差距较小。相反,与使用基于哈希映射的初始化方式相比,使用基于静态子树分区的初始化方式可以更好地保持元数据局部性。因此,在上述实验中,我们采用了基于静态子树分区的方案来初始化AdaM。

VII. 结论

本文提出了第一个基于深度强化学习的分布式元数据管理方案AdaM。AdaM采用了细粒度的更新策略,并利用演员-评论家网络来自动在服务器之间迁移热元数据节点,以实现负载均衡并保持元数据局部性,同时降低成本。提出了自适应元数据缓存策略,以提高查询效率并减少网络开销。此外,设计了一种高效的分布式处理协议MST-based 2PC,以确保分布式元数据事务的一致性。在Amazon EC2平台上进行的实验表明,AdaM在查询性能方面优于其他方案,解决了权衡问题、适应不同访问模式和迁移成本等挑战。

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

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

相关文章

算法学习——华为机考题库7(HJ41 - HJ45)

算法学习——华为机考题库7(HJ41 - HJ45) HJ41 称砝码 描述 现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称…

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​

数据结构----队列(Queue)的概念、队列的使用、模拟实现队列、循环队列、模拟实现循环队列、双端队列、模拟实现双端队列

文章目录 1 概念2 队列的使用3 队列模拟实现4 循环队列4.1 循环队列 概念4.1 循环队列模拟实现 5. 双端队列 (Deque)6 用队列实现栈7 用栈实现队列 1 概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有…

会计的记账凭证

目录 一. 记账凭证的填制与审核1.1 收付款凭证1.2 转账凭证1.3 单式记账凭证 二. 记账凭证的编号 \quad 一. 记账凭证的填制与审核 \quad \quad 1.1 收付款凭证 \quad 注意︰ 凡是涉及货币资金之间收付款的业务如将库存现金存入银行或从银行提取现金等类经济业务。在实际工作中…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件,形成书籍一样的文件。有多种主题供你选择,很适合项目使用。 MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档。文档源文件在 Markdown 编写,使用单个 YAML …

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们,我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料,霍雨浩开局便释放六个十万年魂环,以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛,霍雨浩便大放异彩秀出超级霍挂,此等操作就连当初的唐…

2023.12 淘天-数科 已offer

文章目录 岗位信息1面ld 12.17 1H2面 VP 12.18 40min3面 HR 12.2012.21offer薪资方案沟通 岗位信息 1面ld 12.17 1H (是一个从业估计很长时间前辈,很平和,感觉能学到很多东西) 自我介绍项目深究1.说下自己工作里最有成就感的事和…

【用Unity开发一款横板跳跃游戏部分需要学习的技术点指南】

*** 用Unity开发一款横板跳跃游戏部分需要学习的技术点指南 空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏,庞大的游戏世界交错相通,玩家控制小虫子去探索幽深黑暗的洞穴,成为了一代人茶余饭后的惦念,深受玩家喜爱。 …

Peter算法小课堂—Dijkstra最短路算法

大家好,我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦,hia~hia~hia。今天,我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法?长文警告⚠ 正经点啊 手算样例 大家思考一下,你在手算样例的时候&am…

MATLAB实现随机森林(RF)回归与自变量影响程度分析

本文分为两部分,首先是对代码进行分段、详细讲解,方便大家理解;随后是完整代码,方便大家自行尝试。另外,关于基于MATLAB的神经网络(ANN)代码与详细解释,我们将在后期博客中介绍。 1…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

Navicate 连接云服务器MySQL

Navicate 连接云服务器MySQL 1.打开Navicate,点击左上角的连接,选择MySQL 第一步:第一个页面是常规,按照图上的标注填写 第二步,点击 SSH ,进入下面的页面 第三步,点击测试连接

FreeRTOS任务相关的API函数

本篇文章记录我学习FreeRTOS的任务相关的API函数。主要涉及FreeRTOS的任务创建和删除函数、任务挂起和恢复函数。希望我的分享对你有所帮助。 读者如果需要实战FreeRTOS动态/静态任务创建和删除,可以参考以下文章: FreeRTOS动态 / 静态创建和删除任务-CS…

C++初阶 内存管理和模板

目录 一、new 1.1什么是new? 1.2为什么要有new? 1.3使用new 1.4 new的超级好处 二、delete 2.1什么是delete? 2.2为什么要有delete? 2.3使用delete 三、 malloc / free和new / delete的共同点和区别 四、浅谈模板 4.1什…

嵌入式学习第三篇——51单片机

目录 1,嵌入式系统 1,嵌入式系统的定义 2,单片机的定义 2,51单片机 1,开发环境 2,开发板使用的基本思路 1,查看原理图,查看芯片手册 2,获得调用硬件的管…

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据,但是这个数据的投影问题非常头疼。实际的投影应该长这样(https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…

4K Video Downloader forMac/win:畅享高清视频下载的终极利器!

在如今的数字时代,高清视频已经成为人们生活中不可或缺的一部分。无论是观看精彩的电影、音乐视频,还是学习教育类的在线课程,我们都希望能够以最清晰流畅的方式来欣赏。而为了满足这一需求,我们需要一款功能强大的高清视频下载软…

一文读懂C++的类和对象以及多态的原理

现实生活中,关于类和对象最好的例子是自然界的动物类,本文将以此为场景逐步引入C的概念,达到学习的目的。因为C这门语言本身有很多繁杂的内容,而网上的资源也是参差不齐,有的人见山谈山遇水聊水,有多人故弄…