DataNode 의 데이터 디렉터리를 지웠거나 디스크를 교체한 뒤 Under replicated blocks 수치가 올라간다. Missing blocks 까지 나오면 복제본이 하나도 남지 않은 블록이 있다는 뜻이다.
hdfs dfsadmin -report | head -20
hdfs fsck / | tail -30
hdfs fsck / -list-corruptfileblocks
hdfs fsck /path -files -blocks -locations | grep -i 'Under replicated' | head
hdfs fsck / 요약에서 다음을 구분한다. Under-replicated blocks 는 복제본 수가 목표보다 적지만 데이터는 살아 있는 상태이며, NameNode 가 스스로 복제한다. Missing blocks 와 Corrupt blocks 는 복구 가능한 복제본이 없는 상태다.
NameNode 는 블록 리포트를 받아 부족한 복제본을 스스로 만든다. 속도가 느리면 복제 작업량 상한을 일시적으로 올린다.
hdfs dfsadmin -report | grep -i 'Under replicated'
hdfs dfsadmin -setBalancerBandwidth 104857600
복제 속도에 직접 영향을 주는 값은 dfs.namenode.replication.max-streams 와 dfs.namenode.replication.work.multiplier.per.iteration 이다. 값을 올리면 복구는 빨라지지만 네트워크와 디스크를 더 쓴다. 변경에 NameNode 재시작이 필요하므로 급하지 않다면 기본값으로 두고 기다린다.
특정 경로의 복제 수를 직접 조정할 수도 있다.
hdfs dfs -setrep -w 3 /user/hive/warehouse/mytable
복제본이 전혀 없는 블록은 되살릴 수 없다. 원본이 남아 있다면 다시 적재하고, 그렇지 않으면 해당 파일을 제거해 fsck 상태를 정리한다.
hdfs fsck / -list-corruptfileblocks
hdfs fsck /path/to/file -delete
-delete 는 손상된 블록을 가진 파일을 지운다. 실행 전에 목록을 남기고 업무 담당자와 확인한다.
hdfs namenode -format 은 이 상황의 해법이 아니다. 네임스페이스 메타데이터를 초기화해 파일 전체에 접근할 수 없게 만든다. DataNode 의 블록 파일은 남지만 매핑이 사라져 사실상 복구가 불가능하다. 클러스터를 처음 구축할 때만 쓴다.
교체한 디스크를 다시 붙일 때는 dfs.datanode.data.dir 의 경로·권한·소유자를 확인하고 DataNode 만 재시작한다. NameNode 는 건드리지 않는다.
hdfs getconf -confKey dfs.datanode.data.dir
ls -ld /data/1/dfs/dn /data/2/dfs/dn