1. Hadoop环境搭建概述
Hadoop作为Apache基金会旗下的开源分布式计算框架,已经成为大数据处理领域的事实标准。它通过HDFS实现海量数据存储,借助MapReduce/YARN完成分布式计算任务调度,让普通服务器集群能够处理PB级数据。对于想要入门大数据开发的工程师来说,搭建Hadoop环境是必须掌握的技能。
在实际工作中,Hadoop环境搭建主要分为三种模式:
- 本地模式(Local Mode):单机调试使用,不启动任何守护进程
- 伪分布式模式(Pseudo-Distributed Mode):单机模拟多节点环境
- 完全分布式模式(Fully Distributed Mode):生产环境多节点集群
本文将重点演示伪分布式环境的搭建过程,这种模式既具备分布式特性验证能力,又不需要准备多台物理机器,非常适合开发测试和学习使用。我们选择的版本是当前稳定的Hadoop 3.3.4,运行在Ubuntu 20.04 LTS系统上。
提示:伪分布式模式会启动所有Hadoop进程(NameNode、DataNode、ResourceManager等),但这些进程都运行在同一台机器上,通过不同端口区分服务。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件
2.1 硬件配置建议
虽然伪分布式环境可以在配置较低的机器上运行,但为了保证良好的体验,建议满足以下配置:
- CPU:4核及以上(需要支持虚拟化)
- 内存:8GB及以上(Hadoop进程较吃内存)
- 磁盘:50GB可用空间(用于HDFS存储)
- 网络:千兆网卡(本地回环即可)
2.2 软件依赖安装
在Ubuntu系统上需要先安装必要的支持软件:
bash复制# 更新软件包索引
sudo apt-get update
# 安装JDK(Hadoop基于Java开发)
sudo apt-get install -y openjdk-8-jdk
# 安装SSH服务(集群节点间通信)
sudo apt-get install -y openssh-server
# 配置SSH免密登录
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
# 验证SSH连接
ssh localhost
注意:Hadoop 3.x版本对Java版本有严格要求,必须使用Java 8。更高版本的Java可能会导致兼容性问题。
2.3 系统参数调优
为了保证Hadoop稳定运行,需要调整一些Linux系统参数:
bash复制# 编辑limits.conf文件
sudo nano /etc/security/limits.conf
# 在文件末尾添加以下内容
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# 编辑sysctl.conf文件
sudo nano /etc/sysctl.conf
# 添加或修改以下参数
vm.swappiness = 10
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# 使配置生效
sudo sysctl -p
3. Hadoop安装与配置
3.1 下载与解压
从Apache官网获取Hadoop二进制包:
bash复制# 下载Hadoop 3.3.4
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
# 解压到/usr/local目录
sudo tar -xzvf hadoop-3.3.4.tar.gz -C /usr/local
# 创建软链接便于版本管理
sudo ln -s /usr/local/hadoop-3.3.4 /usr/local/hadoop
# 设置环境变量
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
source ~/.bashrc
3.2 核心配置文件修改
Hadoop的配置文件位于$HADOOP_HOME/etc/hadoop目录下,伪分布式模式需要修改以下文件:
- hadoop-env.sh - 设置Java环境变量
bash复制echo "export JAVA_HOME=$(readlink -f /usr/bin/java | sed 's:bin/java::')" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- core-site.xml - 核心参数配置
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
</property>
</configuration>
- hdfs-site.xml - HDFS相关配置
xml复制<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
</configuration>
- mapred-site.xml - MapReduce配置
xml复制<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- yarn-site.xml - YARN资源管理配置
xml复制<configuration>
<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. 启动与验证
4.1 格式化HDFS
首次启动前需要格式化NameNode:
bash复制hdfs namenode -format
警告:格式化操作会清除所有HDFS数据,生产环境慎用!仅在首次启动或需要完全重置时执行。
4.2 启动Hadoop服务
使用以下脚本启动所有服务:
bash复制# 启动HDFS
start-dfs.sh
# 启动YARN
start-yarn.sh
# 验证进程
jps
正常运行的进程列表应包含:
- NameNode
- DataNode
- SecondaryNameNode
- ResourceManager
- NodeManager
4.3 Web UI访问
Hadoop提供了丰富的Web监控界面:
| 服务 | 访问地址 | 默认端口 |
|---|---|---|
| NameNode | http://localhost:9870 | 9870 |
| DataNode | http://localhost:9864 | 9864 |
| YARN | http://localhost:8088 | 8088 |
| JobHistory | http://localhost:19888 | 19888 |
4.4 运行测试作业
验证MapReduce功能是否正常:
bash复制# 在HDFS上创建输入目录
hdfs dfs -mkdir -p /user/$USER/input
# 上传测试文件
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/$USER/input
# 运行WordCount示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /user/$USER/input /user/$USER/output
# 查看结果
hdfs dfs -cat /user/$USER/output/part-r-00000
5. 常见问题与解决方案
5.1 SSH连接问题
症状:执行start-dfs.sh时提示"localhost: Permission denied"
解决方案:
- 确保已生成SSH密钥并添加到authorized_keys
- 检查~/.ssh目录权限应为700
- authorized_keys文件权限应为600
- 测试ssh localhost能否免密登录
5.2 端口冲突
症状:某些服务启动失败,日志显示端口被占用
解决方案:
- 使用
netstat -tulnp | grep <端口号>查找占用进程 - 修改hdfs-site.xml或yarn-site.xml中的相关端口配置
- 或者停止占用端口的其他服务
5.3 内存不足
症状:NodeManager或DataNode频繁崩溃
解决方案:
- 修改yarn-site.xml中的内存配置:
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
- 或者增加物理内存
5.4 文件权限问题
症状:操作HDFS时提示"Permission denied"
解决方案:
- 临时方案:在hdfs-site.xml中添加
xml复制<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
- 生产环境应配置正确的用户和组权限
6. 进阶配置与优化
6.1 日志配置调整
默认日志级别可能过于详细,可以修改$HADOOP_HOME/etc/hadoop/log4j.properties:
properties复制# 调整NameNode日志级别
log4j.logger.org.apache.hadoop.hdfs.server.namenode=WARN
# 减少DataNode日志输出
log4j.logger.org.apache.hadoop.hdfs.server.datanode=INFO
6.2 YARN资源调优
根据机器配置调整YARN参数:
xml复制<!-- yarn-site.xml -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
6.3 HDFS块大小调整
根据数据特点修改HDFS块大小(默认128MB):
xml复制<!-- hdfs-site.xml -->
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
6.4 开启压缩提升性能
配置MapReduce中间结果压缩:
xml复制<!-- mapred-site.xml -->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
7. 环境维护与监控
7.1 日常维护命令
| 操作 | 命令 |
|---|---|
| 停止所有服务 | stop-all.sh |
| 单独停止HDFS | stop-dfs.sh |
| 单独停止YARN | stop-yarn.sh |
| 查看HDFS状态 | hdfs dfsadmin -report |
| 检查HDFS健康状态 | hdfs fsck / |
| 查看YARN节点 | yarn node -list |
7.2 监控指标解读
通过Web UI可以监控以下关键指标:
NameNode UI:
- 剩余存储容量
- 活跃/死亡DataNode数量
- 文件系统对象数量
- 块报告延迟
YARN UI:
- 集群资源使用率
- 运行/完成/失败应用数
- 每个应用的资源消耗
- 节点健康状态
7.3 日志文件位置
各组件日志默认存放在$HADOOP_HOME/logs目录:
| 组件 | 日志文件 |
|---|---|
| NameNode | hadoop-$USER-namenode-*.log |
| DataNode | hadoop-$USER-datanode-*.log |
| ResourceManager | yarn-$USER-resourcemanager-*.log |
| NodeManager | yarn-$USER-nodemanager-*.log |
8. 伪分布式转完全分布式
当需要扩展到真实集群时,主要修改点包括:
- 在所有节点上重复安装步骤
- 修改core-site.xml中的fs.defaultFS为集群Master节点
- 配置slaves文件指定所有DataNode节点
- 设置yarn.resourcemanager.hostname指向ResourceManager节点
- 配置集群间SSH免密登录
- 统一所有节点的时间同步(建议使用chrony或ntp)
提示:生产环境建议使用自动化部署工具如Ansible、Puppet来管理集群配置。
