IL-0457 LINE · 2019-02-15 (게시일)database
로그 수집 Hadoop 클러스터의 HA HDFS NameNode 가 오전 9시쯤 가끔씩 failover 됐다
LINE Data Labs 는 fluentd 로 각 서버의 접속 로그와 애플리케이션 로그를 모으는 Hadoop 클러스터를 운영한다. 클러스터는 HDP-2.6.1.0 이고 HDFS 버전은 2.7.3 이다. 로그 파일은 매시간 ETL 배치로 Hive 테이블에 등록된다. 배치의 마지막 단계에서 ALTER TABLE ... DROP PARTITION 으로 지운 중간 테이블 파일은 .Trash 디렉터리로 옮겨진다. 이 클러스터의 HA 구성 HDFS NameNode 가 오전 9시쯤 가끔씩 failover 됐다.
ZooKeeper Failover Controller 로그에는 NameNode 헬스 체크가 60000 millis 타임아웃에 걸린 기록이 남았다. failover 직전 NameNode 로그를 보니 TrashPolicyDefault 가 .Trash 디렉터리를 비우기 시작했고, 디렉터리 하나를 지우면서 FSNamesystem write lock 이 36094 ms 동안 잡혀 있었다. 이어서 블록을 지우는 동안 1~7초의 GC pause 가 나며 write lock 이 계속 잡혔다. 그사이 NameNode RPC Client Port 큐에 처리되지 못한 RPC 호출이 3,500개 정도 쌓였다. ZooKeeper Failover Controller 의 헬스 체크도 같은 포트로 들어가 큐에서 오래 기다리다 타임아웃됐고, 그 결과 failover 가 난 것으로 보였다.
팀은 fs.trash.interval 을 4320 에서 1440 으로 바꿔 .Trash 파일을 3일이 아니라 1일 간격으로 지우게 했다. .Trash 파일을 지울 때 write lock 이 잡히는 시간을 줄이려는 조치였다. 또 dfs.namenode.servicerpc-address 로 Service RPC port 를 따로 설정하기로 했다. Service RPC port 는 ZooKeeper Failover Controller 와 DataNode 의 헬스 체크를 받는 전용 포트다. 이 포트를 쓰면 RPC Client Port 큐에 호출이 쌓여도 NameNode 가 헬스 체크에 지연 없이 응답할 수 있다.
- 심각도
- –
- 영향 범위
- The HA HDFS NameNode of the log-collection Hadoop cluster failed over now and then around 09:00
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
LINE Data Labs 의 로그 수집 Hadoop 클러스터에서 HA 구성의 HDFS NameNode 가 오전 9시쯤 가끔씩 failover 됐다. failover 의 직접 원인은 ZooKeeper Failover Controller 의 NameNode 헬스 체크가 60초 타임아웃에 걸린 것으로 보였다.
failover 때 ZooKeeper Failover Controller 로그에는 아래 경고가 남았다. 09:03:08,165 WARN ha.HealthMonitor (HealthMonitor.java:doHealthChecks(211)) - Transport-level exception trying to monitor health of NameNode at xxxx/xxx.xxx.xxx.xxx:xxxx: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read.
failover 직전 NameNode 로그를 보면 09:00:30 에 .Trash 디렉터리를 비우는 작업이 시작됐다. 디렉터리 하나를 지우는 동안 FSNamesystem write lock 이 약 36초 동안 잡혀 있었다. 09:00:30,574 INFO fs.TrashPolicyDefault (TrashPolicyDefault.java:deleteCheckpoint(319)) - TrashPolicyDefault#deleteCheckpoint for trashRoot: hdfs://xxxx/user/hive/.Trash 09:01:06,673 INFO namenode.FSNamesystem (FSNamesystem.java:writeUnlock(1659)) - FSNamesystem write lock held for 36094 ms via
그 뒤에도 블록을 지우는 동안 1~7초짜리 GC pause 가 나면서 write lock 이 계속 잡혔다. 09:01:17,955 INFO util.JvmPauseMonitor (JvmPauseMonitor.java:run(196)) - Detected pause in JVM or host machine (eg GC): pause of approximately 1487ms
이때 NameNode RPC Client Port 의 큐에는 처리되지 못한 RPC 호출이 3,500개 정도 쌓여 있었다. ZooKeeper Failover Controller 도 헬스 체크를 이 RPC Client Port 로 보내고 있었기 때문에, 헬스 체크 요청 역시 큐에서 오래 기다리다 타임아웃됐다.
원인
- 촉발
- 오전 9시쯤 NameNode 가 .Trash 디렉터리에 쌓인 삭제된 로그 데이터 파일을 지우는 작업을 시작했다. fs.trash.interval 이 4320 분이어서 .Trash 아래 파일은 3일 간격으로 지워지고 있었다.
감지
–
조치
- fs.trash.interval 을 4320 에서 1440 으로 바꿔 .Trash 디렉터리 아래 파일을 3일이 아니라 1일 간격으로 지우게 했다. .Trash 파일을 지울 때 FSNamesystem write lock 이 잡히는 시간을 줄이려는 조치였다.
- dfs.namenode.servicerpc-address.mycluster.nn1=mynamenode1:8040 과 dfs.namenode.servicerpc-address.mycluster.nn2=mynamenode2:8040 을 추가해 ZooKeeper Failover Controller 의 헬스 체크가 RPC Client Port 대신 Service RPC port 를 쓰게 했다.
후속 조치
–
교훈
–
출처
관련 사례
IL-013760노드 B200 학습 클러스터에서 노드들의 작은 랜덤 I/O 가 VAST 스토리지의 메타데이터 서비스를 포화시켜 학습 초기화가 8시간 넘게 걸렸다Lablup Inc · 2026같은 원인 · 공통 공유 네트워크 파일 시스템
IL-0129SmolLM3 사전 학습에서 공유 Weka 스토리지가 데이터셋 샤드를 S3 로 내보내고 Nanotron 데이터로더의 인덱스가 스텝마다 커지면서, 학습을 시작한 지 몇 시간 만에 처리량이 거듭 급락했다.Hugging Face · 2025같은 원인 · 공통 공유 네트워크 파일 시스템
같은 원인 · 공통 데이터베이스 장애 조치 관리자
같은 원인 · 공통 데이터베이스 장애 조치 관리자
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0457
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0457/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.