场景1:故障目录容忍度大于等于数据目录数
报错:org.apache.hadoop.util.DiskCheck$DiskErrorException:?Invalid volume failure config value:1 原因:dfs.datanode.data.dir只配了一个目录,但dfs.datanode.failed.volumes.tolerated配的是1;即只有一个目录,还允许一个目录不可用。 解决:将dfs.datanode.failed.volumes.tolerated配置为0,或增加数据目录数。
后记:
dfs.datanode.failed.volumes.tolerated
当DataNode的任何一个本地磁盘出故障时,它的默认行为认定整个DataNode失效。在一个中到大型的集群中,硬盘故障是相当常见的,所以这种行为不是最优的。一个DataNode的丢失会导致一些数据块备份数下降,因此,NameNode会命令其他DataNode复制这些丢失的数据块来增加被附属。参数dfs.datanode.failed.volumes.tolerated定义整个DataNode声明失败前允许多少个硬盘出现故障。
很多人会问,为什么不能容忍所有磁盘失效的情况,这样就可以把整个DataNode的失效推迟到没有任何可工作的硬盘为止。对于一个永久的时间窗口来说,这看上去很合理的,但是实际上,对于所有的磁盘来说,管理员对于磁盘故障的处理都会早于由于正常磨损而出现的故障。只有一种情况例外,所有的硬盘在一个极短的时间内全部出现故障,这种异常情况需要立即调查。在实践中,快速的磁盘故障通常意味着驱动控制器或者某些部件故障。正因为罕见,但如果磁盘在短时间内开始出现一连串故障,最好的办法就是立即隔离。先把整个集群设置为不可用,直到找到失败的原因为止。参数dfs.datanode.failed.volumes.tolerated默认值为0,也就意味着只要有一个磁盘出现故障就会导致整个DataNode不可用,管理员可以增大该值来保证在出现部分磁盘故障时,DataNode仍能持续运行,但是需要保持谨慎的是,在极短的时间范围内出现一个或者两个磁盘故障表明一个更大的问题存在。
另外,多说一嘴,磁盘故障时,如果总容量降低,一般是出现了坏道导致的,而产生坏道的原因很大概率是磁盘中进入灰尘,后续出故障的概率会明显增加,因此生产环境的话建议换盘。
场景2:故障目录数大于故障目录容忍度
报错:org.apache.hadoop.util.DiskChecker$DiskErrorException: Too many failed volumes - current valid volumes: 1, volumes configured: 2, volumes failed: 1, volume failures tolerated: 0 原因:故障目录数大于故障目录容忍度。 解决:
? ? 方法1:?修改坏盘容忍度(dfs.datanode.failed.volumes.tolerated),使其大于故障盘数。
? ? 方法2: 更换磁盘,并挂载与之前一致的目录。
后记:
【磁盘挂载步骤】 步骤1:查看磁盘盘符 ? ??fdisk -l 步骤2:格式化文件系统 ? ? mkfs.ext4 /dev/sdd 步骤3:新建挂载目录 ? ? mkdir /opt/disk02 步骤4:将磁盘盘符挂载到需要的目录下 ? ? mount /dev/sdd /opt/disk02 步骤5:查看挂载是否成功 ? ? df -Th 步骤6:查看磁盘的UUID ? ? blkid?/dev/sdd1 步骤7:修改系统配置文件,使开机自动挂载 ? ? vi /etc/fstab ? ? UUID /opt/disk02 ext4 defaults 0 0
场景3:NameNode和DataNode的NameNodeID不一致
报错:java.io.IOException: Incompatible clusterIDs in /hadoop/hdfs/data: namenode clusterID = CID-d4d0f6ef-7b81-falj-ajkfjlasdfj; datanode clusterID=CID-d4d0f6ef-7b81-falj-ajkfjlasdff java.io.IOException:All specified directories are failed to load. 原因:格式化namenode后未更新datanode的version文件。 解决:
? ? 方法1:?修改datanode目录VERSION(位于${datanode_dir}/current/VERSION)中的clusterID与namenode目录VERSION(位于${namenode_dir}/current/VERSION)一致。
? ? 方法2: 修改清空datanode的数据目录:rm -rf?${datanode_dir}。
后记:
【hdfs格式化】 步骤1:停掉服务 步骤2:将hdfs-site.xml的dfs.name.dir和dfs.data.dir所指定的目录删除,将core-site.xml的Hadoop.tmp.dir所指定的目录删除。 ? ? (如果开启了HA,则同时需要清空dfs.journalnode.edits.dir) ? ? (清空目录可以用模糊匹配:rm -rf /opt/disk*/hadoop/hdfs/data/* ? ?会删除所有disk下hdfs data目录中的数据) 步骤3:在主节点:hadoop namenode -format(如果开启了HA,journalnode需要先开启,然后再执行格式化) 步骤4:将namenode下所有文件的所有者改为hdfs:hadoop(步骤3在hdfs用户下执行则不需要改权限) 步骤5:在/hadoop/hdfs/namenode/current目录下查看VERSION的clusterID,修改/hadoop/hdfs/data/current目录下对应clusterID ? ? (已清空datanode目录的情况下无需改ID) 步骤6:格式化完成后正常启动所有服务即可。
持续更新......
后续遇到datanode无法启动的问题会持续更新该文章,敬请关注。
|