Hadoop 分布式集群实战 1—— 集群搭建与在线扩容

1 简介

Apache Hadoop 是开源分布式存储 + 分布式计算大数据框架,核心由 HDFS、YARN、MapReduce 三大组件构成,面向海量离线批处理场景,适合 TB/PB 级 "一次写入、多次读取" 的数据处理。

1.HDFS(分布式文件系统):NameNode 管理元数据,DataNode 存放真实数据。

  • NameNode(NN,管理节点)
    保存元数据 :目录树、文件名、权限、文件与 Block 映射;不存储真实业务数据
    单点版本存在单点故障;HA 模式搭配 Standby NameNode、ZKFC、JournalNode 实现故障自动切换Apache Had...。
  • DataNode(DN,工作节点)
    存放切分后的真实数据块 Block(默认 128MB);定期上报心跳与块信息,执行读写、副本复制。
  • Client 客户端
    先访问 NameNode 获取元数据,直接和 DataNode 传输真实数据
  • SecondaryNameNode
    辅助做元数据合并、Checkpoint,不能热切换顶替 NameNode

写入流程(Write)

  1. Client 请求 NameNode 创建文件、分配 Block 存储位置
  2. Client 直连目标 DataNode 写入数据块
  3. DataNode 之间完成副本同步 Replication

读取流程(Read)

  1. Client 请求 NameNode,查询文件各个 Block 存放在哪些 DataNode
  2. Client 直接连接对应 DataNode 获取真实数据 Read

2.YARN:集群资源调度管理器,统一分配 CPU、内存,支持 Spark、Flink、MapReduce 多种计算引擎混跑。

  • ResourceManager(RM,全局主管理器)
    整个集群唯一的资源总调度中心:接收客户端任务提交、管理所有 NodeManager、分配资源、调度队列。
    普通版本存在单点故障;HA 模式配置 Active / Standby RM 实现高可用。
  • NodeManager(NM,节点代理,每台机器一个)
    每个计算节点上运行,负责本机资源管理:监控本机 CPU、内存;启动 / 销毁容器 Container;和 ResourceManager 保持心跳。
  • ApplicationMaster(AM,应用管理器)
    每个任务(Application)单独生成一个 AM。向 RM 申请资源,和 NM 通信启动执行容器,管控本任务运行、容错。
  • Container(资源容器)
    YARN 最小资源分配单元,封装 CPU、内存资源,真正运行计算任务。

工作流程

  1. Client 向 ResourceManager 提交作业
  2. ResourceManager 分配容器,启动 ApplicationMaster
  3. ApplicationMaster 向 ResourceManager 申请运行任务所需资源
  4. ResourceManager 根据各 NodeManager 上报的节点状态分配资源
  5. NodeManager 使用容器启动 MapTask、ReduceTask 等任务
  6. 任务运行期间持续上报任务状态,NodeManager 持续上报节点状态
  7. 作业全部任务执行完成,ApplicationMaster 释放占用资源

3.MapReduce:离线批计算编程模型,分为 Map 并行处理、Reduce 聚合结果两个阶段。

  • Input 输入分片:HDFS 上的文件按 Block 逻辑切分为输入分片,一个分片对应一个 Map 任务。
  • Map 阶段(映射)
    读取分片数据,自定义逻辑处理,输出 <key,value> 键值对;
    输出数据先写入本地磁盘(不是 HDFS),经过分区、排序、归并。
  • Shuffle 洗牌(Map → Reduce 中间过程,重中之重)
    分区数据通过网络传输到对应 Reduce 节点,完成分组排序,保证相同 key 的数据交给同一个 Reduce。
  • Reduce 阶段(归约)
    接收一组相同 key 的数据集,自定义聚合逻辑(求和、计数、去重等)。
  • Output 输出:最终结果写入 HDFS。

工作流程

  1. 输入文件进行分片,每个分片交由一个 map () 函数执行 Map 任务,输出键值对
  2. 对 Map 输出数据进行分区、排序、归并,相同 key 的数据分发至同一个 reduce ()
  3. reduce () 函数聚合处理分组数据,执行 Reduce 任务,最终产生输出文件

Hadoop VS MooseFS

特性 MooseFS(MFS) Hadoop(HDFS)
接口 FUSE,完整 POSIX,可直接 mount 挂载,普通程序无需改造 非标准 POSIX,Java API/Shell 访问,不能直接挂载
核心定位 通用分布式文件存储 大数据配套存储,和计算引擎深度绑定
适用场景 中小集群、小文件、共享存储、虚拟机镜像、媒体素材 超大文件、离线日志分析、数据仓库、海量批计算
高可用 Community 版单 Master,依赖 Pacemaker+SBD 实现 HA 原生支持双 NameNode HA、Zookeeper 故障转移

2 单机伪分布式部署

官方文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download

新建专用运行用户,部署 JDK 和 Hadoop 安装包、配置环境变量

bash 复制代码
[root@server1 ~]# useradd hadoop
[root@server1 ~]# passwd hadoop
[root@server1 ~]# mv hadoop-3.3.6.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop/
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ tar zxf hadoop-3.3.6.tar.gz
[hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ln -s hadoop-3.3.6 hadoop
[hadoop@server1 ~]$ ln -s jdk1.8.0_181 jdk
[hadoop@server1 ~]$ vim .bash_profile

workers 文件用来定义 DataNode 节点列表,伪分布式为 localhost

bash 复制代码
[hadoop@server1 ~]$ source .bash_profile
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ cd etc/
[hadoop@server1 etc]$ cd hadoop/
[hadoop@server1 hadoop]$ cat workers

Hadoop 启动脚本必须知道 Java 路径,否则无法运行

bash 复制代码
[hadoop@server1 hadoop]$ vim hadoop-env.sh

bin/hadoopHadoop 的主入口命令脚本,整个 Hadoop 绝大多数功能都靠它调用

bash 复制代码
[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ bin/hadoop

执行命令后显示bin/hadoop 命令的完整用法帮助说明

本地模式测试:不启动 HDFS,直接在单机本地跑 MapReduce,验证 jar 包、Java 环境是否正常

运行MapReduce官方示例

bash 复制代码
[hadoop@server1 hadoop]$ mkdir input
[hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
# 使用 Hadoop 自带的 grep MapReduce 示例程序,读取 input 目录里的配置文件,检索匹配 dfs[a-z.]+ 的字段,统计每个匹配词汇出现次数,最终结果自动生成到 output 目录
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
[hadoop@server1 output]$ cat *

配置默认文件系统地址 hdfs://localhost:9000

bash 复制代码
[hadoop@server1 output]$ cd ..
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim core-site.xml

配置文件副本数 dfs.replication=1(单机只能1副本)

bash 复制代码
[hadoop@server1 hadoop]$ vim hdfs-site.xml

配置免密

bash 复制代码
[hadoop@server1 hadoop]$ ssh-keygen
[hadoop@server1 hadoop]$ ssh-copy-id localhost
[hadoop@server1 hadoop]$ ssh localhost
# 切记 ctrl+d 退出!

初始化HDFS元数据,仅首次部署执行

bash 复制代码
[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

一键启动 NameNode + DataNode,拉起HDFS分布式文件系统

bash 复制代码
[hadoop@server1 hadoop]$ sbin/start-dfs.sh

有警告,只需远程连接一下 server1 即可

bash 复制代码
[hadoop@server1 hadoop]$ ssh server1
[hadoop@server1 ~]$ logout

查看正在运行的 Java 进程

bash 复制代码
[hadoop@server1 hadoop]$ jps

查看本机 TCP 端口监听情况,均正常

bash 复制代码
[hadoop@server1 hadoop]$ netstat -antlp
  1. 9000(tcp 127.0.0.1:9000) → PID 32023 NameNode
    HDFS 默认通信端口(fs.defaultFS 使用的端口,客户端、DataNode 和 NameNode 交互)
  2. 9864 / 9866 → DataNode 内置监听端口
  3. 9867 / 9868 → SecondaryNameNode 端口
  4. 9870 → NameNode WebUI 端口(浏览器访问:http://server1:9870 查看 HDFS 管理页面)

访问前端网页

创建目录/user在分布式 HDFS 上,不是本地磁盘

bash 复制代码
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user

在刚才建好的 /user 下,继续创建 /user/hadoop 目录

bash 复制代码
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop

点击 user 即可看见

创建目录 /user/hadoop/input,用来存放 MR 任务的输入数据源,上传文件

bash 复制代码
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input
# 本地 etc/hadoop/ 下所有 .xml 配置文件,上传到 HDFS 的 /user/hadoop/input 目录里
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls input

前端可以看见此目录

调用 hadoop 自带示例 jar,运行 WordCount 单词统计 MapReduce 程序 :读取 HDFS /user/hadoop/input 里所有文件,分词统计每个单词出现次数,结果输出到 HDFS /user/hadoop/output

bash 复制代码
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output
[hadoop@server1 hadoop]$ bin/hadoop fs -cat output/*

区分:

  • 本地模式测试的inputoutput:在 Linux 本机磁盘hadoop 安装目录下,本地文件夹),不需要启动 HDFS,ls 本地目录就能看见
  • 伪分布式的inputoutput: 在 HDFS 分布式文件系统 ,完整路径 /user/hadoop/input/user/hadoop/output,只能用 bin/hdfs dfs -ls 查看,在服务器本地直接 ls 看不到这个 output 文件夹 ,在前端网页可以查看

关闭 HDFS 整个集群,依次停止三个进程

bash 复制代码
[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
[hadoop@server1 hadoop]$ jps

2 多节点完全分布式部署

官方文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download

新开虚拟机 server2 和 server3 ,添加解析,并进行时间同步

bash 复制代码
vim /etc/hosts

三个节点需要有相同的用户,uid 和 gid 都要相同

注意:不要随便修改用户的 uid 和 gid,会出现权限失效、看不见文件、读写报错、程序找不到数据的情况

三台机器均安装 nfs 用于共享数据

bash 复制代码
yum install -y nfs-utils

配置NFS共享目录,把远端访问权限映射为 hadoop,多节点挂载 /home/hadoop 共享目录时,客户端操作文件,归属人自动映射为服务端 hadoop 用户(uid=1000)

避免挂载后文件属主变成 nobody,出现权限报错、Hadoop 读写失败

bash 复制代码
[root@server1 ~]# vim /etc/exports

启动并开机自启NFS服务,查看本机对外发布的NFS共享目录

bash 复制代码
[root@server1 ~]# systemctl enable --now nfs
[root@server1 ~]# showmount -e

在 server2 查询 server1 上发布了哪些 NFS 共享目录

bash 复制代码
[root@server2 ~]# echo 123456 |passwd --stdin hadoop
# 最好每个节点密码相同
[root@server2 ~]# showmount -e server1

server3

server2 和 server3 挂载,共享文件

bash 复制代码
mount 192.168.40.141:/home/hadoop/ /home/hadoop/

server1 远程连接各节点,保证/etc/hosts解析正常,ssh 端口互通,所有节点 hadoop 用户密码有效,可以正常登录

指定整个集群默认文件系统为 server1 上端口 9000 的 HDFS

bash 复制代码
[hadoop@server1 ~]$ cd hadoop/etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml

存 2 份副本

bash 复制代码
[hadoop@server1 hadoop]$ vim hdfs-site.xml

定义集群中所有 DataNode(数据节点)主机名,启动脚本会远程在这些机器拉起 DataNode 进程

bash 复制代码
[hadoop@server1 hadoop]$ vim workers

初始化 HDFS 文件系统,生成 NameNode 元数据,仅首次搭建执行

bash 复制代码
[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

执行脚本一键启动 HDFS 集群(NameNode + 所有 workers 里配置的 DataNode)

bash 复制代码
[hadoop@server1 hadoop]$ sbin/start-dfs.sh

在前端可看到两个存活的节点

依旧使用官方示例测试

bash 复制代码
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input

文件的数据块(Block 0)一共有 2 个副本 ,分别保存在 server2、server3 两台数据节点上

配置 MapReduce 运行调度框架为 YARN,并指定任务运行所需类库路径

bash 复制代码
[hadoop@server1 hadoop]$ vim etc/hadoop/mapred-site.xml

开启 MapReduce 所需的 shuffle 服务,配置 NodeManager 可传递至任务容器的环境变量白名单

bash 复制代码
[hadoop@server1 hadoop]$ vim etc/hadoop/yarn-site.xml

一键启动 YARN 集群(ResourceManager + 各节点 NodeManager)

bash 复制代码
[hadoop@server1 hadoop]$ sbin/start-yarn.sh

server2 和 server3 上也会开启 NodeManager

访问http://192.168.40.141:8088/ ResourceManager 前端监控界面,查看任务、节点资源

3 在线扩容

新开虚拟机 server4,各个节点同步解析,并进行时间同步

bash 复制代码
[root@server4 ~]# useradd hadoop
# 还是要保证 uid 和 gid 与其他节点相同
[root@server4 ~]# yum install -y nfs-utils
[root@server4 ~]# mount 192.168.40.141:/home/hadoop/ /home/hadoop/

所有节点之间相互免密

bash 复制代码
[root@server4 ~]# su - hadoop
[hadoop@server4 ~]$ cd hadoop
[hadoop@server4 hadoop]$ vim etc/hadoop/workers

后台独立启动当前节点的 DataNode 数据存储进程和 NodeManager 资源管理进程

bash 复制代码
[hadoop@server4 hadoop]$ bin/hdfs --daemon start datanode
[hadoop@server4 hadoop]$ bin/yarn --daemon start nodemanager

HDFS 文件副本数量改为3

bash 复制代码
[hadoop@server4 hadoop]$ vim etc/hadoop/hdfs-site.xml

server5 以此类推

相关推荐
东莞和裕包装2 小时前
如何管控广州定制纸箱生产中的啤切精度与印刷色差质量问题
大数据·运维·网络·人工智能
时下握今3 小时前
CDA一级认证|三大基础分析范式怎么理解?分类/链式/相关范式详解
大数据
xiaopai9453 小时前
从WPS工程项目管理表到工程项目管理系统:企业数字化升级的边界在哪里?
大数据·wps·工程项目管理·建米软件
肠畔码农4 小时前
深度解密 Redis 分布式锁:从单机原子语义到集群架构博弈
redis·分布式·架构
TMT星球4 小时前
伽利略机器人亮相WRC 2026,突破形态局限发布“陆行具身系统”Galileo X
大数据·人工智能·机器人
一只鹿鹿鹿6 小时前
数据资产管理解决方案(Word文件)
大数据·数据库·安全·web安全·系统安全
m0_638079626 小时前
2026年AI论文写作辅助工具技术对比与使用观察
大数据·人工智能
商业数据派6 小时前
日赚近1亿的网易,这个季度栽在了拼多多身上
大数据·人工智能
晓子文集6 小时前
Tushare接口文档:月线行情(monthly)
大数据·数据库·金融数据·量化投资·tushare
长谷深风1116 小时前
AI Tool 设计:粒度、参数与错误恢复怎么做
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计