最近,我安装了Hadoop并格式化了namenode。 名称节点启动良好,但数据节点启动失败。 这是数据节点错误日志
STARTUP_MSG: build = git@github.com:hortonworks/hadoop.git -r 3091053c59a62c82d82c9f778c48bde5ef0a89a1; compiled by 'jenkins' on 2018-05-11T07:53Z
STARTUP_MSG: java = 1.8.0_181
************************************************************/
2018-10-17 15:08:42,769 INFO datanode.DataNode (LogAdapter.java:info(47)) - registered UNIX signal handlers for [TERM, HUP, INT]
2018-10-17 15:08:43,665 INFO checker.ThrottledAsyncChecker (ThrottledAsyncChecker.java:schedule(122)) - Scheduling a check for [DISK]file:/hadoop/hdfs/data/
2018-10-17 15:08:43,682 ERROR datanode.DataNode (DataNode.java:secureMain(2692)) - Exception in secureMain
org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid value configured for dfs.datanode.failed.volumes.tolerated - 1. Value configured is >= to the number of configured volumes (1).
at org.apache.hadoop.hdfs.server.datanode.checker.StorageLocationChecker.check(StorageLocationChecker.java:174)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:2584)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:2493)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:2540)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:2685)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:2709)
2018-10-17 15:08:43,688 INFO util.ExitUtil (ExitUtil.java:terminate(124)) - Exiting with status 1
2018-10-17 15:08:43,696 INFO datanode.DataNode (LogAdapter.java:info(47)) - SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at hdp2.com/192.168.100.12
dfs.datanode.failed.volumes.tolerated - 1
是什么意思? 是什么导致了这样的错误?
当我尝试解决这个问题时,我搜索了源代码
final int volFailuresTolerated =
conf.getInt(DFSConfigKeys.DFS_DATANODE_FAILED_VOLUMES_TOLERATED_KEY,
DFSConfigKeys.DFS_DATANODE_FAILED_VOLUMES_TOLERATED_DEFAULT);
String[] dataDirs = conf.getTrimmedStrings(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY);
int volsConfigured = (dataDirs == null) ? 0 : dataDirs.length;
int volsFailed = volsConfigured - storage.getNumStorageDirs();
this.validVolsRequired = volsConfigured - volFailuresTolerated;
if (volFailuresTolerated < 0 || volFailuresTolerated >= volsConfigured) {
throw new DiskErrorException("Invalid volume failure "
+ " config value: " + volFailuresTolerated);
}
if (volsFailed > volFailuresTolerated) {
throw new DiskErrorException("Too many failed volumes - "
+ "current valid volumes: " + storage.getNumStorageDirs()
+ ", volumes configured: " + volsConfigured
+ ", volumes failed: " + volsFailed
+ ", volume failures tolerated: " + volFailuresTolerated);
}
如你所见
数据节点停止之前允许发生故障的卷数 提供服务。默认情况下,任何卷故障都会导致数据节点 以关闭。
这是数据节点可以容忍的磁盘损坏数量。
在 Hadoop 群集中,经常发生磁盘只读或损坏的情况。数据节点将在启动时使用在 dfs.datanode.data.dir 下配置的文件夹(用于存储块(。如果有一些值无法使用,并且上面配置了数字,则数据节点将无法启动。
在我的Hadoop环境中,fs.datanode.data.dir
配置为1个磁盘,因此dfs.datanode.failed.volumes.tolerated
设置为1,这允许磁盘损坏。该行下只有一个磁盘,volFailuresTolerated
和volsConfigured
的值均为 1,因此会导致代码失败。
check hdfs-site.xml.此属性必须设置为 0 或更高:
dfs.datanode.failed.volumes.tolerated
数据节点停止之前允许发生故障的卷数 提供服务。默认情况下,任何卷故障都会导致数据节点 以关闭。
从 hdfs-site.xml 文件中删除以下属性。
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///C:/hadoop-3.3.0/data/datanode</value>
</property>