环境说明#
这篇记录的是在单台机器上搭建 Hadoop 伪分布式环境的过程。 伪分布式就是把 NameNode、DataNode、ResourceManager 等角色都跑在一台机器上, 适合教学演示和个人练习,不适合生产。
| 项目 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04 |
| JDK | OpenJDK 8 |
| Hadoop | 3.3.6 |
第一步:配置 SSH 免密登录#
Hadoop 启动脚本需要在本机之间免密执行命令,所以先让机器相信自己。
# 生成密钥对,一路回车即可
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 把公钥追加到授权文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
# 验证:应该能直接登录,不提示密码
ssh localhost
常见坑:如果
ssh localhost还要密码,检查~/.ssh目录权限必须是 700。
第二步:修改四个配置文件#
配置文件都在 $HADOOP_HOME/etc/hadoop/ 下。
core-site.xml#
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml#
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
这里是伪分布式最容易踩的坑:副本数必须改成 1。 默认是 3,但只有一台机器,HDFS 会一直报「副本不足」的警告。
mapred-site.xml#
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml#
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
第三步:格式化并启动#
# 格式化 NameNode —— 只在第一次启动前执行!
hdfs namenode -format
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 用 jps 检查进程,应该看到 5 个 Java 进程
jps
正确的 jps 输出应该包含:
NameNode
DataNode
SecondaryNameNode
ResourceManager
NodeManager
常见报错对照表#
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
Connection refused |
服务没起来 | 看 logs/ 下的日志定位 |
datanode denied |
重复格式化导致 clusterID 不一致 | 删掉 data 和 logs 目录重新格式化 |
Permission denied |
当前用户没有目录权限 | chown -R 用户名 $HADOOP_HOME |
验证一下#
浏览器打开 http://localhost:9870 能看到 HDFS 界面,
打开 http://localhost:8088 能看到 YARN 界面,就说明成功了。
上传一个文件试试:
hdfs dfs -mkdir -p /test
hdfs dfs -put README.txt /test/
hdfs dfs -ls /test
课堂思考题#
- 伪分布式和完全分布式的差别到底在哪几个配置项上?
- 如果突然断电,重启后 NameNode 的数据从哪里恢复?