CentOS 7.5 部署 Hadoop 3.2.4 集群(三节点)
集群规划
节点角色 | 主机名 | IP 地址 | 运行服务 |
---|---|---|---|
Master | hadoop1 | 192.168.16.219 | NameNode, ResourceManager |
Slave1 | hadoop2 | 192.168.16.67 | DataNode, NodeManager |
Slave2 | hadoop3 | 192.168.16.249 | DataNode, NodeManager |
Secondary | hadoop1 | 192.168.16.219 | SecondaryNameNode, HistoryServer |
环境准备(所有节点)
1. 系统设置
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 禁用 SELinux
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 配置主机名解析
sudo tee -a /etc/hosts << EOF
192.168.16.219 hadoop1
192.168.16.67 hadoop2
192.168.16.249 hadoop3
EOF
# 设置主机名(分别在各节点执行)
# hadoop1
sudo hostnamectl set-hostname hadoop1
# hadoop2
sudo hostnamectl set-hostname hadoop2
# hadoop3
sudo hostnamectl set-hostname hadoop3
2. 安装依赖
sudo yum install -y epel-release
sudo yum install -y wget vim net-tools openssl openssh-server openssh-clients
3. 配置SSH免密登录(在 master 节点执行)
# 生成密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 分发公钥到所有节点
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
# 测试免密登录
ssh hadoop2 date
ssh hadoop3 date
4. 安装Java环境(所有节点)
# 下载JDK
wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
# 安装JDK
sudo tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz -C /usr/local/
sudo ln -s /usr/local/jdk-11.0.1 /usr/local/java
# 配置环境变量
sudo tee /etc/profile.d/java.sh << 'EOF'
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile
Hadoop 安装与配置(在 master 节点操作)
1. 下载并解压 Hadoop
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.2.4/hadoop-3.2.4.tar.gz
tar -zxvf hadoop-3.2.4.tar.gz -C /usr/local/
sudo ln -s /usr/local/hadoop-3.2.4 /usr/local/hadoop
2. 配置环境变量
sudo tee /etc/profile.d/hadoop.sh << 'EOF'
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF
source /etc/profile
3. 配置 Hadoop 核心文件
hadoop-env.sh
sudo tee $HADOOP_CONF_DIR/hadoop-env.sh << 'EOF'
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
EOF
core-site.xml
sudo tee $HADOOP_CONF_DIR/core-site.xml << 'EOF'
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
EOF
hdfs-site.xml
sudo tee $HADOOP_CONF_DIR/hdfs-site.xml << 'EOF'
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9868</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
EOF
mapred-site.xml
sudo tee $HADOOP_CONF_DIR/mapred-site.xml << 'EOF'
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*</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>
EOF
yarn-site.xml
sudo tee $HADOOP_CONF_DIR/yarn-site.xml << 'EOF'
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop1:19888/jobhistory/logs</value>
</property>
</configuration>
EOF
workers
sudo tee $HADOOP_CONF_DIR/workers << 'EOF'
hadoop2
hadoop3
EOF
4. 创建数据目录(所有节点)
sudo mkdir -p /data/hadoop/{tmp,namenode,datanode}
sudo chown -R root:root /data/hadoop
sudo chmod -R 755 /data/hadoop
分发 Hadoop 到所有节点
# 从 master 节点分发到其他节点
scp -r /usr/local/hadoop-3.2.4 root@hadoop2:/usr/local/
scp -r /usr/local/hadoop-3.2.4 root@hadoop3:/usr/local/
# 在所有节点创建符号链接
ssh hadoop2 "ln -s /usr/local/hadoop-3.2.4 /usr/local/hadoop"
ssh hadoop3 "ln -s /usr/local/hadoop-3.2.4 /usr/local/hadoop"
# 分发环境变量配置
scp /etc/profile.d/hadoop.sh root@hadoop2:/etc/profile.d/
scp /etc/profile.d/hadoop.sh root@hadoop3:/etc/profile.d/
# 在所有节点应用环境变量
source /etc/profile
启动 Hadoop 集群(在 master 节点操作)
1. 格式化 HDFS
hdfs namenode -format
2. 启动 HDFS
start-dfs.sh
3. 启动 YARN
start-yarn.sh
4. 启动历史服务器
mapred --daemon start historyserver
验证集群状态
1. 检查进程
# master 节点
jps
# 应包含:NameNode, ResourceManager, SecondaryNameNode, JobHistoryServer
# slave 节点
jps
# 应包含:DataNode, NodeManager
2. 检查 HDFS 状态
hdfs dfsadmin -report
3. 检查 YARN 状态
yarn node -list
4. Web UI 访问
服务 | URL |
---|---|
HDFS NameNode | http://192.168.16.219:9870 |
YARN ResourceManager | http://192.168.16.219:8088 |
JobHistory | http://192.168.16.219:19888 |
运行测试作业
# 创建测试目录
hdfs dfs -mkdir /input
# 上传测试文件
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input
# 运行 WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.4.jar wordcount /input /output
# 查看结果
hdfs dfs -cat /output/*
集群管理命令
常用命令
# 启动集群
start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
# 停止集群
mapred --daemon stop historyserver
stop-yarn.sh
stop-dfs.sh
# 安全模式操作
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 退出安全模式
hdfs dfsadmin -safemode get # 查看安全模式状态
节点管理
# 添加新节点
# 1. 在新节点完成环境准备
# 2. 添加新节点到 workers 文件
# 3. 刷新节点列表
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
# 退役节点
# 1. 创建退役文件
echo "hadoop3" > $HADOOP_CONF_DIR/excludes
# 2. 刷新节点
hdfs dfsadmin -refreshNodes
# 3. 等待数据迁移完成
# 4. 停止该节点服务
故障排查
常见问题解决
端口冲突 :
netstat -tunlp | grep <端口号> kill -9 <PID>
权限问题 :
sudo chown -R root:root /data/hadoop sudo chmod -R 755 /data/hadoop
日志分析 :
# NameNode 日志 tail -f $HADOOP_HOME/logs/hadoop-root-namenode-hadoop1.log # DataNode 日志 tail -f $HADOOP_HOME/logs/hadoop-root-datanode-hadoop2.log # ResourceManager 日志 tail -f $HADOOP_HOME/logs/hadoop-root-resourcemanager-hadoop1.log
重新格式化 :
# 停止所有服务 stop-yarn.sh stop-dfs.sh # 删除数据目录 rm -rf /data/hadoop/* # 重新格式化 hdfs namenode -format
安全加固建议
- 启用 Kerberos 认证
- 配置 HDFS 权限
- 使用专用 Hadoop 用户
- 配置防火墙规则
- 启用 HTTPS 访问
提示:生产环境建议使用 Ambari 或 Cloudera Manager 进行集群管理,简化部署和维护流程。