基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群

在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点,集群不具有高可用性。

HDFS 高可用架构

在这里插入图片描述
HDFS 高可用架构主要组件:

Active NameNode 和 Standby NameNode: 两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

Zookeeper 集群:为主备切换控制器提供主备选举支持。

共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。

DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。

基于 QJM 的共享存储系统的数据同步机制

在这里插入图片描述

Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。

需要说明的是向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以你至少要有 3 个 JournalNode 节点,当然你也可以继续增加节点数量,但是应该保证节点总数是奇数。同时如果有 2N+1 台 JournalNode,那么根据过半写的原则,最多可以容忍有 N JournalNode 节点挂掉。

NameNode 主备切换

NameNode 实现主备切换的流程下图所示:
在这里插入图片描述

  1. HealthMonitor 初始化完成之后会启动内部的线程来定时调用对应 NameNodeHAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。

  2. HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。

  3. 如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。

  4. ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。

  5. ActiveStandbyElector 在主备选举完成后,会回调ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。

  6. ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。

YARN高可用

YARN ResourceManager 的高可用与 HDFS NameNode 的高可用类似,但是 ResourceManager 不像 NameNode ,没有那么多的元数据信息需要维护,所以它的状态信息可以直接写到 Zookeeper 上,并依赖 Zookeeper 来进行主备选举。
在这里插入图片描述

高可用集群搭建

集群准备

按照高可用的设计目标:需要保证至少有两个 NameNode (一主一备)两个 ResourceManager (一主一备) ,同时为满足“过半写入则成功”的原则,需要至少要有 3 个 JournalNode 节点。这里使用三台
主机进行搭建。

所有服务器都安装有 JDK,linux JDK安装

搭建好 ZooKeeper 集群(hadoop版本为3.3.6建议zookeeper版本3.6.3), ZooKeeper3.6.3 集群搭建

1、关闭网络防火墙

# 查看网络防火墙状态
sudo systemctl status firewalld
# 立即停止 firewalld
sudo systemctl stop firewalld
# 防止重启后再次启动,可以禁用防火墙服务
sudo systemctl disable firewalld

2、配置三台机器的节点映射

设置IP映射,在/etc/hosts添加如下内容(每个节点都需修改,)

sudo vi /etc/hosts
192.168.10.100 hadoop100 hadoop100.centos.com 
192.168.10.101 hadoop101 hadoop101.centos.com
192.168.10.102 hadoop102 hadoop102.centos.com

编译生效

source /etc/profile

一、安装java 1.8JDK

java 1.8JDK安装
(每个节点都需要安装,安装的版本和目录保持一致)

二、配置节点间免密登录

1 生成密匙

在每台主机上使用 ssh-keygen 命令生成公钥私钥对:

ssh-keygen

连按三次
在这里插入图片描述

2 免密登录

将 hadoop001 的公钥写到本机和远程机器的 ~/ .ssh/authorized_key 文件中:

ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop100 依次输入yes,root用户的密码
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop101
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop102

3 验证免密登录

依次输入,可成功跳转后exit回到hadoop100

ssh hadoop100
exit;
ssh hadoop101
exit;
ssh hadoop102
exit;

4、报错处理

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

修改SSH 配置允许公钥认证


vi /etc/ssh/sshd_config
#将PasswordAuthentication设置成为yes(一般在文件的末尾几行):
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes#vi中使用查找功能快速定位
#进入普通模式(如果您已经在插入模式中),按 Esc 键。
#输入 / 后跟您想要搜索的词或短语。
#按 Enter 键进行搜索。
#n 键:移动到下一个匹配项。
#N 键:移动到上一个匹配项。
#例如,要搜索单词 "PermitRootLogin ",您将输入:/PermitRootLogin #修改完成后重启ssh服务
systemctl restart sshd.service
# 查看ssh服务状态
sudo systemctl status sshd

三、 Hadoop安装

1、下载hadoop

hadoop3.3.6官方下载

2、解压缩hadoop-3.3.6.tar.gz 文件

tar -zxvf /opt/soft/hadoop-3.3.6.tar.gz -C /opt/app-z:使用 gzip 解压缩算法。这是用来解压 .gz 结尾的文件的
-x:提取归档文件的内容
-f:指定要处理的归档文件的名称,后面跟着文件名 hadoop-3.3.6.tar.gz
-C:指定解压后的文件应放置在哪个目录下。在这里,目录是 /opt/app

解压后即可,看到/opt/app/hadoop-3.3.6文件夹

3、配置Hadoop环境变量

vim /etc/profile.d/my_env.sh配置JAVA和Hadoop环境变量(每台机器都需要配置

vim /etc/profile.d/my_env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
export HADOOP_HOME=/opt/app/hadoop-3.3.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

修改后执行【source /etc/profile】命令使其生效

4、配置Hadoop的配置文件

# 进入修改目录
cd /opt/app/hadoop-3.3.6/etc/hadoop/

** (1)、修改 hadoop-env.sh**

export JAVA_HOME=/usr/java/jdk1.8.0_431

** (2)、修改配置文件yarn-env.sh 在文件末尾加上**

export JAVA_HOME=/usr/java/jdk1.8.0_431

(3) 修改配置文件 workers
指定dataNode工作节点。

#删除原有 localhost,添加如下内容
#【不能有空格和空行】
hadoop100
hadoop101
hadoop102

注: 修改下面文件中存在,配置放入其中,且只保留一组的

(4) 修改配置文件core-site.xml

<configuration>
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --><property><name>fs.defaultFS</name>  <value>hdfs://hadoop100:8020</value>  </property>  
<!-- 指定Hadoop的临时文件的本地存放路径 --><property><name>hadoop.tmp.dir</name><value>/var/log/hadoop/tmp</value></property><property><!-- ZooKeeper 集群的地址 --><name>ha.zookeeper.quorum</name><value>hadoop101:2181,hadoop101:2182,hadoop101:2183</value></property><property><!-- ZKFC 连接到 ZooKeeper 超时时长 --><name>ha.zookeeper.session-timeout.ms</name><value>10000</value></property><!-- 设置HDFS web UI用户身份 --><property><name>hadoop.http.staticuser.user</name><value>root</value></property>
<!-- 配置该root(superUser)允许通过代理访问的主机节点 --><property><name>hadoop.proxyuser.root.hosts</name><value>*</value></property>
<!-- 配置该root(superUser)允许通过代理用户所属组 --><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>
<!-- 配置该root(superUser)允许通过代理的用户--><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>
</configuration>

(5) 修改配置文件hdfs-site.xml

<configuration>
<!-- 指定HDFS的数据分块的备份数量 --><property><name>dfs.replication</name><value>3</value></property><!-- 指定HDFS的主节点的元数据文件的本地存放路径 --><property><name>dfs.namenode.name.dir</name><value>/opt/app/hadoop-3.3.6/name</value></property>
<!-- 指定HDFS的数据节点的数据文件的本地存放路径 --><property><name>dfs.datanode.data.dir</name><value>/opt/app/hadoop-3.3.6/data</value></property>
<property><!-- 集群服务的逻辑名称 --><name>dfs.nameservices</name><value>mycluster</value></property><property><!-- NameNode ID 列表--><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><property><!-- nn1 的 RPC 通信地址 --><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop100:8020</value></property><property><!-- nn2 的 RPC 通信地址 --><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop101:8020</value></property><property><!-- nn1 的 http 通信地址 --><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop100:50070</value></property><property><!-- nn2 的 http 通信地址 --><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop101:50070</value></property><property><!-- NameNode 元数据在 JournalNode 上的共享存储目录 --><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value></property><property><!-- Journal Edit Files 的存储目录 --><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/journalnode/data</value></property><property><!-- 配置隔离机制,确保在任何给定时间只有一个 NameNode 处于活动状态 --><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><!-- 使用 sshfence 机制时需要 ssh 免密登录 --><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><property><!-- SSH 超时时间 --><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property><property><!-- 访问代理类,用于确定当前处于 Active 状态的 NameNode --><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><!-- 开启故障自动转移 --><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
</configuration>

(6) 修改配置文件yarn-site.xml

<configuration><property><!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 
Yarn 上运行 MapReduce 程序。--><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><!-- 是否启用日志聚合 (可选) --><name>yarn.log-aggregation-enable</name><value>true</value></property><property><!-- 聚合日志的保存时间 (可选) --><name>yarn.log-aggregation.retain-seconds</name><value>86400</value></property><property><!-- 启用 RM HA --><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property><!-- RM 集群标识 --><name>yarn.resourcemanager.cluster-id</name><value>my-yarn-cluster</value></property><property><!-- RM 的逻辑 ID 列表 --><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property><!-- RM1 的服务地址 --><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop100</value></property><property><!-- RM2 的服务地址 --><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop101</value></property><property><!-- RM1 Web 应用程序的地址 --><name>yarn.resourcemanager.webapp.address.rm1</name><value>hadoop100:8088</value></property><property><!-- RM2 Web 应用程序的地址 --><name>yarn.resourcemanager.webapp.address.rm2</name><value>hadoop101:8088</value></property><property><!-- ZooKeeper 集群的地址 --><name>yarn.resourcemanager.zk-address</name><value>hadoop101:2181,hadoop101:2182,hadoop101:2183</value></property><property><!-- 启用自动恢复 --><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><property><!-- 用于进行持久化存储的类 --><name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><property><name>yarn.resourcemanager.zk-state-store.parent-path</name><value>/rmstore</value>
</property>
</configuration>

(7) 修改配置文件mapred-site.xml

<configuration>
<!-- 指定MapReduce所使用的外部管理框架,这里使用Hadoop 3.3.6自带的YARN资源管理器 --><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration>

5、修改hadoop启动命令

# 进入到启动命令所在位置hadoop安装路径下的sbin目录下
cd /opt/app/hadoop-3.3.6/sbin

修改start-dfs.sh,stop-dfs.sh,在文件顶部添加

HDFS_ZKFC_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=root
#HADOOP_SECURE_DN_USER=root

修改 start-yarn.sh,stop-yarn.sh,在文件顶部添加

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

6 、分发程序

拷贝 Hadoop 安装文件到集群节点

scp -qr /opt/app/hadoop-3.3.6 hadoop101:/opt/app
scp -r /opt/app/hadoop-3.3.6 hadoop102:/opt/app

7、 初始化

1 启动ZooKeeper
分别到服务器上启动 ZooKeeper 服务:

zkServer.sh start

在这里插入图片描述

2 启动Journalnode
分别到三台服务器的的 ${HADOOP_HOME}/sbin 目录下,启动 journalnode 进程:

hadoop-daemon.sh start journalnode

3 初始化NameNode

在 hadop100 上执行 NameNode 初始化命令:

hdfs namenode -format

执行初始化命令后,需要将 NameNode 元数据目录的内容,复制到其他未格式化的 NameNode 上。
元数据存储目录就是我们在 hdfs-site.xml 中使用 dfs.namenode.name.dir 属性指定的目录。这里我们需要将其复制到 hadoop101 上:

scp -r /opt/app/hadoop-3.3.6/name hadoop101:/opt/app/hadoop-3.3.6/

4 初始化HA状态
在任意一台 NameNode 上使用以下命令来初始化 ZooKeeper 中的 HA 状态:

hdfs zkfc -formatZK

5 启动HDFS
进入到 hadoop100 的 ${HADOOP_HOME}/sbin 目录下,启动 HDFS。此时 hadoop100 和 hadoop101 上的 NameNode 服务,和三台服务器上的 DataNode 服务都会被启动:

start-dfs.sh

6 启动YARN
进入到 hadoop100 的 ${HADOOP_HOME}/sbin 目录下,启动 YARN。此时 hadoop101 上的 ResourceManager 服务,和两台服务器上的 NodeManager 服务都会被启动:

start-yarn.sh

启动报错
查看日志
进入 /opt/app/hadoop-3.3.6/logs 目录,查看对应组件的启动日志
在这里插入图片描述

8、查看集群

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到每台机器上启动的应用和我们的配置文件地址是对应的

查看Web UI

webui地址 (http://hadoop100:50070/)

在这里插入图片描述
在这里插入图片描述
yarn地址 http://hadoop101:8088/
在这里插入图片描述

集群的二次启动
集群初次启动涉及到一些必要初始化操作,所以过程略显繁琐。但是集群一旦搭建好后,想要再次启用它是比较方便的,步骤如下(首选需要确保 ZooKeeper 集群已经启动):

先停止服务

stop-dfs.sh
stop-yarn.sh

使用jps查看,确保服务全部关闭

在 hadoop100 启动 HDFS,此时会启动所有与 HDFS 高可用相关的服务,包括 NameNode,DataNode 和 JournalNode

start-dfs.sh

然后再启动 YARN

start-yarn.sh

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

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

相关文章

机器学习—学习过程

给定训练集构建决策树的过程有几个步骤。 给出了一组由十个猫和狗的例子组成的训练集&#xff0c;决策树学习的第一步是我们必须决定在根节点使用什么特性&#xff0c;这是决策树顶部的第一个节点&#xff0c;通过一个算法&#xff0c;假设我们决定选择根节点中的特性&#xf…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个n行m列的矩阵A&#xff0c;输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵A的行数和列数。…

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…

JDK17 下载与安装

下载安装包 针对不同的操作系统, 需要下载对应版本的 JDK. 如果电脑是 Windows32 位的, 建议重装系统, 重装成 64 位的操作系统. 因为 Java 从 9 版本开始, 就已经不提供 32 位版本的安装包了. 官网下载 官网下载链接 需要登录 Oracle 账号才能下载. 账号: 2872336204qq.c…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 &#xff0c;学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库&#xff0c;常见的内置库&#xff08;random、hashlib、json、时间、os&#xff09; 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Day28 买卖股票的最佳时机 跳跃游戏 跳跃游戏 II K 次取反后最大化的数组和

贪心算法 part02 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 求最大利润 将每天的正利润加和 public int maxProfit(int[] prices) {int totalPrices 0;for(int i0;i<prices.length;i){if(i<prices.length-1&&prices[i1]>prices[…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

『数据结构』空间复杂度

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

多模态COGMEN详解

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…

重生之我在异世界学编程之C语言:操作符篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文1. 算术操作符2. 关系&#xff0…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器&#xff0c;由各自的可编程预分频器驱动。 这2个定时器是互相独立的&#xff0c;不共享任何资源。 这个2个基本定时器只能向上计数&#xff0c;由于没有外部IO&#xff0c;所以只能计时&#xff0c;不能对外部…

OpenVas安装步骤及报错问题

安装步骤 1、更新系统 apt update && apt upgrade && apt dist-upgrade 2、安装openvas apt-get install openvas 3、初始化 gvm-setup 时间要很久 4、检查安装结果 gvm-check-setup 安装成功 5、设置用户名和密码&#xff0c;都为admin sudo runuse…

深度学习之pth转换为onnx时修改模型定义‌

文章目录 概述实现步骤python代码 概述 在将PyTorch模型&#xff08;.pth文件&#xff09;转换为ONNX格式时&#xff0c;通常的转换过程是通过torch.onnx.export函数来实现的。这个过程主要是将PyTorch模型的计算图导出为ONNX格式&#xff0c;以便在其他框架或环境中使用。 在…

STL算法之sort

STL所提供的各式各样算法中&#xff0c;sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器)&#xff0c;然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator<作为排序标准。STL的所有…

解决Tomcat运行时错误:“Address localhost:1099 is already in use”

目录 背景: 过程&#xff1a; 报错的原因&#xff1a; 解决的方法&#xff1a; 总结&#xff1a; 直接结束Java.exe进程&#xff1a; 使用neststat -aon | findstr 1099 命令&#xff1a; 选择建议&#xff1a; 背景: 准备运行Tomcat服务器调试项目时&#xff0c;程序下…

AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报

一、XMLHttpRequest基本使用 XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…

矩阵加法        ‌‍‎‏

矩阵加法 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入两个n行m列的矩阵A和B&#xff0c;输出它们的和AB。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵的行数和列数。1 <…

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc&#xff1a; 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本&#xff1a;3.2.0 flink版本&…