在3节点 和 5节点上部署 yarn-2.7 的流程
Creato il: 22 dicembre 2025
Creato il: 22 dicembre 2025
在3节点 和 5节点上部署 yarn-2.7 的流程
下面给你一份**在 3 节点 / 5 节点(本质是 N 节点)**上部署 **Yarn 2.7(Berry)**的可复用流程。默认你是 Linux 服务器集群(同一业务用户、节点之间可 SSH),并且目标是让所有节点跑同一套 Yarn 2.7 行为一致。
把 Yarn 2.7 放进项目仓库:所有节点只要拿到代码,就自动用同一版本 Yarn(不会被全局 yarn/corepack 版本影响)。
优点:一致性最好、回滚简单、对多节点最省心
缺点:仓库会多一些 Yarn 文件
在每台机器全局装 [email protected]。多节点容易出现 PATH、用户环境、node 版本不一致导致“有的节点能跑、有的不能”。
bashnode -v npm -v
appuser),避免权限问题。适用于 3 节点和 5 节点:只是节点列表不同,步骤一样。
进入你的项目根目录:
bashcd /path/to/your-project
如果你没有 corepack,也可以用 npm 临时装一个 yarn classic 来生成 berry(任选其一):
方式 1(有 corepack 时):
bashcorepack enable yarn set version 2.7.0
方式 2(没有 corepack 时):
bashnpm i -g yarn yarn set version 2.7.0
成功后项目里会出现类似:
.yarn/releases/yarn-2.7.0.cjs.yarnrc.yml(里面会有 yarnPath: .yarn/releases/...)验证:
bashyarn -v # 应输出 2.7.0
在项目根目录检查/补充 .yarnrc.yml(示例):
yamlyarnPath: .yarn/releases/yarn-2.7.0.cjs nodeLinker: node-modules # 如果你不想用 PnP(很多服务端项目更省事) # 或者用默认 pnp 也行,但要确保运行时、工具链兼容
说明:
nodeLinker: node-modules 会生成传统的 node_modules,对旧工具兼容更好。.pnp.cjs),就不要改,保持现状即可。至少要带上:
.yarn/releases/yarn-2.7.0.cjs.yarnrc.yml如果你们想加速、减少外网依赖,建议启用离线缓存(可选):
bashyarn config set enableGlobalCache false yarn config set cacheFolder .yarn/cache
然后首次安装生成缓存:
bashyarn install
把 .yarn/cache 也一并分发到各节点(非常适合多节点)。
假设节点:
node1 node2 node3node1 node2 node3 node4 node5你可以用 rsync(示例,把项目目录同步到相同路径):
bashNODES="node1 node2 node3" # 或改成 5 个节点 for h in $NODES; do rsync -az --delete /path/to/your-project/ $h:/path/to/your-project/ done
如果你们用 GitOps/CI 发布:确保发布包里包含
.yarn/和.yarnrc.yml即可。
在每个节点项目目录执行:
bashcd /path/to/your-project yarn -v
并做一次安装校验(首次部署建议做):
bashyarn install --immutable 2>/dev/null || yarn install
yarn 全局命令版本:项目内的 yarnPath 会强制使用 .yarn/releases/...。.yarn/cache 或 node_modules 是共享盘,确保同用户/同组可写。Yarn 2.x 本身更推荐项目内固定版本。全局装往往是为了方便,但风险更大。
在每个节点:
bashnpm uninstall -g yarn || true corepack enable || true corepack prepare [email protected] --activate yarn -v
注意:corepack 依赖 Node 版本(Node 16+ 常见自带),不同节点 Node 版本不同会翻车。
你可以按这个 checklist 走:
.yarnrc.yml 且 yarnPath 指向 yarn-2.7.0.cjs.yarn/releases/yarn-2.7.0.cjs 已分发到所有节点.yarn/cache 也分发,提升安装速度、降低外网依赖yarn -v 输出 2.7.0yarn install 可成功(或 --immutable 通过)如果你告诉我你们是:
我可以把上面的流程改成更贴合你们环境的“一键脚本/Ansible Playbook 版本”。
我说的是 大数据计算分配资源的 yarn
明白了 👍
你说的是 Hadoop 生态里的资源管理框架 YARN(Yet Another Resource Negotiator)2.7.x,不是前端的 Yarn。下面我按3 节点 / 5 节点集群给你一份标准、可落地的大数据 YARN 2.7 部署流程(偏生产思路)。
YARN 本身不单独部署,它是 Hadoop 2.7.x 的核心组件之一。
| 角色 | 进程 | 说明 |
|---|---|---|
| ResourceManager (RM) | ResourceManager | 集群资源调度中心 |
| NodeManager (NM) | NodeManager | 每个计算节点的资源管理 |
| JobHistoryServer | MapReduce JobHistoryServer | 可选,查看历史任务 |
| ZK(可选) | ZooKeeper | RM 高可用 |
textnode1: ResourceManager + NameNode + NodeManager node2: NodeManager + DataNode node3: NodeManager + DataNode
textnode1: ResourceManager + NameNode node2: Standby ResourceManager + Standby NameNode node3: NodeManager + DataNode node4: NodeManager + DataNode node5: NodeManager + DataNode
说明
bash# 所有节点 useradd hadoop passwd hadoop
bash# 在 node1 ssh-keygen ssh-copy-id node1 ssh-copy-id node2 ssh-copy-id node3 # 5 节点则复制到 node4 node5
bashjava -version # Hadoop 2.7 推荐 JDK 8
bashtar -zxvf hadoop-2.7.x.tar.gz -C /opt ln -s /opt/hadoop-2.7.x /opt/hadoop chown -R hadoop:hadoop /opt/hadoop*
bashexport HADOOP_HOME=/opt/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME=/usr/java/jdk1.8
bashvim $HADOOP_HOME/etc/hadoop/slaves
textnode1 node2 node3
textnode3 node4 node5
注意:这里写的是 NodeManager 节点
xml<configuration> <!-- ResourceManager 地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <!-- NM 启用 aux-service --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 每个 NM 可用内存(MB) --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>32768</value> </property> <!-- 每个 NM 可用 CPU --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>16</value> </property> <!-- 单个 container 最大内存 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> </property> <!-- 单个 container 最大 vcore --> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>4</value> </property> </configuration>
xml<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> </configuration>
xml<property> <name>yarn.scheduler.capacity.root.queues</name> <value>default</value> </property> <property> <name>yarn.scheduler.capacity.root.default.capacity</name> <value>100</value> </property> <property> <name>yarn.scheduler.capacity.root.default.maximum-capacity</name> <value>100</value> </property>
bashstart-dfs.sh
bashstart-yarn.sh
bashmr-jobhistory-daemon.sh start historyserver
bashjps
textResourceManager
textNodeManager
| 服务 | 地址 |
|---|---|
| YARN | http://node1:8088 |
| JobHistory | http://node1:19888 |
| 项目 | 3 节点 | 5 节点 |
|---|---|---|
| RM | 1 个 | 1 主 1 备 |
| NM | 3 个 | 3 个 |
| 可用资源 | 较少 | 更高 |
| 容错 | 低 | 中等 |
| 推荐用途 | 测试 | 生产 |
1️⃣ 内存与 CPU 一定要按物理机器配置
2️⃣ 不要把 RM 和重计算任务放同一台(5 节点以上)
3️⃣ 生产建议开启 YARN HA + ZooKeeper
4️⃣ 容器内存溢出(OOM)90% 都是:
yarn.nodemanager.resource.memory-mbmapreduce.map.memory.mbmapreduce.reduce.memory.mb
没配好如果你愿意,我可以进一步帮你:
你可以直接告诉我:
👉 是测试环境还是生产环境?机器的 CPU / 内存规格是多少?
jdk
jdk1.8.0_381
hadoop
hadoop-3.1.1
zk
hive
apache-hive-3.1.0-bin
spark
spark-3.2.2-bin-hadoop3.2
这几个组件是什么关系?
很好的一组组件,这正是一套典型的大数据平台技术栈。我按**“从底层到上层、谁依赖谁、各自干什么”**给你讲清楚它们的关系。
JDK 是地基 → Hadoop 是基础平台 → YARN 是资源管家 → Hive / Spark 是干活的 → ZooKeeper 是协调员
作用:Java 运行环境
关系:
👉 没有 JDK,下面所有东西都跑不了
textJDK ├─ Hadoop ├─ Hive ├─ Spark └─ ZooKeeper
Hadoop ≠ 只有 HDFS
它至少包含 3 个核心模块:
| 模块 | 作用 |
|---|---|
| HDFS | 分布式存储 |
| YARN | 分布式资源管理 |
| MapReduce | 一种计算模型(现在用得少) |
👉 Hadoop 是 平台级基础设施
YARN 本身不做计算,它只负责:
textYARN ├─ 给 Spark 分资源 ├─ 给 Hive 分资源 └─ 控制整个集群负载
作用:
| 组件 | ZooKeeper 用途 |
|---|---|
| Hadoop | NameNode / ResourceManager HA |
| Hive | HiveServer2 HA、元数据协调 |
| Spark | Standalone / History / HA |
👉 没有 ZK,集群就没法“高可用”
本质:
Hive = 把 SQL 翻译成分布式计算任务
它依赖:
textHive ├─ SQL → 执行计划 ├─ 用 Spark / MR 跑 ├─ 用 YARN 申请资源 └─ 数据在 HDFS
Spark 是计算引擎,不是资源管理器
textSpark ├─ 用 YARN 拿资源 ├─ 读写 HDFS ├─ 可作为 Hive 的执行引擎 └─ 可独立跑 ETL / 机器学习
text┌───────────────┐ │ JDK │ └───────┬───────┘ │ ┌──────────▼──────────┐ │ Hadoop 3.1.1 │ │ ┌───────┬────────┐ │ │ │ HDFS │ YARN │ │ │ └───────┴────────┘ │ └──────────┬──────────┘ │ ┌────────────▼────────────┐ │ Spark │ │ Hive │ └────────────┬────────────┘ │ ┌──────▼──────┐ │ ZooKeeper │ └─────────────┘
text用户 ↓ Hive SQL ↓ Hive 解析 SQL ↓ 生成 Spark 任务 ↓ 向 YARN 申请资源 ↓ Spark Executor 启动 ↓ 从 HDFS 读数据 ↓ 计算 ↓ 结果写回 HDFS
你这套版本组合 整体是合理的,但有一个小注意点:
| 组件 | 版本 | 评价 |
|---|---|---|
| JDK | 1.8.0_381 | ✅ 推荐 |
| Hadoop | 3.1.1 | ⚠️ 稍老 |
| Hive | 3.1.0 | ✅ OK |
| Spark | 3.2.2 + Hadoop3.2 | ⚠️ 和 Hadoop 3.1.1 有轻微差异 |
| ZK | 常见 3.5.x | ✅ |
👉 Spark 编译版本是 Hadoop 3.2,而你 Hadoop 是 3.1.1
| 组件 | 一句话 |
|---|---|
| JDK | 没它全都跑不了 |
| Hadoop | 提供存储 + 资源管理 |
| YARN | 集群资源管家 |
| ZooKeeper | 高可用协调员 |
| Hive | SQL → 分布式计算 |
| Spark | 真正算数据的引擎 |
如果你愿意,下一步我可以帮你:
你可以直接说一句:
👉 “我想用它们做什么?”(离线数仓 / 实时 / ETL / 学习)
5个节点 就 2个rm ,5个nm zk 和 jobhistory 这几个全都在 hadoop 压缩包里面的吗
结论先给你一句非常明确的话,避免混淆:
只有 ResourceManager / NodeManager / JobHistoryServer 在 Hadoop 压缩包里
ZooKeeper 不在 Hadoop 压缩包里,必须单独安装
下面我按你说的 5 个节点、2 个 RM、5 个 NM,把每个组件是不是在 hadoop-3.1.1 里、要不要单独装、跑在哪一次讲清楚。
hadoop-3.1.1 压缩包里的这些都是 Hadoop 自带的守护进程:
| 组件 | 是否在 Hadoop 包里 | 说明 |
|---|---|---|
| ResourceManager (RM) | ✅ 在 | YARN 主控进程 |
| NodeManager (NM) | ✅ 在 | 每个节点都有 |
| JobHistoryServer | ✅ 在 | MapReduce 历史任务 |
| NameNode / DataNode | ✅ 在 | HDFS |
| Standby RM(HA) | ✅ 在 | 也是 RM,只是配置不同 |
👉 不用额外下载,解压 Hadoop 就有
| 组件 | 是否在 Hadoop 包里 | 原因 |
|---|---|---|
| ZooKeeper | ❌ 不在 | Apache 独立项目 |
| Hive | ❌ 不在 | 独立数据仓库组件 |
| Spark | ❌ 不在 | 独立计算引擎 |
👉 ZooKeeper 必须单独下载并部署
假设 5 台机器:
textnode1 node2 node3 node4 node5
textnode1: ResourceManager (Active) + NameNode + ZK node2: ResourceManager (Standby) + NameNode + ZK node3: NodeManager + DataNode + ZK + JobHistoryServer node4: NodeManager + DataNode node5: NodeManager + DataNode
很多人会误以为 ZK 是 Hadoop 的一部分,其实不是。
textZooKeeper ↑ Hadoop YARN HA ↑ ResourceManager 主备切换
QuorumPeerMain算 Hadoop 的组件,但不是 YARN 核心
| 进程 | 来自哪里 |
|---|---|
| ResourceManager | Hadoop |
| NodeManager | Hadoop |
| JobHistoryServer | Hadoop |
| NameNode | Hadoop |
| DataNode | Hadoop |
| ZooKeeper | 单独安装 |
| HiveServer2 | Hive |
| Spark Driver / Executor | Spark |
“既然 Hadoop 用 ZooKeeper,那 ZK 肯定在 Hadoop 包里”
✅ 正解:
用 ≠ 自带
“5 个 NM,就必须 5 个 Hadoop”
✅ 正解:
Hadoop 是一套软件,每个节点装一份,跑不同进程
“JobHistoryServer 是 YARN 必须的”
✅ 正解:
YARN 不依赖它,只是 MR 的 UI
Hadoop 包 = RM + NM + HDFS + MR
ZooKeeper = 外援,用来做 HA,不在 Hadoop 包里
如果你愿意,下一步我可以帮你做这三件事之一(都很实用):
1️⃣ 给你一张 5 节点 Hadoop + YARN + ZK 的部署拓扑图
2️⃣ 写一份 ZK + YARN HA 的最小可用配置模板
3️⃣ 帮你判断 JobHistoryServer 放哪台最合理
你直接选一个就行。
为什么要用 zookeeper
这是一个非常关键、问到“根因”的问题。
我不绕概念,直接从**“不用会怎样”→“ZK 到底解决了什么”→“在你这套 Hadoop/YARN 里具体干了什么”**一步步讲清楚。
ZooKeeper 的唯一核心价值:
在分布式系统里,保证“同一时刻只有一个老大,并且大家都知道老大是谁”
如果你不需要:
那你就不需要 ZooKeeper。
我们直接拿你最关心的 YARN ResourceManager 来举例。
textClient → RM → 分配资源
✅ 简单
❌ RM 一挂:
👉 单点故障
textClient → RM1 Client → RM2
问题来了:
❌ RM1 认为自己是老大
❌ RM2 也认为自己是老大
结果:
👉 这叫 脑裂(Split Brain)
ZK 提供一种机制:
所有 RM 都去 ZK 抢一个“唯一的锁”
textZK ├─ RM1:抢到锁 → Active └─ RM2:没抢到 → Standby
✔ 同一时刻只能有一个 Active RM
✔ 其他只能是 Standby
当 Active RM 挂了:
textRM1(Active) ❌ ↓ ZK 节点消失 ↓ RM2 发现锁没了 ↓ RM2 自动升级为 Active
✔ 不需要人工干预
✔ 客户端感知最小化
在分布式系统中,最怕的是:
“A 以为 B 还活着,C 以为 B 已经死了”
ZooKeeper 通过:
保证:
我们直接对照你现在用的组件。
text1 个 RM → 单点故障
textZK ├─ RM1(Active) └─ RM2(Standby)
作用:
👉 这是 YARN 使用 ZK 的最核心原因
和 RM 一模一样:
textZK ├─ NN1(Active) └─ NN2(Standby)
没有 ZK:
👉 它们不是一定要 ZK,但只要想 HA,就必须要
这是个很多人都会问的问题。
👉 这些坑,99% 的团队自己写都会踩
| 场景 | 是否必须 |
|---|---|
| 2 个 ResourceManager | ✅ 必须 |
| HDFS NameNode HA | ✅ 必须 |
| 场景 | 是否必须 |
|---|---|
| JobHistoryServer | ❌ 不需要 |
| 只有 1 个 RM | ❌ 不需要 |
| 纯学习/测试 | ❌ 可不用 |
ZooKeeper ≠ 用来存数据
ZooKeeper = 分布式系统的“裁判 + 记事本”
在 Hadoop/YARN 里,它只干三件事:
如果你愿意,我可以下一步帮你:
你只要回一句:
👉 “我要不要 HA?”