Hadoop 3.x完全分布式集群搭建与配置实战指南

发布时间:2026/10/31 15:51:02
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 ntp

2.2 系统级前置配置

在所有节点上执行以下操作:

  1. 修改主机名并配置hosts文件:
# 在NameNode上 sudo hostnamectl set-hostname namenode # 在DataNode1上 sudo hostnamectl set-hostname datanode1 # 在DataNode2上 sudo hostnamectl set-hostname datanode2
  1. 编辑/etc/hosts(所有节点相同配置):
192.168.1.100 namenode 192.168.1.101 datanode1 192.168.1.102 datanode2
  1. 配置SSH免密登录(NameNode到所有DataNode):
# 在NameNode上生成密钥 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 将公钥拷贝到各节点(包括自己) ssh-copy-id namenode ssh-copy-id datanode1 ssh-copy-id datanode2

3. 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/hadoop

3.2 核心配置文件修改

需要配置以下5个关键文件(路径:/opt/hadoop/etc/hadoop/):

  1. 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"
  1. 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>
  1. 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>
  1. 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>
  1. mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>

3.3 节点角色分配

在workers文件中指定DataNode节点:

datanode1 datanode2

4. 集群启动与验证

4.1 格式化HDFS

仅在首次启动时执行(在NameNode上):

hdfs namenode -format

4.2 启动集群

  1. 启动HDFS:
start-dfs.sh
  1. 启动YARN:
start-yarn.sh

4.3 服务验证

  1. 检查进程是否正常:
# NameNode上应有: # NameNode # ResourceManager # DataNode上应有: # DataNode # NodeManager
  1. 访问Web UI:
  • HDFS: http://namenode:9870
  • YARN: http://namenode:8088
  1. 运行测试作业:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 10 100

5. 常见问题排查

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_keys

5.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 用户权限管理

  1. 创建专用Hadoop用户:
sudo useradd hadoopuser sudo passwd hadoopuser
  1. 修改目录权限:
sudo chown -R hadoopuser:hadoopgroup /opt/hadoop

8. 集群维护操作

8.1 安全重启步骤

  1. 停止YARN:
stop-yarn.sh
  1. 停止HDFS:
stop-dfs.sh
  1. 按需更新配置后,按4.2节步骤重新启动

8.2 添加新节点

  1. 在新节点上重复2.2和3.1-3.2节配置
  2. 将新节点主机名加入workers文件
  3. 刷新节点列表:
hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes

8.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 -list

9. 生产环境建议

经过测试环境验证后,如需部署到生产环境,建议考虑:

  1. 高可用方案:配置ZooKeeper实现NameNode HA
  2. 数据备份:定期对NameNode元数据进行备份
  3. 监控告警:集成Prometheus+Grafana监控集群指标
  4. 资源隔离:使用cgroups或Docker容器隔离资源
  5. 滚动升级:制定详细的升级和回滚方案

我在实际运维中发现,完全分布式集群的稳定性很大程度上取决于网络质量。建议生产环境使用万兆网络,并配置网络冗余。另外,定期检查磁盘健康状态,HDFS对磁盘故障非常敏感。