gruter 님 hadoop 장애 복구
- Posted at 2008/08/18 14:45
- Filed under project/lucene_hadoop
일요일 오전 PC를 켜자 마자 gruter님이 갑자기 메신저를 연결하였습니다. Namenode가 죽어서 올라오지 않는다. 라는 메세지와 함께요...
다음은 Namenode 장애 해결한 과정입니다.
1. Namenode log 확인
일단 Namenode를 로그를 보니 다음과 같은 로그가 있습니다.
WARN org.apache.hadoop.dfs.FSNamesystem: java.io.IOException: No space left on device
Namenode에 새로운 파일이 추가되는 경우 파일정보는 메모리에 저장되지만 shutdown된 후 다시 정보를 가져오기 위해서는 Namenode의 로컬 디스크에 파일로 저장합니다.
2. 디스크 파티션 용량 확인
df -k
conf에 설정된 "dfs.name.dir" 디렉토리 할당된 파티션의 용량을 보니 remain이 0이네요.
3. Namenode restart
Namelog에 다음과 같은 에러 로그가 나타나면서 namenode kill 됨
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at org.apache.hadoop.io.UTF8.readFields(UTF8.java:106)
at org.apache.hadoop.io.ArrayWritable.readFields(ArrayWritable.java:90)
at org.apache.hadoop.dfs.FSEditLog.loadFSEdits(FSEditLog.java:433)
at org.apache.hadoop.dfs.FSImage.loadFSEdits(FSImage.java:759)
at org.apache.hadoop.dfs.FSImage.loadFSImage(FSImage.java:639)
at org.apache.hadoop.dfs.FSImage.recoverTransitionRead(FSImage.java:222)
at org.apache.hadoop.dfs.FSDirectory.loadFSImage(FSDirectory.java:79)
at org.apache.hadoop.dfs.FSNamesystem.initialize(FSNamesystem.java:254)
at org.apache.hadoop.dfs.FSNamesystem.<init>(FSNamesystem.java:235)
at org.apache.hadoop.dfs.NameNode.initialize(NameNode.java:131)
at org.apache.hadoop.dfs.NameNode.<init>(NameNode.java:176)
at org.apache.hadoop.dfs.NameNode.<init>(NameNode.java:162)
at org.apache.hadoop.dfs.NameNode.createNameNode(NameNode.java:846)
at org.apache.hadoop.dfs.NameNode.main(NameNode.java:855)
원인 분석 결과
"filesystem/name/current"에 있는 edits.new 파일에 마지막 레코드가 일부 byte만 쓰여지고 나머지 byte는 용량부족으로 저장되지 못한 상태에서 Namenode는 이 데이터를 읽다보니 EOFException이 발생 하였습니다.
4. Secondary Namenode에 백업본 확인
불행하게도 Hadoop Q&A에 있는 Secondary Namenode의 접속 오류 문제로 인해 백업을 못받고 있었습니다.
5. Rsync 버전 확인
다행히 "filesystem/name" 디렉토리를 rsync하고 있었는데 파일 확인해본 결과 원본과 동일하게 sync되어 역시 사용할 수 없었습니다.
6. edits 파일과 edits.new파일 시간 확인
두개의 파일 시간이 2시간 정도만 있어서 일단 2시간 동안의 파일 변경 사항은 포기하기로 했습니다.
7. edits.new rename
edits.new 파일을 edits.new_bak로 rename 한 후 Namenode를 시작하였습니다.
정상적으로 NameNode는 시작되었습니다. 전체적인 파일 볼륨에는 큰 문제가 없었습니다. 물론 2시간 사이에 입력된 파일은 유실 되었습니다.
8. 디스크 용량 확보
디스크를 확인해보니 hadoop/logs 디렉토리가 대부분의 용량을 다 차지하고 있었습니다.(9 GB 이상) 일단 불필요한 과거 로그를 삭제하였습니다.
로그가 많이 쌓인 원인은 사용자가 만든 프로그램에서 반복문을 돌면서 계속 파일을 오픈하는 프로그램이 있었는데 여기서 잘못된 파일 디렉토리를 지정하였습니다.
Namenode에는 다음과 같은 로그가 ms 단위로 한줄씩 작성되고 있었습니다.
java.io.IOException: Cannot open filename /file/aaa
at org.apache.hadoop.dfs.NameNode.open(NameNode.java:243)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:409)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:899)
이런 메세지가 나타나지 않도록 하기 위해서는 Namenode의 로그레벨을 WARN으로 올리는 방법이 있지만 INFO를 못보기 때문에 일단은 기존대로 한 다음에 로그 디렉토리를 주기적으로 지원주는 방법으로 가기로 했습니다.
9. fsck로 확인
bin/hadoop fsck /
이상 장애 긴급 장애 복구 상황이었습니다.
수 TB이상 유지하고 있는 클러스터라 함부로 다루는 것이 조심스러웠습니다. 이런 장애복구는 처음이라서 공유하는 차원에서 정리해봤습니다.
Posted by 김형준
- Response
- No Trackback , 3 Comments





















