记一次Hadoop请求操作返回Connection refused问题的排查过程

402 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

image.png 这时候我非常的疑惑,停止Hadoop集群后,我没有再做任何的操作,也没有修改任意的配置文件,为什么会出现这样的错误呢。于是我为了确认这个错误是否HDFS自身的错误,我执行了一个count的mapreduce任务,同样的存在这个问题。

因为报错信息中存在一个wiki的链接,我通过阅读了这个链接,排查了以下几个方面:

  1. /etc/hosts文件中的域名映射是否正常,是否有映射到正确的IP地址上。
  2. 使用telnet是否可以登陆到8020端口上
  3. IP和主机之间是否无法链接到。 排查几个方面没有结果后,去SOF上进行搜索这个报错信息,也是差不多说明的是这些方面的。

在第一次遇到这个问题的时候,我通过这些方式排查完成之后,在不断的启动与停止之间切换,我放弃了,我采用了以下折中的方式进行处理:

  1. 重新安装一个本地的Hadoop,将原先的删除了
  2. 使用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,然后在执行启动指令即可解决问题。

总结

在排查问题的过程中,如果持续花费时间还是无法解决的,最后让头脑休息一下,第二天或者第三天再进行排查操作。