**본 글은 제미나이로 작성됨**
1. HBase는 HDFS의 '클라이언트'
HBase의 RegionServer는 HDFS 입장에서는 수많은 데이터를 읽고 쓰는 HDFS Client 중 하나이다.
- 통신 방식: HBase는 HDFS의 NameNode와 통신하여 데이터의 위치(메타데이터)를 확인하고, 실제 데이터(Block)를 주고받을 때는 DataNode와 직접 통신.
- 파일 형식: HBase는 데이터를 HFile이라는 특수한 포맷으로 변환하여 HDFS 상의 특정 경로(/hbase/data/...)에 저장.
2. 주요 통신 발생 시점
HBase가 HDFS와 주요 통신하는 시점은 크게 세 가지
① WAL(Write Ahead Log) 기록 (실시간 쓰기)
- 내용: 데이터 유실을 막기 위해 메모리(MemStore)에 적재하기 전, 로그를 먼저 HDFS에 씀
- 특징: 순차 쓰기(Sequential Write) 방식으로 매우 빠르지만, HDFS 네트워크가 느려지면 HBase 전체 쓰기 성능이 저하
② Flush (메모리 → 디스크)
- 내용: MemStore가 가득 차면 이를 하나의 HFile로 만들어 HDFS에 저장
- 특징: 메모리 상의 정렬된 데이터를 파일로 "덤프(Dump)"하는 과정
③ Compaction (읽기 + 쓰기 병합)
- 내용: HDFS에 흩어져 있는 여러 HFile을 읽어서 하나로 합친 뒤, 다시 HDFS에 새 파일로 씀
- 특징: 가장 많은 I/O 부하가 발생하는 구간
3. 성능의 핵심: 데이터 지역성 (Data Locality)
HBase와 HDFS 통신에서 가장 중요한 개념은 "데이터가 같은 서버에 있는가?"
- 원격 통신 (Remote Read/Write): RegionServer가 다른 노드에 있는 DataNode의 파일을 가져오는 경우로, 네트워크 대역폭을 소모 해야하기 때문에 속도가 느림
- 지역 통신 (Local Read/Write): RegionServer와 DataNode가 같은 물리 서버에 존재하는 경우로, 네트워크를 타지 않고 내부 버스를 통해 데이터를 가져오므로 압도적으로 빠름
Short-Circuit Local Reads: HBase는 데이터 지역성이 확보된 경우, 네트워크 소켓을 거치지 않고 직접 로컬 디스크 파일 서스크립터를 열어 읽는 'Short-Circuit' 기능을 사용. 이는 HDFS 통신 비용을 획기적으로 줄여줌.
4. 통신 병목 현상이 발생하면?
HDFS와의 통신에 문제가 생기면 HBase는 다음과 같은 증상을 보임
- Zookeeper 타임아웃: HDFS의 I/O가 밀리면서 RegionServer가 응답을 못 하면, Zookeeper가 해당 서버를 "죽은 것"으로 판단하여 클러스터에서 제외
- Pipeline Recovery 지연: HDFS는 설정한 수의 복제본(Replica)을 만드는데, 이 복제 과정에서 네트워크 병목이 생기면 HBase의 put 작업이 대기 상태에 빠짐
- Compaction 쓰로틀링: HDFS I/O 압박이 심하면 HBase 스스로 내부 작업 속도를 늦춤
매커니즘 상 저장을 위해 통신을 계속해서 해야하기 때문에, 대량의 데이터 유입으로 인해 네트워크 I/O가 부족해질 경우 SIGKILL까지 발생 가능