네임노드가 시작 시, 진행되는 과정은 다음과 같습니다.
- fsimage를 메모리에 로딩
- editlog를 읽어 fsimage에 반영 (체크포인팅)
- 데이터노드가 블록리포트를 보내줌
- safemode에 진입하고, 데이터노드가 보내준 블록리포트 정보를 토대로 블록 복제수가 일정 수준까지 만족했는지 확인한다.
- 만족했으면 safemode에서 빠져나온다.
네임노드가 SafeMode시에는 HDFS 읽기는 가능하나 HDFS 쓰기가 불가능합니다.
블록 복제수가 일정 수준(dfs.namenode.safemode.threshold-pct = 0.999f)을 만족하는지 확인 되어야 safemode를 빠져나옵니다.
예를 들어 전체 블록수가 900개(300*3)라고 해보자. 그러면 블록 복제수가 900개 x 0.999f 개가 있다는 것이 확인 되어야 safemode를 빠져나온다는 뜻이다.
그러나,데이터노드가 블록리포트를 보내주지 않는다면? 혹은 블록리포트를 보내주는데 오래 걸린다면?
네임노드는 블록 복제수를 확인할 수가 없게 된다. 그러니 블록 복제수가 900개 x 0.999f 를 만족한다고 확인이 되지 않아 계속 safemode에 머물게 될 것이다.
네임노드는 dfs.namenode.name.dir 로 설정된 경로(로컬 디스크)에 메타데이터(fsimage, edits log 등)를 저장한다. dfs.namenode.du.reserved 로 설정한 여유용량(디폴트 100MB)이 남아 있지 않다면 safemode에 진입한다.
이 경우, 네임노드 디스크 공간을 확보한 후에 safemode에서 빠져나와야 한다.
sudo -uhdfs hadoop dfsadmin -safemode leave
하둡 쓰기 작업을 멈추고 유지보수 작업을 하고 싶은 경우 관리자가 수동으로 safemode를 켤 수 있다.
sudo -uhdfs hadoop dfsadmin -safemode enter
현재 safemode 상태를 확인할 수도 있다.
sudo -uhdfs hadoop dfsadmin -safemode get
유지보수 작업을 마친 후에는 직접 safemode에서 빠져나오도록 한다.
sudo -uhdfs hadoop dfsadmin -safemode leave