HDFS-伪分布模式搭建详解附-Shell-操作与-WordCount-测试
HDFS 伪分布模式搭建详解(附 Shell 操作与 WordCount 测试)
引言
对于大数据初学者或个人开发者而言,想要体验 HDFS 的分布式特性,但又没有多台服务器搭建全分布式集群?HDFS 伪分布模式就是最佳解决方案 —— 它按照全分布式的流程配置,却只需要一台 Linux 服务器,能完美模拟分布式环境的核心功能,非常适合开发测试、技能学习场景。
本文将从 “概念解析→环境准备→配置实操→集群验证→案例测试” 全流程,手把手教你搭建 HDFS 伪分布模式,并对比其与本地模式的差异,帮你避开常见坑点。
一、什么是 HDFS 伪分布模式?
先明确一个核心认知:伪分布不是 “假分布式”,而是 “单节点分布式”。
- 本质:按照全分布式集群的配置步骤搭建,但所有 HDFS 核心进程(NameNode、DataNode、SecondaryNameNode)都运行在同一台 Linux 服务器上。
- 适用场景:个人学习 HDFS 命令、开发 MapReduce/Spark 程序、测试数据读写逻辑(无法用于生产,性能和容错性远不及全分布式)。
- 典型场景举例:如果公司仅提供一台服务器,却需要模拟 “多节点磁盘聚合为云端存储” 的 HDFS 能力,此时搭建的就是伪分布模式。
二、搭建前的环境准备
在开始配置前,必须完成以下 6 项基础工作(以 CentOS 7 为例,Hadoop 3.3.1 版本):
准备项 | 操作步骤 | 关键命令 / 说明 |
---|---|---|
1. JDK 安装 | 提前安装 JDK 8+(Hadoop 3.x 不兼容 JDK 11+),并配置JAVA_HOME 环境变量 | 验证:java -version 能显示 JDK 版本 |
2. Hadoop 安装 | 下载 Hadoop 压缩包(
),解压到指定目录(本文以/opt/installs/hadoop 为例) | 解压命令:tar -zxvf hadoop-3.3.1.tar.gz -C /opt/installs/ |
3. 关闭防火墙 | 避免防火墙拦截 HDFS 进程通信 | 查看状态:systemctl status firewalld 关闭:systemctl stop firewalld 禁用开机启动:systemctl disable firewalld |
4. 配置免密登录 | 实现服务器 “自登录”(Hadoop 启动集群时需免密访问节点) | 生成密钥:ssh-keygen -t rsa -P "" (一路回车) 配置免密:ssh-copy-id 主机名 (本文主机名为bigdata01 ) 测试:ssh bigdata01 无需输密码即可登录 |
5. 修改 SELinux 安全机制 | 关闭 SELinux(否则可能拦截 HDFS 文件读写权限) | 编辑配置:vi /etc/selinux/config 修改为:SELINUX=disabled 生效:重启服务器(reboot ) |
6. 设置 Host 映射 | 让服务器能通过主机名识别自身(避免 IP 地址变更导致配置失效) | 编辑 Hosts 文件:vi /etc/hosts 添加:192.168.233.128 bigdata01 (IP 替换为你的服务器 IP) |
三、HDFS 伪分布核心配置(关键步骤)
Hadoop 的配置文件均位于/opt/installs/hadoop/etc/hadoop
目录下,需重点修改 4 个文件:
1. 配置core-site.xml
(HDFS 核心参数)
该文件定义 NameNode 地址、临时文件路径等核心参数,添加如下配置:
<configuration>
<!-- 1. 设置NameNode节点地址(Hadoop 3.x默认端口9820;2.x为8020;1.x为9000) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata01:9820</value>
</property>
<!-- 2. 设置HDFS临时文件存储路径(避免默认路径权限问题) -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/installs/hadoop/tmp</value>
</property>
</configuration>
2. 配置hdfs-site.xml
(HDFS 存储参数)
该文件定义副本数、SecondaryNameNode 地址等存储相关参数,伪分布模式下副本数需设为 1(仅 1 台 DataNode):
<configuration>
<!-- 1. 数据副本数(伪分布只有1台DataNode,设为1) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 2. SecondaryNameNode的HTTP访问地址(辅助NameNode管理元数据) -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata01:9868</value>
</property>
<!-- 3. NameNode的HTTP访问地址(Web端查看HDFS状态) -->
<property>
<name>dfs.namenode.http-address</name>
<value>bigdata01:9870</value>
</property>
</configuration>
3. 配置hadoop-env.sh
(环境变量)
指定 Hadoop 运行用户和 JDK 路径,避免启动时权限报错:
# 添加以下内容到文件末尾
export HDFS_NAMENODE_USER=root # NameNode运行用户
export HDFS_DATANODE_USER=root # DataNode运行用户
export HDFS_SECONDARYNAMENODE_USER=root # SecondaryNameNode运行用户
export YARN_RESOURCEMANAGER_USER=root # 后续配置YARN需用到
export YARN_NODEMANAGER_USER=root # 后续配置YARN需用到
# 指定JDK路径(替换为你的JDK安装目录)
export JAVA_HOME=/opt/installs/jdk
4. 配置workers
(节点列表)
指定 HDFS 的 DataNode 节点(伪分布只有 1 台,填主机名bigdata01
):
# 编辑workers文件(删除默认内容,仅保留以下一行)
vi /opt/installs/hadoop/etc/hadoop/workers
bigdata01
四、格式化 NameNode 与启动集群
配置完成后,需初始化 NameNode,并启动 HDFS 集群:
1. 格式化 NameNode(关键!仅执行 1 次)
格式化的本质是初始化 HDFS 的元数据存储目录(生成tmp
和logs
文件夹):
hdfs namenode -format
⚠️ 重要提醒:
- 格式化仅能执行 1 次!如果需要重新格式化,必须先删除
/opt/installs/hadoop/tmp
和/opt/installs/hadoop/logs
文件夹,否则会因元数据不一致导致集群启动失败。 - 格式化成功的标志:日志中出现
successfully formatted
字样。
2. 启动 HDFS 集群
通过 Hadoop 自带脚本启动所有 HDFS 进程:
start-dfs.sh
3. 验证集群状态
使用jps
命令查看进程(需包含以下 3 个进程,缺一不可):
jps
# 预期输出:
# 1234 NameNode # 管理元数据
# 5678 DataNode # 存储数据块
# 9012 SecondaryNameNode # 辅助NameNode
4. Web 端访问 HDFS
打开浏览器,输入http://你的服务器IP:9870
(如http://192.168.233.128:9870
),即可进入 HDFS Web 界面:
- 查看文件系统:点击左侧「Utilities」→「Browse the file system」
- 查看 DataNode 状态:点击左侧「Datanodes」
⚠️ 若无法访问:优先检查防火墙是否关闭(参考 “环境准备” 第 3 步),其次确认hosts
映射是否正确。
五、实战测试:用 WordCount 验证 HDFS 功能
搭建完成后,通过经典的 WordCount 案例测试 HDFS 的读写能力(统计文本中单词出现次数):
1. 上传测试文件到 HDFS
本地创建测试文件
wc.txt
(内容示例:hello hadoop hello hdfs
):bash
echo "hello hadoop hello hdfs" > /home/wc.txt
在 HDFS 创建目录
/home
:bash
hdfs dfs -mkdir /home
上传本地
wc.txt
到 HDFS 的/home
目录:bash
hdfs dfs -put /home/wc.txt /home
验证上传结果:
bash
hdfs dfs -ls /home # 查看HDFS目录下的文件
2. 执行 WordCount 任务
Hadoop 自带 WordCount 示例 Jar 包,路径为$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
,执行命令:
bash
hadoop jar /opt/installs/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /home/wc.txt /home/output
⚠️ 注意:/home/output
是结果输出目录,必须不存在(Hadoop 会自动创建,若已存在会报错)。
3. 查看统计结果
WordCount 的结果会存储在/home/output/part-r-00000
文件中,查看命令:
bash
hdfs dfs -cat /home/output/part-r-00000
预期输出(单词及其出现次数):
plaintext
hadoop 1
hdfs 1
hello 2
六、伪分布模式 vs 本地模式(关键差异)
很多初学者会混淆这两种模式,这里用表格清晰对比:
对比维度 | 本地模式 | 伪分布模式 |
---|---|---|
数据存储位置 | 本地文件系统(如/home ) | HDFS 分布式文件系统 |
结果存储位置 | 本地文件系统 | HDFS 分布式文件系统 |
运行进程 | 仅 JVM 进程(无 NameNode/DataNode) | 完整 HDFS 进程(NameNode/DataNode/SecondaryNameNode) |
适用场景 | 快速测试简单代码(无需配置 HDFS) | 模拟分布式环境(学习 HDFS 命令、调试分布式程序) |
命令差异 | 读取本地文件:hadoop jar ... /home/wc.txt /output | 读取 HDFS 文件:hadoop jar ... hdfs://bigdata01:9820/home/wc.txt ... |
⚠️ 切换到伪分布模式后,若再执行本地模式的 WordCount 命令(如读取本地/home/wc.txt
)会报错 —— 因为伪分布模式下,Hadoop 默认从 HDFS 读取数据,而非本地文件系统。
七、常见问题与注意事项
- 格式化后 DataNode 启动失败:删除
hadoop/tmp
和hadoop/logs
,重新格式化。 - 免密登录失败:检查
~/.ssh/authorized_keys
文件是否包含本机公钥,或执行chmod 600 ~/.ssh/authorized_keys
修改权限。 - Web 端无法访问 9870 端口:确认防火墙已关闭,且服务器 IP 可被外部访问(如虚拟机需配置桥接模式)。
- WordCount 报错 “File not found”:检查 HDFS 文件路径是否正确(用
hdfs dfs -ls
验证),避免混淆本地路径和 HDFS 路径。