以下是针对三台主机(data1
、data2
、data3
)的Hadoop 3.2.4完全分布式集群配置步骤,其中data1
作为NameNode和ResourceManager,其他节点作为DataNode和NodeManager:
1. 环境准备(所有节点执行)
- 主机名与IP映射:确保所有节点的
/etc/hosts
文件中包含以下内容(根据实际IP修改):192.168.1.101 data1 192.168.1.102 data2 192.168.1.103 data3
- SSH免密登录:在
data1
上生成密钥并分发到所有节点(包括自身):ssh-keygen -t rsa ssh-copy-id data1 ssh-copy-id data2 ssh-copy-id data3
- 安装Java:所有节点安装JDK 8+并配置
JAVA_HOME
。
2. 下载并解压Hadoop(所有节点执行)
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.2.4/hadoop-3.2.4.tar.gz
tar -xzvf hadoop-3.2.4.tar.gz
sudo mv hadoop-3.2.4 /usr/local/hadoop
3. 配置环境变量(所有节点执行)
编辑 ~/.bashrc
:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # 根据实际路径修改
使配置生效:
source ~/.bashrc
4. Hadoop配置文件(在data1上配置)
核心配置
-
core-site.xml
(所有节点):<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://data1:9000</value> <!-- NameNode地址 --> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> <!-- 临时目录 --> </property> </configuration>
-
hdfs-site.xml
(所有节点):<configuration> <property> <name>dfs.replication</name> <value>3</value> <!-- 副本数(与DataNode数量一致) --> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/hdfs/namenode</value> <!-- NameNode数据目录 --> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/hdfs/datanode</value> <!-- DataNode数据目录 --> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>data1:9868</value> <!-- SecondaryNameNode地址 --> </property> </configuration>
YARN与MapReduce配置
-
mapred-site.xml
(所有节点):<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> </configuration>
-
yarn-site.xml
(所有节点):<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>data1</value> <!-- ResourceManager在data1 --> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> <!-- 启用日志聚合 --> </property> </configuration>
Workers文件(在data1上配置)
编辑 $HADOOP_HOME/etc/hadoop/workers
,添加DataNode节点:
data1
data2
data3
5. 创建目录并设置权限(所有节点执行)
mkdir -p /usr/local/hadoop/{tmp,hdfs/{namenode,datanode}}
chmod -R 755 /usr/local/hadoop
6. 分发Hadoop目录
# 使用scp递归分发Hadoop目录到其他节点
sudo scp -r /usr/local/hadoop data2:/usr/local/
sudo scp -r /usr/local/hadoop data3:/usr/local/
7. 格式化HDFS(仅在data1执行)
hdfs namenode -format
8. 启动集群(仅在data1执行)
start-dfs.sh # 启动HDFS
start-yarn.sh # 启动YARN
验证进程:
# data1应有:NameNode、SecondaryNameNode、ResourceManager
jps
# data2和data3应有:DataNode、NodeManager
ssh data2 jps
ssh data3 jps
9. 访问Web界面
- HDFS NameNode:
http://data1:9870
- YARN ResourceManager:
http://data1:8088
10. 测试分布式任务
hdfs dfs -mkdir /input
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.4.jar wordcount /input /output
hdfs dfs -cat /output/*
关键注意事项
- 配置同步:所有节点的配置文件必须完全一致(可通过
scp
同步)。 - 防火墙:确保节点间以下端口开放:
- HDFS: 9000(RPC)、9870(Web)、9868(SecondaryNameNode)
- YARN: 8088(Web)、8032(ResourceManager)、8042(NodeManager)
在Hadoop集群部署中,测试环境关闭防火墙方法。
(1)停止并禁用firewalld服务
# 停止防火墙
sudo systemctl stop firewalld
# 禁止开机启动
sudo systemctl disable firewalld
# 验证状态(应显示 inactive)
sudo systemctl status firewalld
(2)清除防火墙规则(可选)
sudo firewall-cmd --permanent --remove-service=ssh # 示例:删除SSH规则
sudo firewall-cmd --reload
(3)验证防火墙已关闭
# 通用检查命令
sudo iptables -L -n # 若无规则或全ACCEPT,则已关闭
# 检查firewalld/ufw状态
sudo systemctl is-active firewalld # CentOS
sudo ufw status # Ubuntu
(4)开放Hadoop必要端口(生产环境替代方案)
如果需保留防火墙,需开放以下端口:
服务 | 端口 |
---|---|
HDFS | 8020, 9000, 9870 |
DataNode | 9866, 9867, 9864 |
YARN | 8030-8033, 8088 |
MapReduce | 19888 |
SSH | 22 |
示例:CentOS开放端口
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9870/tcp
sudo firewall-cmd --reload
批量操作脚本(适用于集群)
创建脚本 disable-firewall.sh
:
#!/bin/bash
NODES=("data1" "data2" "data3")
for node in ${NODES[@]}; do
echo "处理节点: $node"
ssh $node "sudo systemctl stop firewalld; sudo systemctl disable firewalld"
done
- 日志排查:查看日志目录
$HADOOP_HOME/logs
定位问题。 - 高可用(可选):如需NameNode高可用,需配置ZooKeeper和JournalNode。