java - 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 异常和一个我以前从未见过的写锁定保持间隔消息。
我注意到/尝试的:
- 我检查了 fsimage 是否存在以及它是否在正确的目录中,是的 fsimage 在那里。
- 我注意到与节点1相比,节点2的hdfs/namenode/当前目录中的edits_xxxxxx-xxxxxx数量确实很大,但我没有触及任何文件。
- 我试图复制node1的journal目录来替换节点2中的那个,看看健康的journal是否有帮助,但是没有用。
- 我尝试运行 hdfs namenode -recover 但实际上我得到了相同的日志输出。
我在某处读到这可能是由于超时或java产生的多个线程,或者类似的东西,你有什么建议吗?
先感谢您。
解决方案
推荐阅读
- php - 如何在 Symfony 4 邮件程序中增加发送限制
- maxima - 简化包含测角函数的根的乘积
- php - PHP重组数据数组
- laravel - 或者在 Eloquent livewire 中使用 And 语句
- python-3.x - 如何验证输入是否来自预先批准的列表?(Python)
- python - 将 Python 字典写入 CSV
- google-sheets - 如何通过谷歌表格上的 webhook 自动格式化输入到列中的日期值
- mybatis - 我们什么时候应该在 mybatis 中创建自定义 TypeHandler?
- setuptools - PyPI打包、命名空间包和子打包问题
- javascript - 在客户端的浏览器中打开(由 http get 产生的)PDF