在开始搭建Hadoop单节点集群之前,我们需要确保系统环境满足基本要求。我建议使用Ubuntu 20.04 LTS或CentOS 8作为操作系统,这两个版本都有较好的社区支持和长期维护。
硬件要求:
软件依赖:
注意:虽然Hadoop支持Java 11,但某些组件可能对Java 8兼容性更好。在生产环境中,建议使用与团队其他系统一致的Java版本。
验证系统环境的命令如下:
bash复制# 检查系统版本
cat /etc/os-release
# 检查Java安装情况
java -version
# 检查SSH服务状态
sudo systemctl status sshd
如果系统缺少这些基础组件,可以通过以下命令安装:
bash复制# Ubuntu系统
sudo apt update && sudo apt install -y openjdk-8-jdk ssh
# CentOS系统
sudo yum install -y java-1.8.0-openjdk-devel openssh-server
虽然可以在root用户下安装Hadoop,但出于安全考虑,我强烈建议创建一个专用用户。这不仅能隔离系统文件,还能模拟真实生产环境中的权限管理。
bash复制# 创建hadoop用户并设置密码
sudo useradd -m hadoop
sudo passwd hadoop
# 将hadoop用户加入sudo组(便于管理)
sudo usermod -aG sudo hadoop
# 切换到hadoop用户
su - hadoop
在实际操作中,我发现为Hadoop用户配置适当的sudo权限可以简化很多管理操作,但要注意不要过度授权。可以通过编辑/etc/sudoers文件来精确控制权限。
Hadoop集群中各节点需要通过SSH通信,配置免密登录可以避免频繁输入密码。这是搭建过程中最容易出问题的环节之一。
bash复制# 安装SSH客户端和服务器
sudo apt install -y openssh-client openssh-server
# 生成RSA密钥对(一路回车使用默认值)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥添加到授权列表
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置正确的权限(关键步骤!)
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 测试SSH连接
ssh localhost
常见问题:如果SSH连接失败,检查/var/log/auth.log日志文件。我遇到过几次权限设置不正确导致的问题,记住.ssh目录权限必须是700,authorized_keys文件权限必须是600。
Hadoop是Java编写的,正确配置JAVA_HOME至关重要。我推荐使用OpenJDK 8,因为它经过了Hadoop社区的广泛测试。
bash复制# 查找Java安装路径
sudo update-alternatives --config java
# 输出类似:
# /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
# 编辑~/.bashrc文件
nano ~/.bashrc
# 添加以下内容(根据实际路径调整)
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
# 使配置生效
source ~/.bashrc
验证Java配置是否正确:
bash复制echo $JAVA_HOME # 应该输出正确的路径
java -version # 应该显示Java 8
我建议从Apache官网下载Hadoop二进制包,而不是通过包管理器安装,这样可以获得最新版本和完全控制权。
bash复制# 下载Hadoop 3.4.3(截至2024年1月的最新稳定版)
wget https://downloads.apache.org/hadoop/common/hadoop-3.4.3/hadoop-3.4.3.tar.gz
# 验证文件完整性(可选但推荐)
wget https://downloads.apache.org/hadoop/common/hadoop-3.4.3/hadoop-3.4.3.tar.gz.sha512
sha512sum -c hadoop-3.4.3.tar.gz.sha512
# 解压到/usr/local目录
sudo tar -xzvf hadoop-3.4.3.tar.gz -C /usr/local
sudo mv /usr/local/hadoop-3.4.3 /usr/local/hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop
Hadoop目录结构说明:
code复制/usr/local/hadoop/
├── bin/ # 可执行命令
├── sbin/ # 管理脚本
├── etc/ # 配置文件
│ └── hadoop/ # Hadoop核心配置
├── lib/ # 库文件
├── logs/ # 日志文件
├── share/ # 文档和示例
└── tmp/ # 临时文件
配置环境变量:
bash复制nano ~/.bashrc
# 添加以下内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
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
# 使配置生效
source ~/.bashrc
Hadoop的配置文件位于$HADOOP_HOME/etc/hadoop目录下,我们需要修改以下几个关键文件:
hadoop-env.sh - 设置Java环境变量
bash复制nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 确保JAVA_HOME设置正确
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
core-site.xml - 核心配置
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</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:///usr/local/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hdfs/datanode</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>128m</value>
</property>
</configuration>
mapred-site.xml - MapReduce配置
xml复制<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>
</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>
在首次启动Hadoop前,需要格式化NameNode:
bash复制# 创建必要的目录
mkdir -p /usr/local/hadoop/hdfs/namenode
mkdir -p /usr/local/hadoop/hdfs/datanode
mkdir -p /usr/local/hadoop/tmp
# 格式化NameNode(仅在第一次执行)
hdfs namenode -format
重要提示:格式化NameNode会清除所有HDFS数据!在生产环境中,这是一个危险操作。在单节点环境中,如果遇到HDFS问题,重新格式化通常是可行的解决方案。
Hadoop提供了方便的脚本来启动和停止服务:
bash复制# 启动HDFS服务
start-dfs.sh
# 启动YARN服务
start-yarn.sh
# 启动历史服务器(用于查看已完成作业)
mapred --daemon start historyserver
验证服务是否正常运行:
bash复制jps
# 应该看到以下进程:
# 1. NameNode
# 2. DataNode
# 3. SecondaryNameNode
# 4. ResourceManager
# 5. NodeManager
# 6. JobHistoryServer
Hadoop提供了丰富的Web界面用于监控和管理:
在本地浏览器中访问这些URL,你应该能看到相应的管理界面。如果无法访问,检查防火墙设置:
bash复制# Ubuntu防火墙设置
sudo ufw allow 9870/tcp
sudo ufw allow 8088/tcp
sudo ufw allow 19888/tcp
验证集群功能是否正常的最简单方法是运行内置的WordCount示例:
bash复制# 在HDFS中创建目录
hdfs dfs -mkdir -p /input
# 创建本地测试文件
echo "Hello World Hello Hadoop" > test.txt
# 上传文件到HDFS
hdfs dfs -put test.txt /input/
# 运行WordCount作业
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.3.jar wordcount /input/test.txt /output
# 查看结果
hdfs dfs -cat /output/part-r-00000
预期输出:
code复制Hadoop 1
Hello 2
World 1
在单节点环境中,合理分配内存资源至关重要。以下是针对4GB内存系统的优化建议:
yarn-site.xml:
xml复制<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
mapred-site.xml:
xml复制<property>
<name>mapreduce.map.memory.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
bash复制# 检查HDFS状态
hdfs dfsadmin -report
# 检查磁盘使用情况
hdfs dfs -df -h
# 列出HDFS文件
hdfs dfs -ls /
# 查看运行中的YARN应用
yarn application -list
# 停止特定应用
yarn application -kill <application_id>
# 安全模式下操作(谨慎使用)
hdfs dfsadmin -safemode enter|leave|get
Hadoop的日志文件位于$HADOOP_HOME/logs目录下,对于问题排查非常重要:
bash复制# 查看NameNode日志
tail -f $HADOOP_HOME/logs/hadoop-hadoop-namenode-*.log
# 查看DataNode日志
tail -f $HADOOP_HOME/logs/hadoop-hadoop-datanode-*.log
# 查看YARN日志
tail -f $HADOOP_HOME/logs/yarn-hadoop-resourcemanager-*.log
对于长期运行的开发环境,建议配置日志轮转:
bash复制sudo nano /etc/logrotate.d/hadoop
# 添加以下内容
/usr/local/hadoop/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 hadoop hadoop
sharedscripts
postrotate
/usr/bin/find /usr/local/hadoop/logs -name "*.log.*" -mtime +30 -exec rm {} \;
endscript
}
症状:执行ssh localhost时提示权限被拒绝或需要密码。
解决方案:
bash复制sudo nano /etc/ssh/sshd_config
# 确保以下设置:
# PermitRootLogin prohibit-password
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys
sudo systemctl restart ssh
症状:启动服务时报端口已被占用。
解决方案:
bash复制# 查找占用端口的进程
sudo netstat -tulnp | grep :9000
# 可以修改Hadoop使用的默认端口
# 在core-site.xml中修改fs.defaultFS的值
# 例如改为hdfs://localhost:9001
症状:启动Hadoop时报Java版本不兼容。
解决方案:
症状:执行hdfs dfs -put时报权限被拒绝。
解决方案:
bash复制# 检查HDFS目录权限
hdfs dfs -ls /
# 修改权限(开发环境中可以使用)
hdfs dfs -chmod -R 777 /
注意:在生产环境中,应该配置适当的用户和组权限,而不是简单地使用777。
虽然单节点集群主要用于开发和测试,但了解基本的安全配置仍然有价值:
防火墙配置:
bash复制sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 9870/tcp # NameNode
sudo ufw allow 8088/tcp # YARN
禁用不必要的服务:
bash复制sudo systemctl disable bluetooth
sudo systemctl stop bluetooth
定期更新系统:
bash复制sudo apt update && sudo apt upgrade -y
配置HDFS权限:
bash复制hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hadoop
hdfs dfs -chown hadoop:hadoop /user/hadoop
启用HDFS回收站(在core-site.xml中):
xml复制<property>
<name>fs.trash.interval</name>
<value>1440</value> <!-- 保留时间(分钟) -->
</property>
限制网络访问(在hdfs-site.xml中):
xml复制<property>
<name>dfs.namenode.http-bind-host</name>
<value>127.0.0.1</value>
</property>
使用内置Web UI:
命令行监控:
bash复制# 查看HDFS使用情况
hdfs dfsadmin -report
# 查看YARN节点状态
yarn node -list
# 查看磁盘空间
hdfs dfs -df -h
Hadoop日志通常包含大量有价值的信息。我常用的grep命令模式:
bash复制# 查找错误日志
grep -i "error" $HADOOP_HOME/logs/*.log
# 查找特定时间段的日志
sed -n '/2024-01-01 10:00/,/2024-01-01 11:00/p' $HADOOP_HOME/logs/hadoop-*-namenode-*.log
# 统计错误类型
grep -o "ERROR [^ ]*" $HADOOP_HOME/logs/*.log | sort | uniq -c | sort -nr
清理临时文件:
bash复制# 清理Hadoop临时目录
hdfs dfs -expunge
rm -rf /usr/local/hadoop/tmp/*
检查磁盘空间:
bash复制# 设置HDFS配额防止磁盘写满
hdfs dfsadmin -setSpaceQuota 10g /user/hadoop
备份关键配置:
bash复制# 备份Hadoop配置文件
tar -czvf hadoop-config-backup.tar.gz $HADOOP_HOME/etc/hadoop
搭建好单节点集群后,你可以进一步探索以下内容:
HDFS高级操作:
YARN资源管理:
MapReduce编程:
生态系统组件集成:
我在实际工作中发现,单节点集群虽然不能体现Hadoop的分布式优势,但非常适合学习和原型开发。当你在单节点上熟悉了基本操作和配置后,扩展到多节点集群会顺利很多。