단락 읽기(Short Circuit Local Reads) 최적화
개요
HDFS의 기본 읽기 방식은 DFSClient가 데이터 노드에 위치한지 여부와 관계없이 동일하게 동작합니다. 데이터 노드가 디스크에서 블록을 읽은 후 TCP 기반 RPC를 통해 DFSClient에 전달하는 구조입니다. 이 방식은 구현이 단순하지만, 동일 노드에 클라이언트와 데이터가 존재할 경우 불필요한 중간 단계로 인해 지연이 발생합니다.
단락 읽기는 이러한 비효율을 해결하기 위해, 로컬 환경에서 데이터 노드를 우회하고 클라이언트가 직접 파일에 접근하는 메커니즘입니다. 이를 통해 네트워크 스택을 거치지 않고 메모리 매핑 방식으로 데이터에 접근하여 지연 시간을 크게 줄일 수 있습니다.
구현 원리
리눅스의 Unix Domain Socket(UDS) 기술을 활용하여 프로세스 간 통신을 구현합니다. 데이터 노드가 대상 파일의 파일 디스크립터(FD)를 획하여 UDS 채널을 통해 클라이언트에 전달하면, 클라이언트는 해당 디스크립터를 통해 직접 파일 시스템에 접근합니다.
통신 경로는 일반적으로 /var/lib 또는 /var/run 하위에 생성되며, 데이터 노드와 클라이언트 간 정보 교환을 위해 /dev/shm의 공유 메모리 영역을 활용합니다. 소켓 경로는 HDFS 실행 계정과 root만 접근 가능하도록 권한이 제한되어야 합니다.
핵심 설정 항목
| 설정 항목 | 기본값 | 설명 |
|---|---|---|
| dfs.client.read.shortcircuit | false | 단락 읽기 기능 활성화 |
| dfs.domain.socket.path | 미설정 | UDS 소켓 파일 경로(_PORT는 데이터 노드 포트로 치환) |
| dfs.client.read.shortcircuit.skip.checksum | false | 체크섬 검증 생략(주의 필요) |
| dfs.client.read.shortcircuit.streams.cache.size | 256 | 파일 디스크립터 캐시 크기 |
| dfs.client.read.shortcircuit.streams.cache.expiry.ms | 300000 | 캐시 항목 만료 시간(밀리초) |
설정 예시
<configuration>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-udx/dn._PORT</value>
</property>
<property>
<name>dfs.client.read.shortcircuit.streams.cache.size</name>
<value>512</value>
</property>
</configuration>
네이티브 라이브러리 확인
$ hadoop checknative -a
hadoop: true /opt/hadoop/lib/native/libhadoop.so.1.0.0
snappy: true /usr/lib64/libsnappy.so.1
ISA-L: false # 선택적 가속 라이브러리
클러스터 레벨 블록 재분산
균형 조정 개념
데이터 노드 확장, 노드 장애 복구 등의 상황에서 블록 분포가 고르지 않게 될 수 있습니다. HDFS Balancer는 데이터 노드 간 저장소 사용률 편차를 임계값 이내로 조정하는 도구입니다.
균형 상태는 각 노드의 사용률(사용 용량/전체 용량)이 클러스터 전체 사용률과 특정 임계값(기본 10%) 이내일 때 달성됩니다.
실행 명령 구조
# 대역폭 제한 설정(바이트/초)
hdfs dfsadmin -setBalancerBandwidth 104857600 # 100MB/s
# 균형 조정 실행
hdfs balancer \
-threshold 5 \
-policy datanode \
-exclude -f /tmp/exclude_nodes.txt \
-idleiterations 10
주요 옵션
-threshold: 허용 가능한 사용률 편차(0~100)-policy:datanode(기본) 또는blockpool(페더레이션 환경)-source: 소스 노드로만 지정된 노드 사용-runDuringUpgrade: 업그레이드 중에도 실행(권장하지 않음)
노드 내부 디스크 재분산
배경
단일 데이터 노드에 여러 디스크를 구성하는 경우, 블록 할당 정책(라운드 로빈 또는 여유 공간 기반)에도 불구하고 장기 운영 중 디스크 간 불균형이 발생합니다. 디스크 교체, 데이터 삭제 패턴, 신규 디스크 추가 등이 원인입니다.
Hadoop 3.0부터 도입된 Disk Balancer는 데이터 노드 내부의 볼륨 간 블록 이동을 담당합니다. 클러스터 레벨 Balancer와의 차이점을 명확히 구분해야 합니다.
데이터 밀도 메트릭
Disk Balancer는 두 가지 메트릭으로 불균형을 측정합니다.
볼륨 데이터 밀도(Volume Data Density)
이상 저장 비율 = Σ(모든 디스크 사용량) / Σ(모든 디스크 용량)
볼륨 저장 비율 = 단일 디스크 사용량 / 단일 디스크 용량
볼륨 데이터 밀도 = 이상 저장 비율 - 볼륨 저장 비율
양수 값은 해당 디스크가 추가 데이터 수용이 가능함을, 음수 값은 과밀 상태를 의미합니다.
노드 데이터 밀도(Node Data Density)
모든 볼륨의 데이터 밀도 합산으로 계산되며, 값이 클수록 해당 노드의 재분산이 필요함을 나타냅니다.
실행 절차
# 1. 실행 계획 수립
hdfs diskbalancer -plan dn-host-01 \
-out /tmp/diskbalancer \
-bandwidth 50m \
-thresholdPercentage 5
# 2. 계획 실행
hdfs diskbalancer -execute /tmp/diskbalancer/dn-host-01.json
# 3. 진행 상황 확인
hdfs diskbalancer -query dn-host-01 -v
# 4. 작업 취소(필요 시)
hdfs diskbalancer -cancel /tmp/diskbalancer/dn-host-01.json
삭제 코딩(Erasure Coding) 저장 최적화
복제 방식의 한계
3중 복제는 단순하고 안정적이지만 저장 효율이 33%에 머무릅니다. N개 복제 시 N-1개의 장애를 견딜 수 있으나, 저장 오버헤드는 (N-1)/N × 100%입니다.
삭제 코딩 원리
데이터를 여러 개의 데이터 청크와 패리티 청크로 분할하여 저장합니다. RS(6,3) 정책의 경우 6개 데이터 블록에 3개 패리티 블록을 생성하여 총 9개 블록으로 구성됩니다. 이 구성은 3개까지의 블록 실을 복구할 수 있으며, 저장 효율은 67%(6/9)로 3중 복제 대비 2배 향상됩니다.
하드웨어 요구사항
- CPU: 인코딩/디코딩 연산 부하 증가
- 네트워크: 랙 단위 분산으로 랙 내 통신 비중 상승
- 랙 구성: 랙 복구를 위해 랙 수 ≥ (데이터 블록 + 패리티 블록) / 패리티 블록
Intel ISA-L 가속
RS 코덱의 네이티브 구현은 Intel ISA-L(Intelligent Storage Acceleration Library)을 활용하여 연산 속도를 향상시킵니다.
# ISA-L 설치 확인
$ hadoop checknative
...
ISA-L: true /lib64/libisal.so.2
정책 관리 명령
# 사용 가능한 정책 목록
hdfs ec -listPolicies
# 특정 정책 활성화
hdfs ec -enablePolicy -policy RS-3-2-1024k
# 디렉터리에 정책 적용(신규 파일에만 적용)
hdfs ec -setPolicy -path /warehouse/cold_data -policy RS-6-3-1024k
# 정책 조회
hdfs ec -getPolicy -path /warehouse/cold_data
# 정책 제거(상속된 정책은 제거 불가)
hdfs ec -unsetPolicy -path /warehouse/cold_data
# REPLICATION으로 복귀
hdfs ec -setPolicy -path /warehouse/hot_data -replicate
주요 정책 유형
| 정책명 | 구성 | 복구능력 | 저장효율 |
|---|---|---|---|
| RS-6-3-1024k | 6+3 | 3 | 66.7% |
| RS-3-2-1024k | 3+2 | 2 | 60% |
| XOR-2-1-1024k | 2+1 | 1 | 66.7% |
| RS-10-4-1024k | 10+4 | 4 | 71.4% |