Namenode 守护进程未正确启动

Posted

技术标签:

【中文标题】Namenode 守护进程未正确启动【英文标题】:Namenode daemon not starting properly 【发布时间】:2017-01-28 04:54:08 【问题描述】:

我刚刚从Hadoop:权威指南一书中开始学习hadoop。

我按照伪分布式模式下的 Hadoop 安装教程进行操作。我启用了 ssh 的无密码登录。 在第一次使用 hdfs 文件系统之前对其进行格式化。它第一次成功启动。 之后,我使用 copyFromLocal 将文本文件复制到 HDFS,一切正常。但是如果我重新启动系统并再次启动守护进程并查看 web UI,只有 YARN 启动成功。

当我发出 stop-dfs.sh 命令时,我得到了

Stopping namenodes on [localhost]
localhost: no namenode to stop
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode

如果我再次格式化 hdfs 文件系统,然后尝试启动守护程序,那么它们都会成功启动。

这是我的配置文件。正如 hadoop 权威指南中所说的那样。

hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>    
        <value>1</value>
    </property>

</configuration>

core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost/</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>localhost</value>    
    </property>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

这是namenode日志文件中的错误

WARN org.apache.hadoop.hdfs.server.common.Storage: Storage directory /tmp/hadoop/dfs/name does not exist
 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop/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:327)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:215)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:975)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:585)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:645)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:812)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:796)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1493)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1559)

这是来自mapred日志

Caused by: java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:744)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:495)
    at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:614)
    at org.apache.hadoop.ipc.Client$Connection.setupiostreams(Client.java:712)
    at org.apache.hadoop.ipc.Client$Connection.access$2900(Client.java:375)
    at org.apache.hadoop.ipc.Client.getConnection(Client.java:1528)
    at org.apache.hadoop.ipc.Client.call(Client.java:1451)
    ... 33 more

我访问了apache hadoop : connection refused,上面写着

检查在 /etc/hosts 中没有映射到 127.0.0.1 或 127.0.1.1 的主机名条目(Ubuntu 因这而臭名昭著)。

我发现我的 /etc/hosts 中有一个条目,但如果我删除它,我的 sudo 会中断导致错误 sudo: unable to resolve host 。如果不删除映射到 127.0.1.1 的主机名,我应该在 /etc/hosts 中附加什么

我不明白这个问题的根本原因是什么。

【问题讨论】:

你提到core-site.xml中name node的地址是localhost吗 @siddharthajain 是的,配置文件不是问题,因为守护进程是第一次启动的。 【参考方案1】:

它在你的 Namenode 日志文件中说你的 Namenode 目录的默认存储是/tmp/hadoop/tmp 目录在某些系统重新启动时在 linux 中格式化。所以肯定是问题所在。

您需要通过更改hdfs-site.xml 配置文件来更改默认名称节点和数据节点目录。

将此添加到您的hdfs-site.xml

<property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/"your-user-name"/hadoop</value> 
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/"your-user-name"/datanode</value>   
    </property>

在此之后通过hdfs namenode -format 命令格式化你的namenode。

我想这会解决你的问题。

【讨论】:

【参考方案2】:

如果配置文件没有问题,请尝试以下操作:

1.首先删除临时文件夹中的所有内容:

 rm -Rf <tmp dir> (my was /usr/local/hadoop/tmp)

2.格式化namenode:

bin/hadoop namenode -format

3.重新启动所有进程:

bin/start-all.sh

【讨论】:

我在我的问题中写道,如果我格式化 namenode,那么守护进程会成功启动,但如果我在 fs 中执行copyFromLocal 之类的操作,那么问题又来了。只有 YARN 在 localhost 上运行,而不是 hdfs 和 mapreduce。 另外start-all.sh 已被弃用,您应该分别启动守护进程。

以上是关于Namenode 守护进程未正确启动的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop的启动

WARN hdfs.DFSUtil: Namenode for null remains unresolved for ID null异常会导致secondarynamenode守护进程无法开启

如何检查 impala 守护进程实例和状态存储守护进程实例是不是正在运行?

如何实现守护进程?

如何加载系统守护进程在MacOS问题,怎么解决

Erlang:守护进程“init.d”脚本无法启动