目录

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 的元数据存储目录(生成tmplogs文件夹):

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

  1. 本地创建测试文件wc.txt(内容示例:hello hadoop hello hdfs):

    bash

    echo "hello hadoop hello hdfs" > /home/wc.txt
  2. 在 HDFS 创建目录/home

    bash

    hdfs dfs -mkdir /home
  3. 上传本地wc.txt到 HDFS 的/home目录:

    bash

    hdfs dfs -put /home/wc.txt /home
  4. 验证上传结果:

    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 本地模式(关键差异)

很多初学者会混淆这两种模式,这里用表格清晰对比:

对比维度本地模式伪分布模式
数据存储位置本地文件系统(如/homeHDFS 分布式文件系统
结果存储位置本地文件系统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 读取数据,而非本地文件系统。

七、常见问题与注意事项

  1. 格式化后 DataNode 启动失败:删除hadoop/tmphadoop/logs,重新格式化。
  2. 免密登录失败:检查~/.ssh/authorized_keys文件是否包含本机公钥,或执行chmod 600 ~/.ssh/authorized_keys修改权限。
  3. Web 端无法访问 9870 端口:确认防火墙已关闭,且服务器 IP 可被外部访问(如虚拟机需配置桥接模式)。
  4. WordCount 报错 “File not found”:检查 HDFS 文件路径是否正确(用hdfs dfs -ls验证),避免混淆本地路径和 HDFS 路径。