分享

超过datanode可以忍受的磁盘损坏的个数导致HADOOP集群DATANODE起不来

hyj 2014-4-9 00:58:17 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 35778
本帖最后由 hyj 于 2014-4-9 01:02 编辑




HADOOP集群DATANODE起不来:“DISKCHECKER$DISKERROREXCEPTION: INVALID VOLUME FAILURE CONFIG VALUE: 1”

最近把线上一个配置在拷贝到线下一台机器后,发现hadoop datanode起不来,
总是报这个异常的原因是什么?


查看源代码打印帮助
  1. 2014-03-11 10:38:44,238 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-1337291857-192.168.2.50-1394505472069 (storage id DS-1593966629-192.168.2.50-50010-1394505524173) service to search002050.sqa.cm4/192.168.2.50:9000
  2. org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid volume failure  config value: 1
  3.         at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.<init>
  4. (FsDatasetImpl.java:183)
  5.         at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetFactory.newInstance
  6. (FsDatasetFactory.java:34)
  7.         at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetFactory.newInstance
  8. (FsDatasetFactory.java:30)
  9.         at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:920)
  10.         at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:882)
  11.         at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo
  12. (BPOfferService.java:308)
  13.         at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake
  14. (BPServiceActor.java:218)
  15.         at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:660)
  16.         at java.lang.Thread.run(Thread.java:662)
复制代码






已有(3)人评论

跳转到指定楼层
hyj 发表于 2014-4-9 01:01:31
原因是:
dfs.datanode.failed.volumes.tolerated 这个参数直接拷贝了线上的配置为1,
其含义是:The number of volumes that are allowed to fail before a datanode stops offering service. By default any volume failure will cause a datanode to shutdown. 即datanode可以忍受的磁盘损坏的个数。
在hadoop集群中,经常会发生磁盘只读或者损坏的情况。datanode在启动时会使用dfs.datanode.data.dir下配置的文件夹(用来存储block),若是有一些不可以用且个数>上面配置的值,DataNode就会启动失败。
在线上环境中fs.datanode.data.dir配置为10块盘,所以dfs.datanode.failed.volumes.tolerated设置为1,是允许有一块盘是坏的。而线下的只有一块盘,这volFailuresTolerated和volsConfigured的值都为1,所以会导致代码里面判断失败。
详见hadoop源码的FsDatasetImpl.java的182行:
  1. // The number of volumes required for operation is the total number
  2. // of volumes minus the number of failed volumes we can tolerate.
  3. final int volFailuresTolerated =
  4.   conf.getInt(DFSConfigKeys.DFS_DATANODE_FAILED_VOLUMES_TOLERATED_KEY,
  5.               DFSConfigKeys.DFS_DATANODE_FAILED_VOLUMES_TOLERATED_DEFAULT);
  6. String[] dataDirs = conf.getTrimmedStrings(DFSConfigKeys.DFS_DATANODE_DATA_DIR_KEY);
  7. int volsConfigured = (dataDirs == null) ? 0 : dataDirs.length;
  8. int volsFailed = volsConfigured - storage.getNumStorageDirs();
  9. this.validVolsRequired = volsConfigured - volFailuresTolerated;
  10. if (volFailuresTolerated < 0 || volFailuresTolerated >= volsConfigured) {
  11.   throw new DiskErrorException("Invalid volume failure "
  12.       + " config value: " + volFailuresTolerated);
  13. }
  14. if (volsFailed > volFailuresTolerated) {
  15.   throw new DiskErrorException("Too many failed volumes - "
  16.       + "current valid volumes: " + storage.getNumStorageDirs()
  17.       + ", volumes configured: " + volsConfigured
  18.       + ", volumes failed: " + volsFailed
  19.       + ", volume failures tolerated: " + volFailuresTolerated);
  20. }
复制代码



回复

使用道具 举报

yangq 发表于 2015-7-31 11:23:36
我遇到你这个问题 ,现在解决了 3q
回复

使用道具 举报

凡梦星尘 发表于 2016-12-30 14:33:40
新手安装AMBARI启动里遇到DATANODE启动失败,谢谢你的分享,成功解决问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条