1. Hadoop完全分布式环境搭建概述
第一次接触Hadoop完全分布式环境搭建时,我被各种配置文件和服务启动顺序搞得晕头转向。经过多次实践后,我发现只要掌握几个关键点,零基础也能顺利完成搭建。完全分布式模式是Hadoop在生产环境中的标准部署方式,它将各个服务分散在不同的物理节点上运行,真正实现了存储和计算的分布式处理。
与伪分布式模式不同,完全分布式需要至少3台服务器(建议5台起步),分别部署NameNode、DataNode、ResourceManager、NodeManager等核心组件。这种架构不仅能充分发挥Hadoop的分布式计算能力,还能提供高可用性和容错机制。对于初学者来说,搭建过程可能会遇到各种"坑",比如主机名解析失败、SSH免密配置错误、防火墙端口未开放等。
2. 环境准备与规划
2.1 硬件配置建议
我建议使用至少3台配置相同的服务器(物理机或虚拟机均可),每台建议配置:
- 4核CPU及以上
- 8GB内存及以上(DataNode建议16GB)
- 100GB磁盘空间(DataNode建议1TB以上)
- 千兆网络互联
在实际生产环境中,NameNode和ResourceManager最好部署在不同的物理节点上,避免单点故障。我的测试环境使用了5台CentOS 7虚拟机,配置如下:
- master: NameNode + ResourceManager
- slave1: DataNode + NodeManager
- slave2: DataNode + NodeManager
- slave3: DataNode + NodeManager
- slave4: SecondaryNameNode
2.2 软件版本选择
经过多次测试,我推荐以下稳定版本组合:
- JDK 1.8(必须使用Oracle JDK,OpenJDK可能会有兼容性问题)
- Hadoop 3.2.2(较新且稳定的版本)
- SSH服务(所有节点都需要安装)
注意:Hadoop 3.x与2.x在配置上有部分差异,初学者建议先学习3.x版本,避免后续升级带来的兼容性问题。
2.3 系统基础配置
在所有节点上执行以下操作:
- 设置主机名并配置hosts文件:
bash复制# 以master节点为例
hostnamectl set-hostname master
echo "192.168.1.101 master" >> /etc/hosts
echo "192.168.1.102 slave1" >> /etc/hosts
echo "192.168.1.103 slave2" >> /etc/hosts
echo "192.168.1.104 slave3" >> /etc/hosts
echo "192.168.1.105 slave4" >> /etc/hosts
- 关闭防火墙和SELinux(生产环境需谨慎):
bash复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
- 安装必要工具:
bash复制yum install -y vim wget net-tools epel-release
3. Hadoop安装与配置
3.1 JDK安装与配置
在所有节点上安装JDK:
bash复制# 下载JDK(需要Oracle账号)
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-linux-x64.tar.gz
# 解压并配置环境变量
tar -zxvf jdk-8u291-linux-x64.tar.gz -C /usr/local/
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_291' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
验证安装:
bash复制java -version
# 应显示类似:java version "1.8.0_291"
3.2 Hadoop安装
在master节点操作:
bash复制wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
tar -zxvf hadoop-3.2.2.tar.gz -C /usr/local/
mv /usr/local/hadoop-3.2.2 /usr/local/hadoop
配置环境变量:
bash复制echo 'export HADOOP_HOME=/usr/local/hadoop' >> /etc/profile
echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH' >> /etc/profile
source /etc/profile
3.3 SSH免密登录配置
Hadoop集群管理需要master节点能无密码访问所有slave节点:
- 在所有节点生成密钥:
bash复制ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
- 在master节点合并公钥:
bash复制cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
- 将master的公钥分发到所有slave节点:
bash复制for i in {1..4}; do
ssh-copy-id -i ~/.ssh/id_rsa.pub slave$i
done
- 测试免密登录:
bash复制ssh slave1 # 应该可以直接登录,无需密码
4. Hadoop核心配置文件修改
4.1 基础配置文件
进入Hadoop配置目录:
bash复制cd /usr/local/hadoop/etc/hadoop
- 修改hadoop-env.sh:
bash复制echo 'export JAVA_HOME=/usr/local/jdk1.8.0_291' >> hadoop-env.sh
- 修改core-site.xml:
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
</configuration>
- 修改hdfs-site.xml:
xml复制<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>slave4:50090</value>
</property>
</configuration>
4.2 YARN相关配置
- 修改mapred-site.xml:
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:
xml复制<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</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,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
4.3 节点配置文件
- 修改workers文件(Hadoop 3.x之前是slaves文件):
bash复制echo "slave1" > workers
echo "slave2" >> workers
echo "slave3" >> workers
- 创建数据目录:
bash复制mkdir -p /data/hadoop/{tmp,hdfs/{name,data}}
chmod -R 755 /data/hadoop
5. 集群部署与启动
5.1 分发Hadoop到所有节点
在master节点执行:
bash复制for i in {1..4}; do
rsync -av /usr/local/hadoop slave$i:/usr/local/
rsync -av /etc/profile slave$i:/etc/
ssh slave$i "source /etc/profile"
done
5.2 格式化HDFS
仅在第一次启动时执行:
bash复制hdfs namenode -format
警告:格式化操作会清除所有HDFS数据,生产环境慎用!
5.3 启动Hadoop集群
- 启动HDFS:
bash复制start-dfs.sh
- 启动YARN:
bash复制start-yarn.sh
- 检查进程:
bash复制jps
# master节点应有:NameNode、ResourceManager
# slave节点应有:DataNode、NodeManager
# slave4节点应有:SecondaryNameNode
5.4 验证集群状态
- 检查HDFS:
bash复制hdfs dfsadmin -report
- 检查YARN:
bash复制yarn node -list
- 访问Web UI:
- HDFS: http://master:9870
- YARN: http://master:8088
6. 常见问题与解决方案
6.1 SSH连接问题
问题现象:启动时提示"Permission denied (publickey,gssapi-keyex,gssapi-with-mic)"
解决方案:
- 检查/etc/ssh/sshd_config配置:
bash复制PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
- 重启SSH服务:
bash复制systemctl restart sshd
6.2 DataNode无法启动
问题现象:DataNode进程启动后立即退出
可能原因:集群ID不一致(通常在多次格式化后发生)
解决方案:
- 比较master和slave节点上的VERSION文件:
bash复制cat /data/hadoop/hdfs/name/current/VERSION
cat /data/hadoop/hdfs/data/current/VERSION
- 手动修改为相同clusterID
6.3 端口冲突问题
问题现象:服务启动失败,提示端口被占用
解决方案:
- 查看端口占用:
bash复制netstat -tunlp | grep <port>
- 修改hadoop配置文件中的端口号或释放被占用的端口
7. 性能优化建议
7.1 内存配置调整
根据服务器实际内存调整以下参数(在yarn-site.xml中):
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value> <!-- 8GB -->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>2048</value> <!-- 2GB -->
</property>
7.2 HDFS块大小设置
根据实际需求调整hdfs-site.xml中的块大小:
xml复制<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
7.3 数据磁盘选择
对于DataNode,建议:
- 使用多块磁盘,配置多个存储目录
- 在hdfs-site.xml中添加:
xml复制<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/hadoop/hdfs/data,/data2/hadoop/hdfs/data</value>
</property>
8. 集群测试与验证
8.1 HDFS测试
- 创建测试目录:
bash复制hdfs dfs -mkdir -p /test/input
- 上传本地文件:
bash复制hdfs dfs -put /etc/hosts /test/input
- 查看文件:
bash复制hdfs dfs -ls /test/input
8.2 MapReduce测试
运行Hadoop自带的wordcount示例:
bash复制hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /test/input /test/output
查看结果:
bash复制hdfs dfs -cat /test/output/part-r-00000
8.3 YARN测试
提交一个简单的YARN应用:
bash复制yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar sleep -m 1 -r 1 -mt 1000
检查YARN Web UI中的任务状态。
9. 日常维护与管理
9.1 启动/停止集群
- 完整启动:
bash复制start-dfs.sh
start-yarn.sh
- 完整停止:
bash复制stop-yarn.sh
stop-dfs.sh
- 单独启动/停止组件:
bash复制hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
yarn-daemon.sh start|stop resourcemanager|nodemanager
9.2 日志查看
各组件日志位置:
- NameNode: $HADOOP_HOME/logs/hadoop--namenode-.log
- DataNode: $HADOOP_HOME/logs/hadoop--datanode-.log
- ResourceManager: $HADOOP_HOME/logs/yarn--resourcemanager-.log
- NodeManager: $HADOOP_HOME/logs/yarn--nodemanager-.log
9.3 添加新节点
- 在新节点上完成基础环境配置
- 将新节点主机名加入workers文件
- 同步Hadoop配置到新节点
- 启动新节点的DataNode和NodeManager:
bash复制hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager
- 刷新集群节点列表:
bash复制hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
10. 安全注意事项
10.1 权限控制
- 设置HDFS目录权限:
bash复制hdfs dfs -chmod -R 750 /user
- 配置YARN队列ACL:
xml复制<property>
<name>yarn.scheduler.capacity.root.acl_submit_applications</name>
<value>user1,user2</value>
</property>
10.2 备份策略
- NameNode元数据备份:
bash复制hdfs dfsadmin -fetchImage /backup/nn_image
- 定期检查点:
xml复制<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value> <!-- 1小时 -->
</property>
10.3 监控建议
- 监控关键指标:
- HDFS存储使用率
- DataNode存活状态
- YARN资源使用率
- 任务失败率
- 配置告警阈值:
- DataNode宕机超过10%
- HDFS使用率超过85%
- 任务失败率超过5%
11. 集群扩展与升级
11.1 水平扩展
- 增加DataNode:
- 按照"添加新节点"流程操作
- 调整dfs.replication参数(如果需要)
- 增加NodeManager:
- 按照"添加新节点"流程操作
- 调整yarn.nodemanager.resource.memory-mb参数
11.2 垂直扩展
- 升级服务器硬件:
- 增加内存
- 增加CPU核心数
- 增加磁盘空间
- 调整配置参数:
- 增加YARN容器内存分配
- 调整MapReduce任务并行度
11.3 版本升级
- 滚动升级步骤:
- 备份配置和数据
- 升级SecondaryNameNode
- 升级DataNode(逐个节点)
- 升级NodeManager(逐个节点)
- 最后升级NameNode和ResourceManager
- 升级后验证:
- 检查所有服务状态
- 运行测试作业
- 验证数据完整性
12. 实际应用建议
12.1 小规模集群优化
对于10节点以下的小集群:
- 可以合并NameNode和ResourceManager
- 适当降低dfs.replication(从3降到2)
- 调整YARN内存分配更激进
12.2 教学环境配置
在教学环境中:
- 可以使用更低的硬件配置
- 设置更短的超时时间
- 启用详细的调试日志
12.3 生产环境建议
在生产环境中:
- 必须配置HA(高可用)
- 建议使用专用硬件
- 设置完善的监控和告警
- 定期进行备份和灾难恢复演练
13. 学习资源推荐
13.1 官方文档
- Hadoop官方文档:
- https://hadoop.apache.org/docs/stable/
- 配置参数详解:
- https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
- https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
13.2 进阶学习
- 性能调优:
- 《Hadoop权威指南》相关章节
- Cloudera性能调优白皮书
- 安全配置:
- Kerberos集成指南
- Ranger权限管理
13.3 社区资源
- 问题解决:
- Stack Overflow的Hadoop标签
- Hadoop官方邮件列表
- 最新动态:
- Hadoop官方博客
- 各大厂商的技术博客(Cloudera、Hortonworks等)
14. 个人经验分享
在实际搭建过程中,我总结了几个关键点:
-
配置文件一致性:所有节点的配置文件必须完全一致,特别是hdfs-site.xml和yarn-site.xml。我遇到过因为一个节点的配置不同导致整个集群行为异常的情况。
-
磁盘空间监控:DataNode磁盘写满会导致整个集群不可用。建议设置监控,当磁盘使用超过80%时发出告警。
-
日志分析技巧:遇到问题时,先看对应组件的日志文件。Hadoop的日志通常很详细,90%的问题都能通过日志找到原因。
-
小规模测试:在正式运行生产任务前,先用小数据量测试集群的各项功能。我曾经直接运行大型任务,结果因为配置不当导致任务失败,浪费了大量时间。
-
版本控制:记录每次配置变更和版本升级的详细信息。当出现问题需要回退时,这些记录会非常有用。
最后,Hadoop集群管理是一个需要不断实践和积累经验的过程。刚开始可能会遇到各种问题,但随着经验的增长,你会逐渐掌握其中的规律和技巧。