持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
前言
按照上一篇文章的方式去搭建一个本地的伪分布式的Hadoop集群,在第一次启动使用的时候,HDFS文件系统的功能都是正常使用的,包括创建目录,上传文件等等操作。虽然一切看上去都是如此的正常,但是问题就产生在下一次启动的时候。
问题排查过程
第一次启动Hadoop伪分布式集群的时候没有任何问题,我测试了HDFS的一些命令行操作,于是我执行关闭Hadoop集群,执行以下关闭命令:
mr-jobhistory-deamon.sh stop historyserver
stop-yarn.sh
stop-dfs.sh
过了一天后,我想重新在本地启动这个Hadoop集群,于是我执行启动命令:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
执行启动过程中都没有任何异常,于是我执行了一个最简单的列出home目录文件列表的命令hadoop fs -ls .,结果出现了如下图片的错误Connection refused
这时候我非常的疑惑,停止Hadoop集群后,我没有再做任何的操作,也没有修改任意的配置文件,为什么会出现这样的错误呢。于是我为了确认这个错误是否HDFS自身的错误,我执行了一个count的mapreduce任务,同样的存在这个问题。
因为报错信息中存在一个wiki的链接,我通过阅读了这个链接,排查了以下几个方面:
- /etc/hosts文件中的域名映射是否正常,是否有映射到正确的IP地址上。
- 使用telnet是否可以登陆到8020端口上
- IP和主机之间是否无法链接到。 排查几个方面没有结果后,去SOF上进行搜索这个报错信息,也是差不多说明的是这些方面的。
在第一次遇到这个问题的时候,我通过这些方式排查完成之后,在不断的启动与停止之间切换,我放弃了,我采用了以下折中的方式进行处理:
- 重新安装一个本地的Hadoop,将原先的删除了
- 使用
hdfs namenode -format的指令,格式化文件系统。
第二次遇到这个问题后,我没有再退缩了,我在思考观察启动命令的时候发现,它其实是有一个输出日志的,于是我查看了这几个启动命令的日志后,发现namenode根本就没有正常启动的,日志中出现了以下的报错信息:
2022-06-08 13:17:13,366 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /private/tmp/hadoop-jackpan/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:388)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:239)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1073)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:695)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:674)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:736)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:961)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:940)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1714)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1782)
查找/private/tmp/hadoop-jackpan/dfs/name目录根本就不存在的。但是格式化完成之后是存在的。于是我找到了一个解决方案,就是将namenode的目录设置到自己指定的一个目录下即可,在hdfs-site.xml中,增加如下配置:
<property>
<name>dfs.data.dir</name>
<value>/Users/jackpan/JackPanDocuments/jack-learning/hadoop-book-parent/local-hadoop/hadoop-jackpan/dfs/name/data</value>
<final>true</final>
</property>
<property>
<name>dfs.name.dir</name>
<value>/Users/jackpan/JackPanDocuments/jack-learning/hadoop-book-parent/local-hadoop/hadoop-jackpan/dfs/name</value>
<final>true</final>
</property>
最后重新执行hdfs namenode -format,然后在执行启动指令即可解决问题。
总结
在排查问题的过程中,如果持续花费时间还是无法解决的,最后让头脑休息一下,第二天或者第三天再进行排查操作。