一、 前言:为什么选择HDFS?

我们正处在一个数据爆炸的时代。从社交网络上的每一次点赞、电商平台的每一笔交易,到物联网设备的实时传感信号,海量数据正以惊人的速度产生和积累。这些数据规模庞大(Volume)、类型繁多(Variety)、增长迅速(Velocity),其价值密度低(Value)但潜力巨大,共同构成了我们所说的“大数据”。传统的数据存储方案,如关系型数据库和单机文件系统,在面对PB级别的非结构化数据时,早已力不从心。它们犹如试图用一个小渔网去捕捞鲸鱼,不仅在存储容量上存在天花板,更在读写吞吐量和处理效率上遇到了难以逾越的瓶颈。

正是在这样的挑战下,Apache Hadoop应运而生,而作为其核心存储支柱的Hadoop分布式文件系统(HDFS),则成为了解决海量数据存储问题的钥匙。HDFS的设计哲学源于谷歌的GFS论文,其核心思想是“分而治之”。它将一个巨大的文件切分成若干个固定大小的数据块(Block,默认为128MB),并将这些数据块以多副本(默认为3份)的形式分布式地存储在整个集群的普通商用服务器上。这种看似简单的设计,却带来了革命性的优势:

  • 高容错性与可靠性:数据的多副本机制意味着任何一块磁盘或服务器的损坏都不会导致数据的永久丢失。系统会自动检测故障,并在其他健康的节点上重新复制数据,确保了业务的连续性。

  • 高吞吐量数据访问:HDFS的设计目标是“一次写入,多次读取”,非常适合大数据批处理的场景。通过将计算任务(如MapReduce)调度到数据所在的节点进行计算,极大地减少了网络传输开销,实现了数据本地化,从而提供了极高的数据吞吐率。

  • 极强的可扩展性:HDFS集群采用典型的Master/Slave架构,可以通过简单地增加廉价的DataNode节点来线性地扩展存储容量和处理能力,轻松构建起拥有成百上千台节点的超大规模集群。

  • 成本低廉:HDFS并不依赖于昂贵的高端硬件,而是构建在普通的商用服务器之上。这种设计极大地降低了海量数据存储的门槛,使得任何企业都有能力构建自己的大数据平台。

因此,学习和掌握HDFS的搭建与管理,是迈入大数据领域不可或缺的第一步。它不仅是Hadoop生态的基石,也是理解后续如Hive、HBase、Spark等所有框架的基础。本文的目标,正是要作为您的实践指南,手把手带领您从零开始,成功搭建一个具备1个NameNode和2个DataNode的HDFS完全分布式集群。

二、 搭建准备

  1. 硬件与软件环境要求

    • 硬件:至少3台虚拟机(Linux系统),建议配置(内存≥4G,硬盘≥20G)。

    • 软件

      • 操作系统:CentOS 7 或 Ubuntu 18.04 LTS

      • Java:JDK 1.8+

      • Hadoop:3.x 版本(本文以Hadoop 3.3.0为例)

      • SSH:用于节点间免密通信

  2. 集群规划(角色分配)

    • bigdata01 (192.168.233.128):NameNode,DataNode

    • bigdata01 (192.168.233.129): SecondaryNameNode,DataNode

    • bigdata01 192.168.233.130):DataNode

  3. 准备工作清单:提供软件包下载链接。

三、 基础环境配置

  1. 安装JDK并配置环境变量

    • 解压JDK压缩包。

    • 配置 JAVA_HOME 等环境变量 ( /etc/profile)。

      vi /etc/profile
      
      export JAVA_HOME=/opt/installs/jdk
      export PATH=$PATH:$JAVA_HOME/bin
    • source 使配置生效,并用 java -version 验证。

      source /etc/profile
  2. 配置静态IP与主机名

    • 修改 /etc/hosts 文件,添加所有节点的主机名映射。

      192.168.233.128 bigdata01
      192.168.233.129 bigdata02
      192.168.233.130 bigdata03
    • 使用 hostnamectl 命令永久设置各自的主机名。

  3. 配置SSH免密登录(关键步骤)

    • 在Master节点生成SSH密钥对 (ssh-keygen)。

      1、需要在bigdata01上生成公钥和私钥
      ssh-keygen -t rsa
      一路回车即可。
      2、生成的公钥和私钥在哪里?
      /root/.ssh/id_rsa
    • 将公钥分发到所有节点(包括自己)(ssh-copy-id)。

      3、将公钥传递给你想免密登录的电脑,比如bigdata02
      ssh-copy-id bigdata02
      如果想要传给自己
      ssh-copy-id bigdata01
    • 测试从Master节点SSH到所有Slave节点无需密码。

      ssh  bigdata02    发现不需要输入密码即可完成登录
      exit   退出当前的登录
  4. 关闭防火墙

    1.查看防火墙状态
    systemctl status firewalld
    
    2.关闭防火墙,但是开机后,防火墙还是会开启
    systemctl stop firewalld 
    
    3.开机不启动
    systemctl disable firewalld 

四、 Hadoop安装与核心配置

  1. 在Master节点安装Hadoop

    • 解压Hadoop压缩包到指定目录(如 /usr/local/hadoop)。

    • 配置Hadoop环境变量 (HADOOP_HOMEPATH)。

      export HADOOP_HOME=/opt/installs/hadoop
      export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
      
      
      source /etc/profile
  2. 修改Hadoop配置文件(核心部分)

    • hadoop-env.sh:配置 JAVA_HOME 的绝对路径。

      export HDFS_NAMENODE_USER=root
      export HDFS_DATANODE_USER=root
      export HDFS_SECONDARYNAMENODE_USER=root
      
      export JAVA_HOME=/opt/installs/jdk
    • core-site.xml:配置HDFS的默认访问地址和临时目录。

      <configuration>
        <!-- 设置namenode节点 -->
        <!-- 注意: hadoop1.x时代默认端⼝9000 hadoop2.x时代默认端⼝8020 hadoop3.x时
             代默认端⼝ 9820 -->
        <property>
          <name>fs.defaultFS</name>
          <value>hdfs://bigdata01:9820</value>
        </property>
        
        <!-- hdfs的基础路径,被其他属性所依赖的⼀个基础路径 -->
        <property>
          <name>hadoop.tmp.dir</name>
          <value>/opt/installs/hadoop/tmp</value>
        </property>
      </configuration>
    • hdfs-site.xml:配置副本数、NameNode和DataNode数据存储目录。

      <configuration>
          <property>
              <!--备份数量-->
              <name>dfs.replication</name>
              <value>1</value>
          </property>
          <!--secondarynamenode守护进程的http地址:主机名和端⼝号。
              参考守护进程布局 -->
          <property>
              <name>dfs.namenode.secondary.http-address</name>
              <value>bigdata01:9868</value>
          </property>
          <!-- namenode守护进程的http地址:主机名和端⼝号。参考守护进程布局 -->
          <property>
              <name>dfs.namenode.http-address</name>
              <value>bigdata01:9870</value>
          </property>
      </configuration>
    • workers (或 slaves):指定所有的DataNode节点主机名。

      hadoop-slave1
      hadoop-slave2
  3. 将配置好的Hadoop分发到所有Slave节点

    scp -r /etc/profile root@bigdata02:/etc/
    scp -r /etc/profile root@bigdata03:/etc/
    
    source /etc/profile

五、 启动HDFS集群与验证

  1. 首次启动:格式化NameNode仅在第一次搭建时执行

    hdfs namenode -format
    • 警告:格式化会清空所有元数据,生产环境慎用!

  2. 启动HDFS集群

    • 在Master节点,使用 start-dfs.sh 脚本一键启动所有HDFS进程。

  3. 验证集群是否成功启动

    • 方法一:使用jps命令查看Java进程

    • 方法二:通过Web UI界面可视化查看

  4. 基础HDFS命令测试

    •  创建目录

      hdfs dfs -mkdir /test
    • 上传文件

      hdfs dfs -put localfile.txt /test/ 
    • 查看文件

      hdfs dfs -ls /test 
    •  查看文件内容

      hdfs dfs -cat /test/localfile.txt

六、 常见问题排查(FAQ)

  1. 启动脚本报错:Permission denied → 检查SSH免密登录是否配置成功。

  2. DataNode进程无法启动 → 检查 workers 文件配置、防火墙是否关闭。

  3. Web页面无法打开 → 检查防火墙、端口号(Hadoop3.x NameNode端口是9870)。

  4. Live Nodes显示为0 → 检查DataNode日志,常见原因是目录权限问题或集群ID不一致(多次格式化导致)。

  5. 如何优雅地停止集群? → 使用 stop-dfs.sh 脚本。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐