首页 > 解决方案 > Hadoop namenode 无法加载 fsimage

问题描述

我在启动 hdfs 时遇到问题。我的集群由谷歌云平台上的 3 个节点组成。1 是活动的名称节点。节点 2 应该是备用名称节点和数据节点。节点 3 只是数据节点。

当我启动 hdfs 时,我的活动名称节点已启动并运行,但我的备用名称节点没有,如果我尝试在 node1:50070 打开 UI 一切看起来都很好,但如果我尝试 node2:50070 它无法连接(站点可以'无法到达)。在检查数据节点 UI 时,当我打开 node2:50075 时,我看到 namenode 1 处于 RUNNING 状态,而 namenode 2 处于 CONNECTING 状态(并且它一直保持这种状态,心跳数永远上升)。

这很有趣,因为我们有另一个具有完全相同 hdfs 配置的测试环境,但我们在那里没有问题。下面是错误日志:

2019-03-05 14:45:02,481 ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile(file=/persist/hdfs/namenode/current/fsimage_0000000000000951913, cpktTxId=0000000000000951913)
java.io.IOException: Premature EOF from inputStream
    at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:208)
    at org.apache.hadoop.hdfs.server.namenode.FSImageFormat$LoaderDelegator.load(FSImageFormat.java:220)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:931)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:915)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImageFile(FSImage.java:788)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:718)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:316)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1044)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:707)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:635)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:696)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:906)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:885)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1626)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1694)
2019-03-05 14:45:02,534 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem write lock held for 12202 ms via
java.lang.Thread.getStackTrace(Thread.java:1559)
org.apache.hadoop.util.StringUtils.getStackTrace(StringUtils.java:1033)
org.apache.hadoop.hdfs.server.namenode.FSNamesystemLock.writeUnlock(FSNamesystemLock.java:252)
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.writeUnlock(FSNamesystem.java:1572)
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1073)
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:707)
org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:635)
org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:696)
org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:906)
org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:885)
org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1626)
org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1694)
    Number of suppressed write-lock reports: 0
    Longest write-lock held interval: 12202
2019-03-05 14:45:02,535 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
java.io.IOException: Failed to load FSImage file, see error(s) above for more info.
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:732)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:316)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1044)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:707)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:635)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:696)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:906)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:885)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1626)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1694)
2019-03-05 14:45:02,555 INFO org.mortbay.log: Stopped HttpServer2$SelectChannelConnectorWithSafeStartup@core-acc2:50070
2019-03-05 14:45:02,563 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping NameNode metrics system...
2019-03-05 14:45:02,564 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system stopped.
2019-03-05 14:45:02,565 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system shutdown complete.
2019-03-05 14:45:02,565 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.io.IOException: Failed to load FSImage file, see error(s) above for more info.
    at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:732)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:316)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1044)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:707)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:635)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:696)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:906)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:885)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1626)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1694)
2019-03-05 14:45:02,568 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2019-03-05 14:45:02,595 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at

(我在复制粘贴时截断了日志)。

如您所见,错误很明显,namenode 2 无法加载 fsimage。但是,我不确定原因是否仅与 fsimage 本身有关,或者还有更多原因,因为我看到了一个 EOF 异常和一个我以前从未见过的写锁定保持间隔消息。

我注意到/尝试的:

  1. 我检查了 fsimage 是否存在以及它是否在正确的目录中,是的 fsimage 在那里。
  2. 我注意到与节点1相比,节点2的hdfs/namenode/当前目录中的edits_xxxxxx-xxxxxx数量确实很大,但我没有触及任何文件。
  3. 我试图复制node1的journal目录来替换节点2中的那个,看看健康的journal是否有帮助,但是没有用。
  4. 我尝试运行 hdfs namenode -recover 但实际上我得到了相同的日志输出。

我在某处读到这可能是由于超时或java产生的多个线程,或者类似的东西,你有什么建议吗?

先感谢您。

标签: javahadoophdfs

解决方案


推荐阅读