CentOS 虚拟机搭建 Hadoop 环境实操指南
一 环境规划与准备
- 目标架构:建议先用一台虚拟机搭建单机伪分布式(学习验证最快),再扩展到3 节点集群(1 主 2 从)。
- 资源建议:每台虚拟机至少2 核 CPU、4GB 内存、50GB 磁盘;如使用 VMware/VirtualBox,网络优先桥接或**NAT(端口转发)**以便外部访问。
- 软件版本:CentOS 7/8(本文以 7 为例)、Java 8(Hadoop 3.x 推荐)、Hadoop 3.3.x(稳定且资料多)。
- 基础工具:安装常用工具(便于后续操作)
sudo yum update -y && sudo yum install -y wget tar openssh-clients which
二 虚拟机与基础系统配置
- 静态 IP(示例网卡名 ens33,按实际调整)
- 编辑:vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 关键项:
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.101
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
- 使生效:systemctl restart network
- 主机名与 hosts
- 主机名:hostnamectl set-hostname hadoop-master(从节点分别为 hadoop-slave1/2)
- hosts(所有节点一致):
192.168.1.101 hadoop-master
192.168.1.102 hadoop-slave1
192.168.1.103 hadoop-slave2
- 关闭防火墙与 SELinux
- systemctl stop firewalld && systemctl disable firewalld
- sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config && setenforce 0
- 时间同步(可选但强烈建议)
- yum install -y ntp && systemctl start ntpd && systemctl enable ntpd
- 创建专用用户(推荐)
- useradd hadoop && echo “hadoop:hadoop” | chpasswd
- echo “hadoop ALL=(ALL) NOPASSWD: ALL” >> /etc/sudoers(或 visudo 编辑)
三 安装 Java 与 Hadoop
- 安装 JDK 8(两种常用方式,二选一)
- OpenJDK:sudo yum install -y java-1.8.0-openjdk-devel
- Oracle JDK:
wget https://download.oracle.com/java/8/latest/jdk-8uXXX-linux-x64.tar.gz
tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /opt/
配置环境变量(全局或 hadoop 用户):
echo ‘export JAVA_HOME=/opt/jdk1.8.0_XXX’ >> /etc/profile
echo ‘export PATH=$PATH:$JAVA_HOME/bin’ >> /etc/profile
source /etc/profile
- 安装 Hadoop 3.3.x
- wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -zxvf hadoop-3.3.6.tar.gz -C /opt/
mv /opt/hadoop-3.3.6 /opt/hadoop
- 环境变量(建议写入 /etc/profile,所有用户可用):
echo ‘export HADOOP_HOME=/opt/hadoop’ >> /etc/profile
echo ‘export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin’ >> /etc/profile
source /etc/profile
- 验证:java -version;hadoop version
四 配置 Hadoop(单机伪分布式,快速可用)
- 配置 Hadoop 环境脚本
- vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
添加:export JAVA_HOME=/opt/jdk1.8.0_XXX
- 核心配置文件($HADOOP_HOME/etc/hadoop/)
- core-site.xml
fs.defaultFS
hdfs://localhost:9000
- hdfs-site.xml
dfs.replication
1
dfs.namenode.name.dir
file:///opt/hadoop/data/namenode
dfs.datanode.data.dir
file:///opt/hadoop/data/datanode
- mapred-site.xml(先复制模板)
cp mapred-site.xml.template mapred-site.xml
mapreduce.framework.name
yarn
- yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
- 创建数据目录并赋权
- mkdir -p /opt/hadoop/data/{namenode,datanode}
chown -R hadoop:hadoop /opt/hadoop
- 格式化 NameNode 并启动
- 切换到 hadoop 用户:su - hadoop
- hdfs namenode -format
- start-dfs.sh && start-yarn.sh
- 验证
- jps 应看到:NameNode、DataNode、ResourceManager、NodeManager
- Web UI:
HDFS NameNode:http://localhost:9870
YARN ResourceManager:http://localhost:8088
如为虚拟机桥接或 NAT 端口转发,请将 localhost 替换为宿主机可访问的 IP。
五 扩展为三节点集群
- 克隆虚拟机
- 以“模板机”为基准克隆出 hadoop-slave1/2,启动后分别修改:
/etc/sysconfig/network-scripts/ifcfg-ens33 的 IPADDR
hostnamectl set-hostname hadoop-slave1(或 slave2)
- 配置 SSH 免密登录(主节点执行)
- su - hadoop
- ssh-keygen -t rsa -P “”
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 分发公钥到所有节点(含本机):
ssh-copy-id hadoop@hadoop-master
ssh-copy-id hadoop@hadoop-slave1
ssh-copy-id hadoop@hadoop-slave2
- 修改 Hadoop 配置以支持多节点
- $HADOOP_HOME/etc/hadoop/core-site.xml(保持默认 fs.defaultFS 指向主节点)
- $HADOOP_HOME/etc/hadoop/hdfs-site.xml
dfs.replication2
- $HADOOP_HOME/etc/hadoop/workers(老版本为 slaves)
hadoop-slave1
hadoop-slave2
- 同步配置到所有节点:
scp -r $HADOOP_HOME/etc/hadoop hadoop@hadoop-slave1:$HADOOP_HOME/etc/
scp -r $HADOOP_HOME/etc/hadoop hadoop@hadoop-slave2:$HADOOP_HOME/etc/
- 启动集群
- 仅在主节点执行:
hdfs namenode -format(首次)
start-dfs.sh && start-yarn.sh
- 在各节点用 jps 检查进程:
主节点应有 NameNode、ResourceManager;从节点应有 DataNode、NodeManager
- 访问与验证
- NameNode UI:http://hadoop-master:9870(查看 Live Nodes 是否为 2)
- YARN UI:http://hadoop-master:8088
六 常见问题与排错要点
- SSH 免密失败:检查 ~/.ssh 目录权限为 700、authorized_keys 为 600;确认 hadoop 用户在各节点 UID/GID 一致或正确授权。
- 端口访问不通:确认 firewalld/SELinux 已关闭;桥接/NAT 下使用主机 IP访问;必要时在宿主机做端口转发(如 9870/8088)。
- DataNode 未注册:检查 workers/slaves 配置、各节点 dfs.datanode.data.dir 路径权限、以及 /etc/hosts 一致性。
- 格式化异常:多次格式化会导致 ClusterID 不一致,删除 data/namenode/current/VERSION 后重跑格式化,或统一 dfs.namenode.name.dir 数据目录再启动。
- Java/Hadoop 路径错误:核对 hadoop-env.sh 的 JAVA_HOME 与 HADOOP_HOME,以及环境变量是否生效(echo $JAVA_HOME、$HADOOP_HOME)。