【HDFS实战】HDFS联合(联邦)集群的发展史

news2024/11/17 22:48:02

HDFS联合集群的发展史

文章目录

  • HDFS联合集群的发展史
    • HDFS原始架构
    • 方案一 HDFS Federation
    • 方案二 ViewFs
    • 方案三 HDFS Router-based Federation
      • 常用命令
      • 常用配置
        • RPC server
        • Connection to the Namenodes
        • Admin server
        • HTTP Server
        • State Store
        • Routing
        • Namenode monitoring
      • 版本
      • 相关issues

HDFS原始架构

不管是之后的 NN与secondary namenode还是standby namenode其实实际运行的时候都是都可以抽象成以下的架构,因为active NN是唯一的。

请添加图片描述

HDFS拥有两个层

  • Namespace
    • 由目录、文件和块组成。
    • 它支持所有与命名空间相关的文件系统操作,例如创建、删除、修改和列出文件和目录。
  • Block Storage Service
    • 块管理(在Namenode中执行)
      • 通过处理注册和定期心跳来提供 Datanode 集群成员资格
      • 处理块报告并维护块的位置。
      • 支持块相关操作,如创建、删除、修改和获取块位置。
      • 管理副本放置、复制不足的块的块复制以及删除复制过度的块。
    • 存储 - 由 Datanodes 通过在本地文件系统上存储块并允许读/写访问来提供。

HDFS联合集群的目的是为了支持子集群进行横向联合。

方案一 HDFS Federation

之前的HDFS架构只允许整个集群有一个命名空间。 在原始架构中,由单个 Namenode 管理命名空间。 HDFS Federation 通过向 HDFS 添加对多个 Namenode/命名空间的支持来解决此限制。

多个namspaces/NNs

为了水平扩展名称服务,联合使用多个独立的Namenodes/namespaces。 Namenodes是联合的; Namenodes是独立的,不需要相互协调。 Datanodes 被所有 Namenodes 用作块的公共存储。 每个Datanode向集群中的所有Namenode注册。 数据节点定期发送心跳和块报告。 它们还处理来自Namenodes的命令。
请添加图片描述

Block Pool

HDFS Federation 引入了块池特性,每个块池有一个唯一的ID,块池与NN是一一对应的,等于一个子集群拥有一个块池。

块池是属于单个命名空间的一组块。块池的块分散存储在整个Datanodes中,每个块池都是独立管理的。 这允许命名空间为新块生成块 ID,而无需与其他命名空间协调。 Namenode故障不会阻止Datanode为集群中的其他Namenode提供服务。

命名空间及其块池一起称为命名空间卷。 它是一个独立的管理单位。 当删除Namenode/namespace时,Datanode上相应的块池也会被删除。 在集群升级期间,每个命名空间卷都会作为一个单元进行升级。

ClusterID 标识符用于标识集群中的所有节点。 当 Namenode 被格式化时,该标识符要么被提供,要么自动生成。 该 ID 应用于将其他 Namenode 格式化到集群中。

命名空间可扩展性 - 联合添加了命名空间水平扩展。 通过允许将更多 Namenode 添加到集群,大型部署或使用大量小文件的部署受益于命名空间扩展。

性能——文件系统吞吐量不受单个Namenode的限制。 向集群添加更多 Namenode 可扩展文件系统读/写吞吐量。

隔离 - 单个 Namenode 在多用户环境中不提供隔离。 例如,实验性应用程序可能会使 Namenode 过载并减慢生产关键应用程序的速度。 通过使用多个Namenode,可以将不同类别的应用程序和用户隔离到不同的命名空间。

缺陷:

  1. 不同NN之间是无法感知的。不是真正NN上的扩容,属于一个伪NN扩展。
  2. 引入一个新的NN之后,并没有直接降低原来NN的压力,类似新搭建一个集群,然后需要做手动迁移,分担压力。
  3. 客户端访问不同的NN,需要自行维护映射关系。

每个集群的 core-site.xml 都有一个配置属性,用于将默认文件系统设置为该集群的 namenode

这样的配置属性允许使用斜杠相对名称来解析相对于集群名称节点的路径。 例如,路径 /foo/bar 使用上述配置引用 hdfs://namenodeOfClusterX:port/foo/bar

<property>
  <name>fs.default.name</name>
  <value>hdfs://namenodeOfClusterX:port</value>
</property>

路径名的使用模式

  1. /foo/bar(最佳使用方式)

    • 等价于 hdfs://namenodeOfClusterX:port/foo/bar.
  2. hdfs://namenodeOfClusterX:port/foo/bar

    • 虽然这是一个有效的路径名,但最好使用/foo/bar,因为它允许应用程序及其数据在需要时透明地移动到另一个集群。
  3. hdfs://namenodeOfClusterY:port/foo/bar

    • 它是一个 URI,用于引用另一个集群(例如集群 Y)上的路径名。具体来说,将文件从集群 Y 复制到集群 Z 的命令如下所示:
     distcp hdfs://namenodeClusterY:port/pathSrc hdfs://namenodeClusterZ:port/pathDest
    
  4. webhdfs://namenodeClusterX:http_port/foo/barhftp://namenodeClusterX:http_port/foo/bar

    • 这些是分别用于通过WebHDFS文件系统和HFTP文件系统访问文件的文件系统URI。 请注意,WebHDFS 和 HFTP 使用名称节点的 HTTP 端口,但不使用 RPC 端口。
  5. http://namenodeClusterX:http_port/webhdfs/v1/foo/barhttp://proxyClusterX:http_port/foo/bar

    • 这些是分别用于通过 WebHDFS REST API 和 HDFS 代理访问文件的 HTTP URL。

假设有多个集群。 每个集群都有一个或多个NN。 每个NN都有自己的名称空间。 一个NN属于一个且仅一个集群。 同一集群中的NN共享该集群的物理存储。 跨集群的命名空间和以前一样是独立的。

操作根据存储需求决定集群中每个NN上存储的内容。 例如,他们可能将所有用户数据(/user/<username>)放在一个NN中,将所有提要数据(/data)放在另一个NN中,将所有项目(/projects)放在另一个NN中,等等。

方案二 ViewFs

ViewFs主要目的为了解决 HDFS Federation中多NN访问难的问题

查看文件系统 (ViewFs) 提供了一种管理多个HDFS子集群的方法。 ViewFs 类似于某些 Unix/Linux 系统中的客户端挂载表。 ViewFs 可用于创建个性化命名空间视图以及每个集群的映射。

使用 ViewFs 为每个集群提供一个全局命名空间

为了提供与旧版本的透明度(用户无感),使用ViewFs文件系统(即客户端挂载表)为每个集群创建独立的集群命名空间视图,这与旧版本中的命名空间类似。 客户端挂载表与 Unix 挂载表类似,它们使用旧的命名约定挂载新的命名空间卷。 下图显示了挂载四个命名空间卷 /user/data/projects /tmp 的挂载表:

请添加图片描述

ViewFs 实现了 Hadoop 文件系统接口,就像 HDFS 和本地文件系统一样。 从某种意义上说,它是一个普通的文件系统,它只允许链接到其他文件系统。 由于 ViewFs 实现了 Hadoop 文件系统接口,因此它可以透明地工作于 Hadoop 工具。 例如,所有 shell 命令都可以与 ViewFs 一起使用,就像与 HDFS 和本地文件系统一样。

<property>
  <name>fs.defaultFS</name>
  <value>viewfs://clusterX</value>
</property>

路径名使用模式

  1. /foo/bar(最佳使用方式)

    • 这相当于viewfs://clusterX/foo/bar。 如果在旧的非联合集群中使用这样的路径名,则到联邦的过渡是透明的。
  2. viewfs://clusterX/foo/bar

    • 虽然这是一个有效的路径名,但最好使用/foo/bar,因为它允许应用程序及其数据在需要时透明地移动到另一个集群。
  3. viewfs://clusterY/foo/bar

    • 它是一个 URI,用于引用另一个集群(例如集群 Y)上的路径名。具体来说,将文件从集群 Y 复制到集群 Z 的命令如下所示:
     distcp viewfs://clusterY/pathSrc viewfs://clusterZ/pathDest
    
  4. viewfs://clusterX-webhdfs/foo/bar and viewfs://clusterX-hftp/foo/bar

    • 这些分别是用于通过WebHDFS文件系统和HFTP文件系统访问文件的URI。
  5. http://namenodeClusterX:http_port/webhdfs/v1/foo/bar and http://proxyClusterX:http_port/foo/bar

    • 这些是分别用于通过 WebHDFS REST API 和 HDFS 代理访问文件的 HTTP URL。 请注意,它们与以前相同。

跨命名空间重命名路径名

在旧版本中,用户无法跨NN或集群重命名文件或目录。 此版本也是如此,但有一些额外的变化。 例如,在旧版本中,人们可以执行以下命令。

rename /user/joe/myStuff /data/foo/bar

如果 /user/data 实际上存储在集群内的不同NN上,这在联合集群中将不起作用。

方案三 HDFS Router-based Federation

HDFS Router-based Federation主要目的为了解决 HDFS Federation中多NN访问难的问题(取代ViewFS),实现客户端访问多个子集群之间的负载均衡,支持跨子集群均衡数据,让数据可以实现冷热子集群之间的迁移。

由于以下原因会限制NN的可扩展性:

  • 元数据的开销
  • DN的心跳检测
  • HDFS RPC客户端的数量

之前HDFS扩展方案:

  • 采用联合视图(ViewFS),问题在于如何维护子集群的分割(例如命令空间的分区),这迫使用户连接到多个子集群上管理文件夹和文件的分配。

基于路由的联合

在子集群之上建立了一个的软件层,用来负责联合的命名空间的工作。这个额外的联合层,使得用户访问的访问子集群是透明的,子集群独立管理自己的本身的块池,还支持子集群之间的数据均衡。

使用基于路由的联合集群的子集群可以是独立的HDFS集群,也可以是federation集群,还可以是混合集群(独立的HDFS集群+federation集群)。

联合层的核心组件:

  • Router :属于无状态服务,全局的NN接口,转发客户端的请求到子集群的NN中;与NN 心跳检测,管理NN信息到状态存储器,同时可以缓存Mount Table和子集群的状态信息。路由器与状态存储之间的通信将被缓存,用来提升性能。

  • State Store:在逻辑上是集中式,但是物理是分散式的。主要用户数据存储,包含远程挂载表(Mount Table)、子集群的负载和容量信息、路由的信息。 状态存储的后端是可插拔的。 我们利用后端实现的容错能力。 State Store中存储的主要信息及其实现:

    Membership:成员资格信息会对联合集群中的NN进行编码,路由器会定期检测这些子集群的NN并汇报信息。

    Mount Table:此表管理了文件夹/文件与子集群之间的映射。

请添加图片描述

最简单的部署,在NN的服务器上部署Router,一个NN对应一个Router。

1
2
3
4
5
6
7
8
HDFS Client
Router
StateStore
active NN
DataNode

联合层需要满足可扩展性,高可用性,和容错性。

路由器的故障容错

由于路由器是无状态的,那么也就是每个路由器的权重应该是一样的,当其中一个路由器不可用,其他路由器可以接替它继续服务。hdfs客户端在联合集群中配置时,需要将所有的路由器作为连接断点,来实现路由器的HA。

状态存储不可用

如果状态存储不可用,或者路由器连接不到对应的状态存储,则路由器会进入安全模式,将不处理任何请求。对于客户端来说,会把安全模式的路由器当做备用NN,然后尝试连接其他路由器。可以通过以下手动命令控制安全模式的路由器。可以将状态存储存放到ZK上,来保证高可用。

$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -safemode enter | leave | get

NN心跳的高可用

多个路由器会监听同一个NN,并将信息心跳传至状态存储。当路由器发生故障,导致状态存储的NN信息的冲突,会由每一个路由器通过仲裁来决定。投票选主?

不可用的NN

如果路由器无法与子集群的activeNN进行通信,会尝试联系备用NN,若NN都不可用,会报错。

过期的NN

如果NN的心跳检测出现过期,那么监控路由器会将此NN识别为过期状态的NN,在NN恢复心跳检测之前,所有的请求将不会发给过期NN。若NN心跳恢复了合理时间区间,Router会将NN的过期状态变更掉。

常用命令

启动与关闭

$ $HADOOP_PREFIX/bin/hdfs --daemon start dfsrouter
$ $HADOOP_PREFIX/bin/hdfs --daemon stop dfsrouter

远程挂载表操作

# 将目录/tmp 挂载到子集群ns1的 /tmp上
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /tmp ns1 /tmp
# 将目录/data/app1 挂载到子集群ns2的 /data/app1上
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data/app1 ns2 /data/app1
# 将目录/data/app2 挂载到子集群ns3的 /data/app2上
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /data/app2 ns3 /data/app2
# 删除目录/data/app2
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -rm /data/app2
# 查询所有的挂载目录信息
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -ls
# 挂载只读文件夹
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /readonly ns1 / -readonly
# 设置挂载的权限(用户 用户组 权限编码)
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsrouteradmin -add /tmp ns1 /tmp -owner root -group supergroup -mode 0755

常用配置

路由的配置增加在hdfs-site.xml

RPC server

RPC 服务器接收来自客户端的连接。

PropertyDefaultDescription
dfs.federation.router.default.nameserviceId要监视的默认子集群的名称服务标识符。
dfs.federation.router.rpc.enabletrueIf true, 路由器中处理客户端请求的 RPC 服务已启用。
dfs.federation.router.rpc-address0.0.0.0:8888处理所有客户端请求的 RPC 地址。
dfs.federation.router.rpc-bind-host0.0.0.0RPC 服务器将绑定到的实际地址。
dfs.federation.router.handler.count10路由器处理来自客户端的 RPC 请求的服务器线程数。
dfs.federation.router.handler.queue.size100处理 RPC 客户端请求的处理程序数量的队列大小。
dfs.federation.router.reader.count1路由器处理 RPC 客户端请求的reader数量。
dfs.federation.router.reader.queue.size100路由器处理 RPC 客户端请求的读取器数量的队列大小。

Connection to the Namenodes

Router 将客户端请求转发到 NameNode。 它使用连接池来减少创建连接的延迟。

PropertyDefaultDescription
dfs.federation.router.connection.pool-size1从路由器到NN节点的连接池的大小
dfs.federation.router.connection.clean.ms10000检查连接池是否应删除未使用的连接的时间间隔(以毫秒为单位)
dfs.federation.router.connection.pool.clean.ms60000检查连接管理器是否应删除未使用的连接池的时间间隔(以毫秒为单位)。

Admin server

管理挂载表的管理服务器。

PropertyDefaultDescription
dfs.federation.router.admin.enabletrueIf true, 启用了路由器中用于处理客户端请求的 RPC 管理服务。
dfs.federation.router.admin-address0.0.0.0:8111处理管理请求的 RPC 地址。
dfs.federation.router.admin-bind-host0.0.0.0RPC 管理服务器将绑定到的实际地址。
dfs.federation.router.admin.handler.count1路由器处理来自管理员的 RPC 请求的服务器线程数。

HTTP Server

HTTP 服务器为客户端提供 Web UI 和 HDFS REST 接口 (WebHDFS)。 默认 URL 为http://router_host:50071

PropertyDefaultDescription
dfs.federation.router.http.enabletrueIf true, 路由器中处理客户端请求的 HTTP 服务已启用。
dfs.federation.router.http-address0.0.0.0:50071处理对路由器的 Web 请求的 HTTP 地址。
dfs.federation.router.http-bind-host0.0.0.0HTTP 服务器将绑定到的实际地址。
dfs.federation.router.https-address0.0.0.0:50072处理对路由器的 Web 请求的 HTTPS 地址。
dfs.federation.router.https-bind-host0.0.0.0HTTPS 服务器将绑定到的实际地址。

State Store

与状态存储的连接以及路由器的内部缓存。

PropertyDefaultDescription
dfs.federation.router.store.enabletrue如果为true,则路由器连接到状态存储。
dfs.federation.router.store.serializerorg.apache.hadoop.hdfs.server.federation.store.driver.impl.StateStoreSerializerPBImpl用于序列化状态存储记录的类。
dfs.federation.router.store.driver.classorg.apache.hadoop.hdfs.server.federation.store.driver.impl.StateStoreZooKeeperImpl实现状态存储的类
dfs.federation.router.store.connection.test60000检查状态存储连接的频率(以毫秒为单位)。
dfs.federation.router.cache.ttl60000刷新状态存储缓存的频率(以毫秒为单位)。
dfs.federation.router.store.membership.expiration300000成员资格记录的到期时间(以毫秒为单位)。

Routing

将客户端请求转发到正确的子集群。

PropertyDefaultDescription
dfs.federation.router.file.resolver.client.classorg.apache.hadoop.hdfs.server.federation.resolver.MountTableResolver将文件解析到子集群的类。
dfs.federation.router.namenode.resolver.client.classorg.apache.hadoop.hdfs.server.federation.resolver.MembershipNamenodeResolver用于解析子集群的NN节点的类。

Namenode monitoring

监视子集群中的NN节点以转发客户端请求。

PropertyDefaultDescription
dfs.federation.router.heartbeat.enabletrue如果为“true”,则路由器会向状态存储中发送心跳。
dfs.federation.router.heartbeat.interval5000路由器应以毫秒为单位向状态存储发送心跳的频率。
dfs.federation.router.monitor.namenode要监视和检测信号的NN节点的标识符。
dfs.federation.router.monitor.localnamenode.enabletrue如果为“true”,则路由器应监视本地计算机中的NN节点。

注意:如果启用*dfs.federation.router.monitor.localnamenode.enable,建议配置dfs.nameservice.id。 这将允许路由器直接找到本地节点。 否则,它将通过将namenode RPC地址与本地节点地址进行匹配来找到nameservice Id。 如果匹配多个地址,路由器将无法启动。 另外,如果本地节点是HA模式,建议配置dfs.ha.namenode.id*。

版本

HADOOP-V2

版本号主要变化
HDFS 2.9.0基于 HDFS 路由器的联合添加了一个 RPC 路由层,提供多个 HDFS 命名空间的联合视图。 这与现有的 ViewFS 和 HDFS 联合功能类似,只不过挂载表由路由层在服务器端而不是客户端进行管理。 这简化了现有 HDFS 客户端对联合集群的访问。
HDFS 2.9.11.将默认状态存储从本地文件更改为 ZooKeeper。 这将需要配置额外的 zk 地址。
2.挂载表支持ACL,用户将无法修改自己的条目(我们假设这些旧的(之前没有权限)挂载表的所有者:超级用户,组:超级组,权限:755作为默认权限)。 修复方法是以超级用户身份登录来修改这些挂载表条目。
HDFS 2.10.01.将默认状态存储从本地文件更改为 ZooKeeper。 这将需要配置额外的 zk 地址。
2.挂载表支持ACL,用户将无法修改自己的条目(我们假设这些旧的(之前没有权限)挂载表的所有者:超级用户,组:超级组,权限:755作为默认权限)。 修复方法是以超级用户身份登录来修改这些挂载表条目。
3.联合在挂载表级别支持和控制全局配额。
在联合环境中,一个文件夹可以分布在多个子集群中。 路由器聚合从这些子集群查询的配额,并将其用于配额验证。

HADOOP-V3

版本号主要变化
HDFS 3.0.0基于 HDFS 路由器的联合添加了一个 RPC 路由层,提供多个 HDFS 命名空间的联合视图。 这与现有的 ViewFS 和 HDFS 联合功能类似,只不过挂载表由路由层在服务器端而不是客户端进行管理。 这简化了现有 HDFS 客户端对联合集群的访问。
HDFS 3.0.31.将默认状态存储从本地文件更改为 ZooKeeper。 这将需要配置额外的 zk 地址。 2.挂载表支持ACL,用户将无法修改自己的条目(我们假设这些旧的(之前没有权限)挂载表的所有者:超级用户,组:超级组,权限:755作为默认权限)。 修复方法是以超级用户身份登录来修改这些挂载表条目。
HDFS 3.1.01.将默认状态存储从本地文件更改为 ZooKeeper。 这将需要配置额外的 zk 地址。 2.挂载表支持ACL,用户将无法修改自己的条目(我们假设这些旧的(之前没有权限)挂载表的所有者:超级用户,组:超级组,权限:755作为默认权限)。 修复方法是以超级用户身份登录来修改这些挂载表条目。

相关issues

https://issues.apache.org/jira/browse/HDFS-10467

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

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

相关文章

nestJS打印多层对象以及铺平金额类型

console.dir(ret, { depth: 3 }); 金额是Decimal类型不好显示 Logger.verbose(JSON.stringify(ret, null, 2)); 利用JSON.stringify参数格式化 null: 不对数据进行提取&#xff0c; 2&#xff1a;缩进两个空格&#xff0c; 效果是直接帮忙平铺金额对象

java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错

文章目录 一. 问题场景二. 报错原因三. 解决方案 一. 问题场景 使用idea基于springBoot的项目进行单元测试时&#xff0c;出现异常&#xff0c;如下所示&#xff1a; Test ignored.java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to …

【电源专题】案例:电池保护芯片有是否能向0V电池充电的功能的区别

本案例发生在实际的工作之中。案例是这样的,有些产品因为各种原因没有按规范将电池与设备断开,而是插入机器(存在1mA的静态功耗)中并存放在仓库里2年后发现产品无法开机使用,并且电池无法充电。更换新的电池后运行正常,所以认定为是电池的问题。 可是为什么电池无法充电呢…

学妹:怎样才能设计出优秀的测试用例?

这篇文章我们主要聊一下测试工程师最通用的也是最根本的技能&#xff0c;测试用例的设计能力。 测试用例 测试用例是通过使用在测试计划中确定的测试技术&#xff0c;对于已确定的测试条件进行逐步推敲&#xff0c;精炼而设计出来的重点说明如何具体操作产生何种结果的文档。…

(免费分享)基于springboot,vue高校就业系统

管理员&#xff1a;10086/123 学生&#xff1a;10087/123 企业&#xff1a;10070/123 辅导员&#xff1a;10090/123 项目描述 高校就业管理系统 学生 : 个人信息、查看企业岗位信息、简历信息管理、我的应聘 辅导员 : 学生信息管理、三方协议书审核、查看班级就业统计信息 企…

App启动流程分析(一)

一、App启动涉及到的三个进程 1、Launcher进程&#xff1a;负责接收用户点击屏幕的事件&#xff0c;它其实就是一个Activity&#xff0c;屏幕上的各种Icon就是这个Activity中的Button&#xff0c;当点击Icon时&#xff0c;会触发启动App的流程。 2、SystemServer进程&#xff…

新手小白学JAVA_IDEA修改编辑与控制台字体大小

很多小白在刚刚使用IDEA的时候还不是很熟练 本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮助到你 1.改变编辑窗口字体大小 1.1 将字体大小设置为固定值 我们可以将编辑窗口的字体大小设置为固定值 1.2 动态改变字体的大小 我们还可以通过Ctrl鼠标滚轮改变编辑窗口…

微信小程序怎么制作自己的小程序

小程序制作是指通过工具或开发语言制作微信平台上的小型应用程序&#xff0c;具有轻量、易用、无需下载安装等优点。随着移动互联网的飞速发展&#xff0c;小程序已经成为了各种企业和个人展示自己、提供服务的重要手段之一。 小程序制作的好处 小程序可以提高品牌曝光度。在…

SpringBoot + 规则引擎 URule,真的太强悍了!

一、背景 前段时间&#xff0c;在做项目重构的时候&#xff0c;遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决&#xff0c;但是当时也不清楚怎么回事&#xff0c;就想玩点别的。于是乎&#xff0c;就去调研了规则引擎。 当然&#xff0c;市面上有很多…

Springboot 中RESTtemplate的使用

目录 一 概述 二 应用 1.get请求 2.post请求 一 概述 RESTtemplate提供了http请求连接的功能。spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务&#xff0c;它简化了与 http 服务的通信方式&#xff0c;统一了 RESTful 的标准&#xff0c;封装了 http 链接…

行业报告 | 智能教育发展蓝皮书(下)

原创 | 文 BFT机器人 核心观点 Core point 在教育数字化转型的背景下&#xff0c;积极探索智能技术助力教学减负增效的实践路径&#xff0c;对于深化教育教学改革&#xff0c;促进学生全面发展、健康成长具有重要现实意义。 03 智能技术助力教学设计 教学设计以解决实际的教学…

【半监督语义分割 2023 CVPR】CCVC

【半监督语义分割 2023 CVPR】CCVC 论文题目&#xff1a;Conflict-Based Cross-View Consistency for Semi-Supervised Semantic Segmentation 中文题目&#xff1a;半监督语义分割的基于冲突的交叉视图一致性 论文链接&#xff1a;https://arxiv.org/abs/2303.01276 论文代码&…

Visual Basic 6 25 周年

Visual Basic 6.0 是 Visual Basic“经典”的最后一个版本&#xff08;VB.NET 之前的版本&#xff09;。它是迄今为止 32 位 Windows 95/NT 及更高版本最流行的版本。它非常受欢迎&#xff0c;并且仍在许多公司中使用。它于 1998 年中发布&#xff0c;与 5.0 版本相比在多个方面…

mysql-数据迁移

文章目录 1. 物理迁移1. 迁移前&#xff0c;配置mysql的输出目录1. 查看mysql的输出目录2. 修改mysql的输出目录 2. 文件迁移 1. 物理迁移 1. 迁移前&#xff0c;配置mysql的输出目录 1. 查看mysql的输出目录 在安装MySQL的会限制了导入与导出的目录权限。只允许在规定的目录…

基于.net core的微信小程序接入微信支付系列之环境搭建(1)

前言&#xff1a;c#语言本身是一门非常优雅的语言&#xff0c;但是在腾讯的api文档里面并不受到待见&#xff0c;所以只能靠自己看文档来逐步摸索&#xff0c;微信支付的逻辑看起来很复杂&#xff0c;其主要原因在于腾讯写文档的人可能是学体育专业的&#xff0c;简单的逻辑非要…

android Q /R/S/T onTopResumedActivityChanged方法解析

疑问背景&#xff1a; 在Android Q高版本&#xff0c;发现经常通过events日志来看Activity生命周期的时候&#xff0c;经常看到如下打印&#xff1a; 06-27 12:02:07.091 4812 4812 I wm_on_top_resumed_gained_called: [227500858,com.android.launcher3.uioverrides.Quic…

【LeetCode】动态规划 刷题训练(五)

文章目录 剑指 Offer II 091. 粉刷房子题目解析状态转移方程完整代码 309. 最佳买卖股票时机含冷冻期题目解析状态转移方程持有股票保持卖出股票卖出股票冷冻期 完整代码 714. 买卖股票的最佳时机含手续费题目解析状态转移方程f[i]状态转移方程g[i]状态转移方程 完整代码 剑指 …

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

最大收益(搜索好题)

题目描述 给一行n个数&#xff0c;每次可以取出行首或者行末的数&#xff0c;如果数ai是第j次取出的&#xff0c;可以得到ai*j的收益&#xff0c;求最大的总收益&#xff1b; 输入描述 Line 1: 整数 N&#xff08;1<N<2000&#xff09; Lines 2…N1: 第i个数的 a(i)&…

linux文件系统(目录)层次

本文主要内容来源和修改自 FHS 3.0 和 《鸟哥的私房菜基础学习篇&#xff08;第四版&#xff09;》 虽然 Linux 系统的发行版众多&#xff0c;但他们的目录配置却看起来都差不多&#xff0c;那是因为&#xff0c;大多数 Linux 发行版都遵循了文件系统层次结构标准&#xff08;…