아침에 출근을 하면서 회사메일을 체크하니 대량의 메일이 와 있었다.
이렇게 대량의 메일이 왔다는건 99% 잡에러다. 아니나다를까 ㅠ.ㅠ
아마 전날있었던 하둡서버 Ghost패치의 영향일거라 생각하며 회사로 향했다.
조사결과 전날 패치작업한 서버(데이터노드)중 한대가 맛이 갔다.
원인은 Ghost패치후 nscd(네임서버캐쉬디렉토리?)프로세스가 대량발생
이부분에 대해서는 다른 글에 자세히 적고... 본론으로
데이터노드 장애로 인해 모든(?)잡이 실패하여
문제의 데이터노드를 하둡구성에서 제외 시키고 모든 잡을 재실행 하였다.
다른 업무를 보면서 수동으로 재실행을 하다 보니 퇴근시간이 다 되서야 끝났다.
혹시나 하는 맘에 데이터건수 확인...허걱
평소보다 데이터가 많다.. 좀 더 자세히 데이터를 확인.. 젠장
모든 잡이 완전히 실패했다고 생각했었는데 일부 데이터가 정상(?)취득 되었던것
확인했어야하는데..후회해도 이미 늦었다.
결국 재실행으로 인해 이중으로 취득된 데이터가 발생 ㅠ.ㅠ
데이터노드장애 발생시 새벽에 취득된 데이터는 신용할 수 없으므로 요놈들은 지우기로 결정
그러나...새벽에 취득된 데이터를 어떻게 발라내지? hdfs 커맨드에는 find가 없잖아.
결국 생각해낸게 요것...
재실행으로 취득한 데이터는 갱신시간이10시이후 이므로 00~09시 사이의 데이터를 grep
hdfs dfs -ls /user/hive/warehouse/xxxxx.db/*/dt=2015-02-05 | grep "2015-02-06 0" > ~/xxxxx_hdfs_delete_list.txt
스페이스로 잘라서 화일명만 추려내기 위해 일단 연속스페이스는 스페이스하나로 치환
sed 's/\s\{1,\}/ /g' ~/xxxxx_hdfs_delete_list.txt > ~/xxxxx_hdfs_delete_list_del_space.txt
스페이스로 잘랐을때 8번째 필드가 화일명이므로 해당 필드만 취득
cut -d' ' -f8 ~/xxxxx_hdfs_delete_list_del_space.txt > ~/xxxxx_hdfs_delete_list_last.txt
삭제할 파일 리스트가 dfs -ls 로 제대로 표시되는지 확인
hdfs dfs -ls `cat ~/xxxxx_hdfs_delete_list_last.txt` |less
삭제!
hdfs dfs -rm -r `cat ~/xxxxx_hdfs_delete_list_last.txt` > ~/xxxxx_hdfs_delete.log
암튼 이렇게 하여 에러대응은 일단락
그나저나 데이터노드 장애는 어떻게 대책을 마련해야하나...
'Hadoop' 카테고리의 다른 글
블록 사이즈가 다른 클러스터 간의 distcp (0) | 2015.05.13 |
---|---|
dfs.datanode.data.dir 와 dfs.datanode.failed.volumes.tolerated 에 관해 (0) | 2015.01.13 |
Hadoop 관련 유용한 커맨드 모음 (0) | 2015.01.09 |
org.apache.hadoop.hdfs.BlockMissingException 에러 (0) | 2015.01.08 |