hbase org.apache.hadoop.hbase.mapreduce.Export로 매일 백업을 도는데, 프로세스가 간헐적으로 멈춰(stuck) 정상 종료되지 않는다.
HBASE-13851, HBASE-14241 두 수정이 상호작용해 특정 조건에서 커넥션 종료가 무한 대기하는 결함이 있음이 확인됐다(관련 데드락은 이후 HBASE-15957로 더 다뤄졌다). 원본 케이스는 근본 핫픽스 적용 여부까지 확인하지 못했고, snapshot 전환은 이 문서가 제안하는 회피책이다.
HBase RPC 클라이언트의 연결 종료 로직 결함(HBASE-13851과 HBASE-14241의 상호작용)으로 커넥션이 스레드 풀에 영구히 남아 rpcClient.close()가 끝나지 않는 경우이며, 정식 수정 전까지는 Export 대신 HBase snapshot 기반 백업으로 전환하는 것이 우회책이다.
확인 수준: 추가 조사 해법 · 해당 케이스 적용 결과 미확인
적용 조건: <...>와 예시 DB·테이블·경로·수치는 실제 확인값으로 바꾼다. 명령과 메뉴는 참고 문서를 바탕으로 보강한 예시이며 대상 시스템에서 실행하지 않았다. 버전·원인에 따른 분기와 남은 확인 사항은 아래에 명시한다.
jstack '<export-process-pid>' > export_threaddump_$(date +%Y%m%d_%H%M%S).txt
grep -A 20 "RpcClientImpl" export_threaddump_*.txt
region replica 관련 RPC가 취소되는 상황(HBASE-13851)과 쓰기 스레드 인터럽트 처리(HBASE-14241)가 겹치면 커넥션이 close 처리 대상에서 빠져 스레드 풀에 영구히 남을 수 있다. 로그 레벨을 org.apache.hadoop.hbase.ipc로 올려 관련 커넥션의 markClosed/close 호출 순서를 확인한다.
Export 기반 백업을 HBase snapshot 기반으로 전환한다. snapshot은 온라인 상태에서 짧은 메타데이터 작업만으로 뜨고, 실제 백업 전송은 별도 시점에 export-snapshot으로 수행할 수 있어 위 커넥션 정리 결함의 영향을 받는 경로 자체를 피한다.
echo "snapshot '<table>', '<table>-snapshot-$(date +%Y%m%d)'" | hbase shell
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot '<table>-snapshot-$(date +%Y%m%d)' \
-copy-to '<hdfs-backup-dir>'
전환한 snapshot 기반 백업이 매일 정상 완료되는지, 기존 Export 방식에서 발생하던 hang이 더 이상 나타나지 않는지 확인한다.