Hadoop 3.1.3 Linux 下 HDFS 完全分布式配置指南
搞大数据这一行HDFS 基本上是绕不过去的一道坎。不管后面你要跑 MapReduce 做离线统计还是接 Spark、Flink 搭实时链路底下那层存数据的底座十有八九是 HDFS。很多人第一次在 Linux 上装 Hadoop教程收藏了一堆配置文件改来改去最后不是 NameNode 起不来就是 DataNode 掉线再不就是 Web 页面死活打不开。这篇就按我实际部署的节奏把 Hadoop 3.1.3 在 Linux 下 HDFS 环境的配置全过程从头到尾捋一遍从主机准备、依赖版本、配置文件逐项拆解一直到格式化、启动、验证和排错。内容适合刚入门大数据、需要在虚拟机或测试机上把 HDFS 跑起来的朋友也适合之前装过一次但没搞明白参数含义、想重新理解一遍的老哥。整套流程我用的是三台虚拟机加 root 用户操作的方案单机和伪分布式会在开头一并说明差异你可以按自己的机器情况挑着看。1. 先把方案定下来单机、伪分布式还是完全分布式1.1 三种部署模式的差别与适用场景HDFS 环境搭建这件事第一步不是敲命令而是想清楚自己到底要哪种模式。Hadoop 官方把部署方式分成三类本地模式、伪分布式模式、完全分布式模式。本地模式压根不启动 HDFS 的守护进程文件系统的概念退化成操作系统本地目录跑个 WordCount 练手可以但学不到 HDFS 的任何东西。伪分布式模式是在一台机器上把 NameNode、DataNode、SecondaryNameNode 全部跑起来彼此用 SSH 和网络端口通信数据的存储路径、副本策略、Web UI 这些和真实集群一模一样只是物理上只有一台机。完全分布式则是把各角色分到不同主机上是生产环境的形态。我个人的判断是这样如果你只是想弄懂 HDFS 的读写流程、副本机制、命令行操作伪分布式足够了配置量只有完全分布式的三分之一排错也简单。如果你是要做课程设计、集群实验或者想模拟真实的 DataNode 上下线那必须上完全分布式三台机起步。这里我按三台机的完全分布式来写因为参数项最全你看完之后往回退到一台机也是分分钟的事。唯一要改的核心就是副本数dfs.replication三台机填 3一台机填 1千万别在一台机上填 3否则 HDFS 会一直报副本数不足的警告看着很烦。1.2 我的选型建议与硬件资源规划说下我的资源规划这块很多教程一笔带过其实挺关键。三台虚拟机我用的是 4 核 8G 的配置每台分配 2 核 CPU、4G 内存、50G 硬盘。NameNode 那台稍微给多点内存没关系因为 NameNode 要把整个文件系统的元数据加载到内存里文件越多占用越大测试环境 4G 完全够用。硬盘方面50G 是保守值主要看你要往 HDFS 里塞多少测试数据纯练手 30G 也够。主机名我统一规划成 hadoop01、hadoop02、hadoop03角色划分是hadoop01 跑 NameNode 和 SecondaryNameNodehadoop02 和 hadoop03 跑 DataNode。当然你也可以把 SecondaryNameNode 单独拆到 hadoop02 上分散压力我这里是图省事。有一点要提醒的是虚拟机网络建议用 NAT 或者桥接都行重要的是三台机之间能互相 ping 通而且 IP 最好设成静态的别用 DHCP 自动分配。我见过太多人装好之后重启一次虚拟机IP 变了然后整个集群连不上排查半天才发现是 IP 漂移。静态 IP 的配置在 CentOS 系是改/etc/sysconfig/network-scripts/ifcfg-ens33这类文件Ubuntu 系是改 netplan 的 yaml具体命令网上很多这里不展开但这一步一定要在装 Hadoop 之前搞定别等出问题了再回来补。2. Linux 主机基础环境准备2.1 主机名、hosts 映射与网络参数三台机器装好系统之后先做四件最基础的事顺序别乱。第一件是改主机名用hostnamectl set-hostname hadoop01改完之后bash重新加载一下或者直接重新登录。主机名一定要改因为后面 HDFS 的很多配置项里会直接用主机名做地址如果主机名还是默认的 localhost.localdomain配置起来会特别别扭。第二件是配 hosts 映射编辑/etc/hosts把三台机的 IP 和主机名对应关系写进去三台机都要写一样的、完整的三行。这一步的目的是让机器之间能用主机名直接通信省得配置文件里到处写 IP将来换 IP 只要改一处。第三件是确认网络互通三台机互相ping hadoop02之类的试一下能通再往下走。第四件是关防火墙和 SELinux这两样东西是 HDFS 启动失败的常客。防火墙用systemctl stop firewalld临时关掉再用systemctl disable firewalld禁止开机自启。SELinux 用setenforce 0临时关闭然后编辑/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled永久关闭。我知道有人会说生产环境不能这么干这话没错但测试环境里为了快速把环境跑通先关掉是最省事的选择等环境跑起来之后你再去研究怎么开特定端口那是后话。这里别搞反顺序先关再装 Hadoop别装完发现起不来才回头关。2.2 SSH 免密登录与防火墙、SELinux 处理SSH 免密这一块是伪分布式和完全分布式都必须要做的。Hadoop 的启动脚本start-dfs.sh会通过 SSH 去各个节点上拉起对应的守护进程如果每台都要输密码脚本根本没法自动化执行。做法是在 hadoop01 上生成密钥对ssh-keygen -t rsa一路回车然后把自己的公钥拷给自己和另外两台机。这里有个细节NameNode 节点要能免密登录所有 DataNode 节点而且 NameNode 节点也要能免密登录它自己因为 SecondaryNameNode 虽然可以在别的机器上但脚本默认还是从当前机器发起。所以 hadoop01 上要执行三次ssh-copy-id分别对应 hadoop01、hadoop02、hadoop03。验证方式很简单ssh hadoop02看看是不是不用输密码就进去了三台都试一遍。如果还是不行的大概率是~/.ssh目录权限不对正常的权限应该是 700 目录、600 的 authorized_keys 文件权限太开 SSH 会拒绝使用密钥。这个坑我也踩过明明密钥拷过去了就是不生效查了半天是权限问题。另外如果你图省事在每台机上都生成了密钥互相拷贝那也能用但管理起来乱建议统一从 NameNode 那台分发。2.3 JDK 安装与版本选择Hadoop 是 Java 写的没有 JDK 寸步难行。Hadoop 3.1.3 这个版本我强烈建议用 JDK 8具体点就是 1.8.0_xxx 这一系列。为什么不用更高的因为 Hadoop 3.1.3 发布于 2018 年前后那个时期主流就是 Java 8官方文档也是按 Java 8 写的。你硬上 JDK 11编译层面是能跑的但启动时会刷一大片 Illegal reflective access 的警告虽然不影响运行但看着糟心而且部分模块的行为可能有细微差异排查问题的时候会怀疑人生。JDK 17 就更别想了那个年代的 Hadoop 还没有对它的适配。所以老老实实装 JDK 8省心。安装方式我建议用解压 tar.gz 的方式别用包管理器装因为包管理器装的 JDK 路径分散JAVA_HOME不好定位。去官网下个jdk-8uXXX-linux-x64.tar.gz解压到/opt/module/下面重命名成jdk1.8.0_XXX之类的固定名字。然后配环境变量编辑/etc/profile.d/my_env.sh这个文件把JAVA_HOME和PATH写进去source一下生效。三台机都要装且路径要完全一致因为 Hadoop 的hadoop-env.sh里写的是绝对路径如果你三台机 JDK 装的位置不一样有的是/usr/java有的是/opt/module那启动脚本在别的节点上就找不到 Java 了。这个一致性的要求很多人忽略最后报 JAVA_HOME is not set 或者 No such file or directory。3. Hadoop 3.1.3 安装包落地与目录规划3.1 下载、上传与校验安装包我建议直接从 Apache 官方归档站下载或者用国内一些高校的镜像站速度会快不少。版本号锁定 3.1.3文件是hadoop-3.1.3.tar.gz大概三百多兆。下载完之后如果你有校验习惯可以核对一下官方的 sha512 值确认文件没在下