news 2026/2/11 21:54:34

大数据领域Hadoop的云部署实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大数据领域Hadoop的云部署实践

从机房到云端:Hadoop集群云部署实战全指南

标题选项(3-5个)

  1. 《告别硬件束缚:Hadoop云集群搭建与高可用实践》
  2. 《大数据工程师必修课:Hadoop云部署全流程详解》
  3. 《从0到1:AWS/阿里云Hadoop集群搭建与性能优化》
  4. 《Hadoop云化之路:手把手教你构建弹性大数据平台》

引言(Introduction)

痛点引入:你还在为本地Hadoop集群头疼吗?

作为大数据工程师,你一定经历过这些场景:

  • 本地机房的服务器突然宕机,导致Hadoop集群停服半天,业务部门催着要数据;
  • 业务增长需要扩容,但采购服务器要走流程,等了半个月才拿到机器;
  • 半夜被运维电话叫醒,排查DataNode磁盘故障——而你正在陪家人过生日;
  • 每月的硬件运维成本高得吓人,却不敢轻易减配,怕影响集群稳定性。

这些问题的根源,在于传统本地部署的Hadoop集群缺乏弹性和高可用性。而云平台的出现,正好解决了这些痛点:弹性扩容只需点击鼠标、高可用由云厂商保障、运维成本按需付费……

但问题来了:如何把Hadoop搬到云上?云环境下的Hadoop配置和本地有什么不同?高可用集群该怎么搭建?

文章内容概述

本文将以AWS(亚马逊云)阿里云为例,手把手教你完成以下目标:

  1. 搭建云环境基础(VPC、安全组、子网);
  2. 规划Hadoop集群节点(Master/Slave/ZooKeeper);
  3. 手动/自动化部署Hadoop集群;
  4. 配置高可用(HA)集群,避免单点故障;
  5. 验证集群可用性,以及常见问题排查;
  6. 云环境下的性能优化与成本控制。

读者收益

读完本文,你将掌握:

  • 云平台上Hadoop集群的完整部署流程;
  • 云环境下Hadoop配置的关键调整点(如网络、存储、高可用);
  • 如何利用云的弹性优势实现集群扩容;
  • 常见云部署踩坑点的解决方法;
  • 从“本地运维”到“云端管理”的思维转变。

准备工作(Prerequisites)

在开始之前,请确保你具备以下基础:

1. 技术栈/知识要求

  • Hadoop基础:熟悉HDFS(分布式文件系统)、YARN(资源调度)的核心架构;
  • Linux基础:会用SSH登录服务器、修改配置文件、执行Shell命令;
  • 云平台基础:了解VPC(虚拟私有云)、EC2/ECS(云服务器)、安全组(防火墙)的概念;
  • ZooKeeper基础:知道它是分布式协调工具,用于Hadoop HA(高可用)。

2. 环境/工具要求

  • 一个云平台账号(AWS/Aliyun均可,本文以AWS为例,阿里云操作类似);
  • SSH客户端(如PuTTY、Terminal);
  • Terraform(可选,用于自动化创建云资源,减少重复操作);
  • JDK 8(Hadoop 3.x推荐使用JDK 8);
  • Hadoop安装包(推荐3.3.4版本,下载地址:Apache Hadoop官网)。

核心内容:手把手实战(Step-by-Step Tutorial)

步骤一:云环境基础搭建(VPC+子网+安全组)

云环境的基础是网络隔离——你需要为Hadoop集群创建一个独立的虚拟网络(VPC),确保数据安全。

1. 做什么?
  • 创建VPC(虚拟私有云):划分一个私有的IP地址空间(如10.0.0.0/16);
  • 创建子网:将VPC拆分为多个子网(如10.0.1.0/24用于Master节点,10.0.2.0/24用于Slave节点);
  • 配置安全组:允许Hadoop集群所需的端口(如SSH、HDFS WebUI、YARN WebUI)。
2. 为什么这么做?
  • VPC隔离了你的集群与公网/其他用户的网络,避免数据泄露;
  • 子网可以按节点角色划分,方便管理流量(如Master节点放在私有子网,Slave节点放在公有子网);
  • 安全组是云平台的“虚拟防火墙”,只开放必要端口,防止恶意访问。
3. 代码示例(Terraform自动化创建)

如果你不想手动点控制台,可以用Terraform一键创建VPC、子网和安全组:

# AWS VPC配置(Terraform) resource "aws_vpc" "hadoop_vpc" { cidr_block = "10.0.0.0/16" # VPC的IP范围 tags = { Name = "Hadoop-VPC" } } # 子网配置(Master节点用) resource "aws_subnet" "master_subnet" { vpc_id = aws_vpc.hadoop_vpc.id cidr_block = "10.0.1.0/24" # Master节点的IP范围 availability_zone = "us-east-1a" # 选择可用区 tags = { Name = "Master-Subnet" } } # 子网配置(Slave节点用) resource "aws_subnet" "slave_subnet" { vpc_id = aws_vpc.hadoop_vpc.id cidr_block = "10.0.2.0/24" # Slave节点的IP范围 availability_zone = "us-east-1b" tags = { Name = "Slave-Subnet" } } # 安全组配置(允许Hadoop所需端口) resource "aws_security_group" "hadoop_sg" { vpc_id = aws_vpc.hadoop_vpc.id name = "Hadoop-SG" description = "允许Hadoop集群的必要端口" # 1. SSH(用于登录服务器) ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] # 允许所有IP登录(生产环境建议限制IP) } # 2. HDFS NameNode WebUI(9870端口) ingress { from_port = 9870 to_port = 9870 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # 3. YARN ResourceManager WebUI(8088端口) ingress { from_port = 8088 to_port = 8088 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # 4. Hadoop内部通信(允许集群内节点互相访问所有端口) ingress { from_port = 0 to_port = 65535 protocol = "tcp" security_groups = [aws_security_group.hadoop_sg.id] } # 5. 允许所有出方向流量(集群访问公网下载依赖) egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "Hadoop-SG" } }

执行terraform apply,等待5分钟左右,云环境基础就搭建好了!

步骤二:节点规划与云服务器创建

接下来,你需要创建Hadoop集群的节点——Master节点(NameNode+ResourceManager)、Slave节点(DataNode+NodeManager)、ZooKeeper节点(用于高可用)。

1. 节点角色与实例类型选择

云服务器的实例类型决定了集群的性能,推荐配置如下:

节点角色职责推荐实例类型(AWS)推荐实例类型(阿里云)
Master(nn1)NameNode(HDFS主节点)c5.xlarge(4vCPU+8GB)ecs.c5.xlarge
Master(nn2)备用NameNode(HA)c5.xlargeecs.c5.xlarge
Slave(dn1-dn3)DataNode(HDFS数据节点)r5.large(2vCPU+16GB)ecs.r5.large
ZooKeeper(zk1-zk3)分布式协调(HA)t3.medium(2vCPU+4GB)ecs.t5.medium

注意

  • Master节点需要更高的CPU和内存(处理元数据和资源调度);
  • Slave节点需要更大的内存和存储(存储数据、运行MapReduce作业);
  • ZooKeeper节点配置无需太高,但建议至少3台(奇数台,保证一致性)。
2. 手动创建云服务器(以AWS EC2为例)
  1. 登录AWS控制台,进入EC2服务;
  2. 点击“启动实例”,选择Ubuntu 20.04镜像(推荐,稳定且生态好);
  3. 选择实例类型(如c5.xlarge),设置实例数量(如2台Master);
  4. 选择之前创建的VPC和子网(Master节点选Master-Subnet);
  5. 配置安全组(选择之前创建的Hadoop-SG);
  6. 生成SSH密钥对(用于登录服务器),下载hadoop-key.pem
  7. 点击“启动实例”,等待实例启动完成。
3. 配置主机名与SSH免密登录

Hadoop集群需要节点之间能互相解析主机名,并通过SSH免密登录(启动集群时需要)。

步骤1:修改主机名
登录Master节点,执行以下命令修改主机名(以master1为例):

sudohostnamectl set-hostname master1echo"127.0.0.1 master1">>/etc/hosts

同理,修改其他节点的主机名(如master2slave1zk1)。

步骤2:配置SSH免密登录
在Master节点生成SSH密钥对:

ssh-keygen -t rsa -P""# 一路回车

将公钥复制到所有节点(包括自己):

ssh-copy-id master1 ssh-copy-id master2 ssh-copy-id slave1 ssh-copy-id zk1

验证免密登录:

sshslave1# 无需输入密码即可登录

步骤三:Hadoop安装与基础配置

现在,我们开始安装Hadoop并配置基础参数。

1. 安装JDK与Hadoop

步骤1:安装JDK 8
登录所有节点,执行以下命令:

sudoaptupdatesudoaptinstallopenjdk-8-jdk -y java -version# 验证安装(显示1.8.x)

步骤2:安装Hadoop
下载Hadoop 3.3.4安装包(以Master节点为例):

wgethttps://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gztar-xzf hadoop-3.3.4.tar.gzsudomvhadoop-3.3.4 /opt/hadoop

设置环境变量(所有节点):

echo"export HADOOP_HOME=/opt/hadoop">>~/.bashrcecho"export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin">>~/.bashrcsource~/.bashrc hadoop version# 验证安装(显示3.3.4)
2. 修改Hadoop配置文件

Hadoop的配置文件位于/opt/hadoop/etc/hadoop/,核心配置文件有4个:core-site.xmlhdfs-site.xmlyarn-site.xmlworkers

(1)core-site.xml(核心配置)
<configuration><!-- 1. 指定HDFS的集群名称(后续HA配置会用到) --><property><name>fs.defaultFS</name><value>hdfs://hadoop-cluster</value></property><!-- 2. Hadoop临时目录(存储临时文件) --><property><name>hadoop.tmp.dir</name><value>/opt/hadoop/tmp</value></property><!-- 3. ZooKeeper集群地址(用于HA) --><property><name>ha.zookeeper.quorum</name><value>zk1:2181,zk2:2181,zk3:2181</value></property></configuration>
(2)hdfs-site.xml(HDFS配置)
<configuration><!-- 1. HDFS集群名称(与core-site.xml一致) --><property><name>dfs.nameservices</name><value>hadoop-cluster</value></property><!-- 2. NameNode节点列表(HA需要2个NameNode) --><property><name>dfs.ha.namenodes.hadoop-cluster</name><value>nn1,nn2</value></property><!-- 3. nn1的RPC地址(Master1节点) --><property><name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name><value>master1:9000</value></property><!-- 4. nn1的WebUI地址(Master1节点) --><property><name>dfs.namenode.http-address.hadoop-cluster.nn1</name><value>master1:9870</value></property><!-- 5. nn2的RPC地址(Master2节点) --><property><name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name><value>master2:9000</value></property><!-- 6. nn2的WebUI地址(Master2节点) --><property><name>dfs.namenode.http-address.hadoop-cluster.nn2</name><value>master2:9870</value></property><!-- 7. JournalNode地址(同步NameNode元数据,需要3台) --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://zk1:8485;zk2:8485;zk3:8485/hadoop-cluster</value></property><!-- 8. JournalNode数据目录 --><property><name>dfs.journalnode.edits.dir</name><value>/opt/hadoop/data/journal</value></property><!-- 9. 副本数(云环境下建议设为2,因为云存储本身有冗余) --><property><name>dfs.replication</name><value>2</value></property></configuration>
(3)yarn-site.xml(YARN配置)
<configuration><!-- 1. 启用YARN高可用 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 2. YARN集群名称 --><property><name>yarn.resourcemanager.cluster-id</name><value>yarn-cluster</value></property><!-- 3. ResourceManager节点列表(HA需要2个) --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 4. rm1的地址(Master1节点) --><property><name>yarn.resourcemanager.hostname.rm1</name><value>master1</value></property><!-- 5. rm2的地址(Master2节点) --><property><name>yarn.resourcemanager.hostname.rm2</name><value>master2</value></property><!-- 6. ZooKeeper地址(与core-site.xml一致) --><property><name>yarn.resourcemanager.zk-address</name><value>zk1:2181,zk2:2181,zk3:2181</value></property><!-- 7. NodeManager资源配置(根据实例类型调整) --><property><name>yarn.nodemanager.resource.cpu-vcores</name><value>2</value><!-- 对应Slave节点的vCPU数量(如r5.large有2vCPU) --></property><property><name>yarn.nodemanager.resource.memory-mb</name><value>12288</value><!-- 对应Slave节点的内存(如r5.large有16GB,留4GB给系统) --></property><!-- 8. 启用NodeManager的Shuffle服务(MapReduce需要) --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property></configuration>
(4)workers(Slave节点列表)

将Slave节点的主机名写入workers文件:

slave1 slave2 slave3
3. 同步配置文件到所有节点

将Master节点的配置文件同步到其他节点(避免重复修改):

scp/opt/hadoop/etc/hadoop/* master2:/opt/hadoop/etc/hadoop/scp/opt/hadoop/etc/hadoop/* slave1:/opt/hadoop/etc/hadoop/scp/opt/hadoop/etc/hadoop/* zk1:/opt/hadoop/etc/hadoop/

步骤四:配置高可用(HA)集群

Hadoop的单点故障(如NameNode宕机)会导致整个集群不可用,因此高可用(HA)是云部署的必备配置

1. 启动ZooKeeper集群

首先,需要启动ZooKeeper集群(用于协调NameNode的故障转移)。

步骤1:安装ZooKeeper
在所有ZooKeeper节点执行以下命令:

wgethttps://dlcdn.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gztar-xzf apache-zookeeper-3.8.0-bin.tar.gzsudomvapache-zookeeper-3.8.0-bin /opt/zookeeper

步骤2:配置ZooKeeper
修改/opt/zookeeper/conf/zoo.cfg(所有ZooKeeper节点):

tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/data clientPort=2181 # 配置ZooKeeper集群节点(server.1对应zk1,server.2对应zk2,以此类推) server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888

步骤3:设置myid
在每个ZooKeeper节点的/opt/zookeeper/data目录下创建myid文件,内容为节点编号(如zk1的myid是1,zk2是2):

sudomkdir/opt/zookeeper/dataecho"1">/opt/zookeeper/data/myid# zk1节点

步骤4:启动ZooKeeper
在所有ZooKeeper节点执行:

/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/bin/zkServer.sh status# 验证状态(显示Leader/Follower)
2. 初始化HDFS HA

步骤1:启动JournalNode
在所有ZooKeeper节点(JournalNode与ZooKeeper节点复用)执行:

hdfs --daemon start journalnode

步骤2:格式化NameNode
master1节点执行(格式化nn1):

hdfs namenode -format

步骤3:启动nn1并同步元数据到nn2
启动nn1:

hdfs --daemon start namenode

master2节点同步元数据(nn2作为备用节点):

hdfs namenode -bootstrapStandby

步骤4:初始化ZooKeeper故障转移
master1节点执行:

hdfs zkfc -formatZK
3. 启动Hadoop集群

现在,启动整个Hadoop集群:

步骤1:启动HDFS
master1节点执行:

start-dfs.sh

步骤2:启动YARN
master1节点执行:

start-yarn.sh

步骤3:验证集群状态

  • 查看HDFS状态:访问http://master1:9870(nn1的WebUI),或http://master2:9870(nn2的WebUI);
  • 查看YARN状态:访问http://master1:8088(rm1的WebUI);
  • 查看DataNode数量:执行hdfs dfsadmin -report,确认Slave节点都已加入;
  • 查看NameNode状态:执行hdfs haadmin -getAllServiceState,显示nn1: active, nn2: standby(说明HA生效)。

步骤五:动态扩容与故障测试

云部署的核心优势是弹性——当业务增长需要更多资源时,可以快速添加Slave节点。

1. 动态添加Slave节点

步骤1:创建新的Slave节点
在AWS控制台启动一个新的EC2实例(实例类型r5.large,加入Slave-SubnetHadoop-SG)。

步骤2:配置新节点

  • 安装JDK和Hadoop(同步骤三);
  • 同步Master节点的配置文件(同步骤三);
  • 修改/opt/hadoop/etc/hadoop/workers文件,添加新节点的主机名;
  • 启动DataNode和NodeManager:
    hdfs --daemon start datanodeyarn--daemon start nodemanager

步骤3:验证扩容
执行hdfs dfsadmin -report,确认新节点已加入HDFS集群;
执行yarn node -list,确认新节点已加入YARN集群。

2. 故障测试(验证HA)

步骤1:模拟nn1宕机
master1节点执行:

hdfs --daemon stop namenode

步骤2:查看nn2状态
执行hdfs haadmin -getAllServiceState,显示nn1: stopped, nn2: active(说明nn2自动接管了服务);
访问http://master2:9870,确认HDFS仍可正常访问。

步骤六:云环境下的性能优化

云环境下的Hadoop性能优化,重点在存储网络资源调度三个方面。

1. 存储优化:选择合适的云盘

HDFS的性能取决于存储的IO能力,云盘的选择建议:

  • Master节点:用通用型SSD(如AWS gp3、阿里云ESSD PL0),用于存储NameNode元数据;
  • Slave节点:用高IO型SSD(如AWS io2、阿里云ESSD PL1),用于存储DataNode数据;
  • 冷数据:将不常用的数据迁移到对象存储(如AWS S3、阿里云OSS),降低成本(Hadoop 3.x支持直接访问S3/OSS)。
2. 网络优化:开启增强型网卡

Hadoop的Shuffle过程需要大量网络带宽,建议为云服务器开启增强型网卡(如AWS的Elastic Network Adapter,ENA;阿里云的增强型网卡),提升网络吞吐量。

3. 资源调度优化:调整YARN参数

根据Slave节点的配置,调整YARN的资源参数:

  • yarn.nodemanager.resource.cpu-vcores:等于Slave节点的vCPU数量;
  • yarn.nodemanager.resource.memory-mb:等于Slave节点的内存(减去1-2GB系统预留);
  • yarn.scheduler.minimum-allocation-mb:容器最小内存(建议512MB);
  • yarn.scheduler.maximum-allocation-mb:容器最大内存(建议不超过节点内存的80%)。

进阶探讨(Advanced Topics)

1. 选择Managed Hadoop服务(如AWS EMR、阿里云E-MapReduce)

如果你不想手动部署和运维Hadoop,可以选择云厂商的托管Hadoop服务

  • AWS EMR:支持Hadoop、Spark、Hive等,自动管理集群的扩容、故障恢复;
  • 阿里云E-MapReduce:兼容开源Hadoop生态,提供可视化控制台和监控。

优势:省去手动部署的麻烦,专注于业务逻辑;
劣势:灵活性稍低,成本略高。

2. 成本优化:用Spot实例降低成本

Spot实例是云厂商的“闲置资源”,价格比On-Demand实例低70%-90%,适合用于Slave节点(容错性高)。

使用方法(AWS):

  • 在启动EC2实例时,选择“Spot实例”;
  • 设置最大出价(建议低于On-Demand价格的50%);
  • 配置自动伸缩组(Auto Scaling Group),当Spot实例被收回时,自动启动新的实例。

3. 监控与告警:用云监控工具保障集群稳定

云平台提供了完善的监控工具,建议配置以下指标:

  • HDFS:可用空间、DataNode数量、NameNode状态;
  • YARN:队列使用率、Container数量、作业失败率;
  • 云服务器:CPU使用率、内存使用率、磁盘IO。

示例(AWS CloudWatch):

  • 创建告警:当HDFS可用空间低于20%时,发送邮件通知;
  • 创建仪表盘:可视化展示集群的关键指标。

总结(Conclusion)

回顾要点

本文从云环境搭建节点规划Hadoop安装配置高可用集群搭建弹性扩容性能优化,完整覆盖了Hadoop云部署的全流程。

核心知识点:

  • 云环境的基础是VPC和安全组,确保网络隔离;
  • 高可用集群需要ZooKeeper协调NameNode和ResourceManager的故障转移;
  • 云的弹性优势体现在动态扩容和Spot实例成本控制;
  • 性能优化的重点是存储、网络和资源调度。

成果展示

通过本文的实践,你已经搭建了一个高可用、弹性、低成本的Hadoop云集群,可以:

  • 存储和处理TB级别的数据;
  • 运行MapReduce、Spark等大数据作业;
  • 应对节点故障(自动故障转移);
  • 快速扩容以满足业务增长需求。

鼓励与展望

Hadoop云部署只是大数据云化的第一步,未来你可以尝试:

  • 用Spark替代MapReduce,提升计算性能;
  • 用Hive/Impala做数据仓库;
  • 用Flink做实时计算。

记住:云不是目的,而是工具——它让你从繁琐的硬件运维中解放出来,专注于数据价值的挖掘。

行动号召(Call to Action)

如果你在实践中遇到问题(比如节点无法通信、HA配置失败),欢迎在评论区留言讨论!
如果你成功搭建了Hadoop云集群,也欢迎分享你的经验(比如用了哪些优化技巧、踩了哪些坑)!

最后,觉得本文有用的话,记得点赞、收藏、转发——你的支持是我持续分享的动力!

下一篇预告:《Spark云部署实战:从本地开发到云端生产》,敬请期待!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 1:56:43

数据结构2.0 线性表

一、线性表的定义和基本操作①线性表的定义②线性表的基本操作③小结二、顺序表的定义①顺序表的定义②顺序表的实现——静态分配例&#xff1a;③顺序表的实现——动态分配例&#xff1a;④小结三、顺序表的插入删除①顺序表插入②顺序表插入的健壮性③顺序表插入的时间复杂度…

作者头像 李华
网站建设 2026/2/11 11:46:56

ARM架构中APSR状态寄存器里的Q位

ARM架构中APSR状态寄存器里的Q位 1. 什么是APSR&#xff1f; APSR&#xff08;Application Program Status Register&#xff0c;应用程序状态寄存器&#xff09;是ARM Cortex-M和部分其他ARM处理器中程序状态寄存器&#xff08;PSR&#xff09;的一部分。它包含了程序执行后的…

作者头像 李华
网站建设 2026/2/8 22:55:57

AI应用架构师的认知升级:接受AI的“不完美”,拥抱人机协作的灰度

AI应用架构师的认知升级&#xff1a;从“追求完美AI”到“设计灰度协作” 副标题&#xff1a;如何在不完美的AI中构建可靠的人机协同系统 摘要/引言&#xff1a;从“完美AI”的幻想到现实的耳光 两年前&#xff0c;我参与了一个互联网公司的AI客服系统研发项目。产品经理拍着桌…

作者头像 李华
网站建设 2026/2/8 18:26:51

巴菲特的品牌价值理论:无形资产的重要性

巴菲特的品牌价值理论:无形资产的重要性 关键词:巴菲特、品牌价值理论、无形资产、企业竞争力、投资策略 摘要:本文深入探讨了巴菲特的品牌价值理论,着重阐述无形资产在企业运营和投资领域的重要性。首先介绍了研究此理论的背景,包括目的、预期读者、文档结构和相关术语。…

作者头像 李华
网站建设 2026/2/11 15:53:27

2026最新网络安全学习路线(完整版)

前言 如何成为一名黑客&#xff0c;很多朋友在学习安全方面都会半路转行&#xff0c;因为不知如何去学&#xff0c;今天在知乎看到个不错的&#xff0c;果断收藏学习下路线。此篇博客讲的非常细&#xff0c;有兴趣的同学可以参考&#xff08;片尾有整理好的学习路线图哦~&…

作者头像 李华