Hadoop datanode节点退役遇到的坑

问题描述:

当前集群7台机器,需要退役掉其中的3台,退役了一天,发现block数不变,于是查看namenode日志,发现以下信息:

2019-10-17 17:29:25,177 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 2 to reach 3 (unavailableStorages=[], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) For more information, please enable DEBUG log level on org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy
2019-10-17 17:29:25,177 WARN org.apache.hadoop.hdfs.protocol.BlockStoragePolicy: Failed to place enough replicas: expected size is 2 but only 0 storage types can be selected (replication=3, selected=[], unavailable=[DISK], removed=[DISK, DISK], policy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]})

迁移数据的时候,namenode会判断各个datanode的负载是否超出平均负载,如果超出平均负载,则认为这台datanode不可用,继续按照此算法重新找下一个datanode节点。

这里的负载不是系统负载,而是xceiver线程数(这个线程好像是负责读写的),用总的xceiver线程数除以所有datanode数,算出平均负载。

本次遇到的是3台机器正在退役,正在退役的机器datanode负载很低,导致剩下的4台机器线程数超过平均值的两倍,所以复制block的时候找不到正常的节点。

解决方法:

调整hdfs-site.xml的以下参数,并重启Namenode解决,此参数用来关闭负载的判断。

 
        dfs.namenode.replication.considerLoad
        false
   

你可能感兴趣的:(hadoop)