Hadoop Volume 配置

volume的配置就是在 hdfs-site.xml 下

<property>
    <name>dfs.datanode.data.dir</name>
    <value>/sda1,/sda/disk1</value>
</property>

我今早是新加了一个volume,就是(所有机器都是)

drwx------ 4 hadoop hadoop  4096 Apr  2 13:33 /sda1
drwx------ 4 admin admin  4096 Apr  2 13:33 /sda/disk1

所有者和组都是admin(故意设置的),然后我把配置文件分发了之后,重启了hdfs(不知道为什么refreshNodes不行) 结果所有的DN都启不了了,报的错误都是

org.apache.hadoop.util.DiskChecker$DiskErrorException: Too many failed volumes - current valid volumes: 1, volumes configured: 2, volumes failed: 1, volume failures tolerated: 0

我google了“Too many failed volumes”下,然后在hdfs-site.xml下面配置了dfs.datanode.failed.volumes.tolerated(默认应该0,一个盘坏了,这个DN就启动不了)

dfs.datanode.failed.volumes.tolerated : 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.
<property>
    <name>dfs.datanode.failed.volumes.tolerated</name>
    <value>2</value>
</property> 

重新分发配置文件,结果还是不行,我就猜测难道这个配置项是针对集群坏盘的总和,而不是一个datanode,于是我就配得更加高,设置成20,结果还是不对。后来在google下,发现问题不是“坏盘最大数不够”,而是配置出错了。下面是这部分的代码

public FSDataset(DataStorage storage, Configuration conf) throws IOException {
    this.maxBlocksPerDir = conf.getInt("dfs.datanode.numblocks", 64);
    
    // The number of volumes required for operation is the total number 
    // of volumes minus the number of failed volumes we can tolerate.
    final int volFailuresTolerated =
      conf.getInt("dfs.datanode.failed.volumes.tolerated", 0);
    String[] dataDirs = conf.getTrimmedStrings(DataNode.DATA_DIR_KEY);
    int volsConfigured = (dataDirs == null) ? 0 : dataDirs.length;
    int volsFailed = volsConfigured - storage.getNumStorageDirs();
    validVolsRequired = volsConfigured - volFailuresTolerated;

    //看这里!!!
    if (volFailuresTolerated < 0 || volFailuresTolerated >= volsConfigured) {
      throw new DiskErrorException("Invalid volume failure "
          + " config value: " + volFailuresTolerated);
    }

终于知道为什么了,因为dfs.datanode.failed.volumes.tolerated配置的参数比dfs.datanode.data.dir的盘数还多,这个参数就是针对一个datanode的,而不是针对集群总共的坏盘数。接下来我把dfs.datanode.failed.volumes.tolerated设置成1,总算不报这个上面的错误了,DN正常起来了。但是因为我对第二块盘的所有者和组设置的都是admin,所以那块盘还是加入不了DFS,但是因为每个DN只是坏了一个盘,而dfs.datanode.failed.volumes.tolerated设置的是1,小于等于这个值,所以就能够正常启动。接下来就只需要把第二块盘的用户所有者和权限设置下就行了。

标签:Linux, Hadoop