Hadoop 3.x完全分布式集群搭建与配置实战指南
1. 项目概述
"赫兹威客完全分布式Hadoop测试教程"这个标题背后,实际上是一个面向大数据开发初学者的实战指南。作为一名经历过无数次Hadoop集群搭建的老手,我深知完全分布式环境配置过程中的各种"坑"。本文将带你从零开始,手把手搭建一个真正可用的Hadoop 3.x完全分布式集群,涵盖HDFS和YARN的核心配置要点。
完全分布式与伪分布式最大的区别在于:所有服务都运行在不同的物理节点上,更接近生产环境。这对于想要真正掌握Hadoop集群管理的人来说是必经之路。我们将使用3台Ubuntu服务器作为实验环境(1个NameNode + 2个DataNode),这种配置既能体现分布式特性,又不会对硬件资源要求过高。
2. 环境准备与基础配置
2.1 硬件与系统要求
建议使用以下配置(最低要求):
- 3台Ubuntu 20.04 LTS服务器(或虚拟机)
- 每台至少2核CPU/4GB内存/20GB存储
- 所有节点在同一局域网内,互相能ping通
- 关闭所有节点的防火墙(生产环境需单独配置安全组)
注意:虚拟机环境下务必确保所有节点的时钟同步,否则可能导致HDFS异常。建议安装ntp服务:
sudo apt update && sudo apt install -y ntp2.2 系统级前置配置
在所有节点上执行以下操作:
- 修改主机名并配置hosts文件:
# 在NameNode上 sudo hostnamectl set-hostname namenode # 在DataNode1上 sudo hostnamectl set-hostname datanode1 # 在DataNode2上 sudo hostnamectl set-hostname datanode2- 编辑/etc/hosts(所有节点相同配置):
192.168.1.100 namenode 192.168.1.101 datanode1 192.168.1.102 datanode2- 配置SSH免密登录(NameNode到所有DataNode):
# 在NameNode上生成密钥 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 将公钥拷贝到各节点(包括自己) ssh-copy-id namenode ssh-copy-id datanode1 ssh-copy-id datanode23. Hadoop安装与配置
3.1 软件包准备
建议使用国内镜像下载Hadoop(官方源速度较慢):
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz tar -xzvf hadoop-3.3.4.tar.gz -C /opt/ mv /opt/hadoop-3.3.4 /opt/hadoop3.2 核心配置文件修改
需要配置以下5个关键文件(路径:/opt/hadoop/etc/hadoop/):
- hadoop-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 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"- core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://namenode:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/tmp</value> </property> </configuration>- hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/hadoop/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/hadoop/hdfs/datanode</value> </property> </configuration>- yarn-site.xml:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>namenode</value> </property> </configuration>- mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>3.3 节点角色分配
在workers文件中指定DataNode节点:
datanode1 datanode24. 集群启动与验证
4.1 格式化HDFS
仅在首次启动时执行(在NameNode上):
hdfs namenode -format4.2 启动集群
- 启动HDFS:
start-dfs.sh- 启动YARN:
start-yarn.sh4.3 服务验证
- 检查进程是否正常:
# NameNode上应有: # NameNode # ResourceManager # DataNode上应有: # DataNode # NodeManager- 访问Web UI:
- HDFS: http://namenode:9870
- YARN: http://namenode:8088
- 运行测试作业:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 10 1005. 常见问题排查
5.1 SSH连接问题
症状:启动时提示"Permission denied" 解决:
# 检查authorized_keys权限 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh # 检查sshd配置 sudo vi /etc/ssh/sshd_config # 确保有以下配置: PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys5.2 端口冲突
症状:服务启动失败,日志显示端口被占用 解决:
# 查找占用端口的进程 netstat -tulnp | grep 9000 # 修改hadoop配置中使用其他端口5.3 磁盘空间不足
症状:DataNode启动后自动关闭 解决:
# 检查磁盘空间 df -h # 修改hdfs-site.xml中的存储路径 <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/datanode</value> </property>6. 性能调优建议
6.1 内存配置调整
根据服务器实际内存修改yarn-site.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>6.2 HDFS块大小优化
根据业务需求调整hdfs-site.xml:
<property> <name>dfs.blocksize</name> <value>268435456</value> <!-- 256MB --> </property>6.3 压缩配置
提高MapReduce效率,在core-site.xml中添加:
<property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec</value> </property>7. 安全增强措施
7.1 简单认证配置
在core-site.xml中添加:
<property> <name>hadoop.http.filter.initializers</name> <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value> </property> <property> <name>hadoop.http.authentication.type</name> <value>simple</value> </property>7.2 用户权限管理
- 创建专用Hadoop用户:
sudo useradd hadoopuser sudo passwd hadoopuser- 修改目录权限:
sudo chown -R hadoopuser:hadoopgroup /opt/hadoop8. 集群维护操作
8.1 安全重启步骤
- 停止YARN:
stop-yarn.sh- 停止HDFS:
stop-dfs.sh- 按需更新配置后,按4.2节步骤重新启动
8.2 添加新节点
- 在新节点上重复2.2和3.1-3.2节配置
- 将新节点主机名加入workers文件
- 刷新节点列表:
hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes8.3 监控与日志
关键日志路径:
- NameNode: /opt/hadoop/logs/hadoop--namenode-.log
- DataNode: /opt/hadoop/logs/hadoop--datanode-.log
- ResourceManager: /opt/hadoop/logs/yarn--resourcemanager-.log
使用以下命令监控集群状态:
hdfs dfsadmin -report yarn node -list9. 生产环境建议
经过测试环境验证后,如需部署到生产环境,建议考虑:
- 高可用方案:配置ZooKeeper实现NameNode HA
- 数据备份:定期对NameNode元数据进行备份
- 监控告警:集成Prometheus+Grafana监控集群指标
- 资源隔离:使用cgroups或Docker容器隔离资源
- 滚动升级:制定详细的升级和回滚方案
我在实际运维中发现,完全分布式集群的稳定性很大程度上取决于网络质量。建议生产环境使用万兆网络,并配置网络冗余。另外,定期检查磁盘健康状态,HDFS对磁盘故障非常敏感。