在开发环境中使用 Spark + Hadoop 时,经常会遇到一些“重启就崩”“莫名其妙报错”的情况。这篇文章整理了一些常见的坑和最佳实践,希望能帮你优雅地启动和关闭 Spark/Hadoop 集群。

启动与关闭命令速查

先来一波最基本的操作:

启动命令

cd /opt/module/hadoop-3.4.1
./sbin/start-dfs.sh
./sbin/start-yarn.sh

优雅关闭

./sbin/stop-dfs.sh
./sbin/stop-yarn.sh

为什么重启后会报错?

简短回答: 很可能是没有“优雅”地关闭集群,或者手动执行了不该执行的操作(比如 -format)。

系统关机前如果没有执行 stop-dfs.sh,可能导致 NameNode 与 DataNode 状态不一致,从而在下次启动时报错。


原理简单聊聊

Hadoop 的 HDFS 使用一个叫 ClusterID 的标识来确认各节点是否属于同一个集群:

  • NameNode 启动时会检查自己的 ClusterID
  • DataNode 启动时也会读取本地存储的 ClusterID

如果执行了:

hdfs namenode -format

会重新生成一个新的 ClusterID 并写入 NameNode 的目录。但此时,DataNode 的目录还存着旧的 ClusterID,就会出现类似这样的错误:

“ClusterID 不匹配,拒绝连接!”

于是你看到了一大串启动失败的异常堆栈。


如何避免频繁清空或出错?

方法一:别频繁 format

只在第一次搭建环境时执行一次:

hdfs namenode -format

之后再也不用。不要动不动就 format,否则之前的数据、元信息全没了,DataNode 也会拒绝工作。


方法二:关机前记得优雅停服

重启电脑前执行:

./sbin/stop-dfs.sh

这样可以确保所有节点正常断开,避免状态不一致。


方法三:定期备份数据目录

如果你不放心,可以备份 Hadoop 的数据目录:

cp -r /opt/module/hadoop-3.4.1/hadoop_data ~/hadoop_data_backup

崩了也能快速还原:

cp -r ~/hadoop_data_backup /opt/module/hadoop-3.4.1/hadoop_data

方法四:使用 Docker 或虚拟机快照

如果你用的是 Docker 或 VirtualBox,完全可以在配置好环境后做个快照,每次出问题直接还原到“干净现场”,开发调试特别省心。