📊 데이터공학

Hadoop

Apache Hadoop

분산 저장/처리 프레임워크. HDFS와 MapReduce 기반. 빅데이터 처리의 초기 표준.

상세 설명

Apache Hadoop은 대규모 데이터 세트를 분산 처리하기 위한 오픈소스 프레임워크입니다. Google의 GFS와 MapReduce 논문을 기반으로 개발되어 빅데이터 시대를 여는 핵심 기술이 되었습니다.

Hadoop의 핵심 구성요소

  • HDFS (Hadoop Distributed File System): 대용량 파일을 여러 노드에 분산 저장하는 파일 시스템
  • YARN (Yet Another Resource Negotiator): 클러스터 리소스 관리 및 작업 스케줄링
  • MapReduce: 분산 데이터 처리 프로그래밍 모델
  • Hadoop Common: 공통 유틸리티 및 라이브러리

HDFS 아키텍처

구성요소역할특징
NameNode메타데이터 관리파일 위치, 블록 정보 저장
DataNode실제 데이터 저장블록 단위(128MB) 저장
Secondary NameNode체크포인트 생성NameNode 백업 아님
Block데이터 저장 단위기본 3중 복제

YARN 아키텍처

구성요소역할설명
ResourceManager글로벌 리소스 관리클러스터 전체 리소스 할당
NodeManager노드별 리소스 관리컨테이너 실행 및 모니터링
ApplicationMaster애플리케이션 관리작업별 리소스 협상
Container실행 환경CPU, 메모리 할당 단위

코드 예제

HDFS 설정 (hdfs-site.xml)

<!-- hdfs-site.xml: HDFS 설정 -->
<configuration>
    <!-- 블록 복제 계수 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>기본 블록 복제 수</description>
    </property>

    <!-- 블록 크기 (128MB) -->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>

    <!-- NameNode 데이터 디렉토리 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///hadoop/hdfs/namenode</value>
    </property>

    <!-- DataNode 데이터 디렉토리 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///hadoop/hdfs/datanode</value>
    </property>

    <!-- NameNode HA 설정 (선택) -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>namenode1:8020</value>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>namenode2:8020</value>
    </property>

    <!-- 자동 Failover 활성화 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>

YARN 설정 (yarn-site.xml)

<!-- yarn-site.xml: YARN 설정 -->
<configuration>
    <!-- ResourceManager 호스트 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>resourcemanager</value>
    </property>

    <!-- NodeManager 메모리 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>65536</value>
        <description>노드당 할당 가능한 메모리 (64GB)</description>
    </property>

    <!-- NodeManager CPU 코어 -->
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>16</value>
    </property>

    <!-- 최소 컨테이너 메모리 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
    </property>

    <!-- 최대 컨테이너 메모리 -->
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>32768</value>
    </property>

    <!-- Shuffle 서비스 활성화 (MapReduce/Spark용) -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle,spark_shuffle</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>

    <!-- ResourceManager HA 설정 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-cluster</value>
    </property>

    <!-- Fair Scheduler 설정 -->
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
</configuration>

HDFS CLI 명령어

# HDFS 기본 명령어

# 디렉토리 목록 조회
hdfs dfs -ls /user/hadoop/data

# 디렉토리 생성
hdfs dfs -mkdir -p /user/hadoop/input

# 로컬 파일을 HDFS로 업로드
hdfs dfs -put local_file.csv /user/hadoop/input/
hdfs dfs -copyFromLocal large_data.parquet /user/hadoop/input/

# HDFS 파일을 로컬로 다운로드
hdfs dfs -get /user/hadoop/output/result.csv ./
hdfs dfs -copyToLocal /user/hadoop/output/* ./local_output/

# 파일 내용 확인
hdfs dfs -cat /user/hadoop/input/sample.txt
hdfs dfs -head /user/hadoop/input/large_file.csv  # 첫 1KB
hdfs dfs -tail /user/hadoop/output/log.txt        # 마지막 1KB

# 파일/디렉토리 삭제
hdfs dfs -rm /user/hadoop/temp/old_file.txt
hdfs dfs -rm -r /user/hadoop/temp/                # 재귀 삭제

# 파일 이동/이름 변경
hdfs dfs -mv /user/hadoop/input/old.csv /user/hadoop/input/new.csv

# 복제 계수 변경
hdfs dfs -setrep -w 2 /user/hadoop/archive/

# 디스크 사용량 확인
hdfs dfs -du -h /user/hadoop/
hdfs dfs -df -h  # 전체 클러스터 용량

# 파일 시스템 점검
hdfs fsck /user/hadoop/data -files -blocks

# 클러스터 리포트
hdfs dfsadmin -report

Python에서 HDFS 접근 (hdfs 라이브러리)

# Python으로 HDFS 파일 시스템 접근
from hdfs import InsecureClient
import pandas as pd

# HDFS 클라이언트 생성
client = InsecureClient('http://namenode:9870', user='hadoop')

# 디렉토리 목록 조회
files = client.list('/user/hadoop/data')
print(f"파일 목록: {files}")

# 파일 업로드
client.upload('/user/hadoop/input/data.csv', 'local_data.csv')

# 파일 다운로드
client.download('/user/hadoop/output/result.csv', 'local_result.csv')

# 파일 직접 읽기 (with문 사용)
with client.read('/user/hadoop/data/sample.csv', encoding='utf-8') as reader:
    df = pd.read_csv(reader)
    print(df.head())

# 파일 쓰기
with client.write('/user/hadoop/output/processed.json', encoding='utf-8') as writer:
    import json
    json.dump({'result': 'success', 'count': 1000}, writer)

# 디렉토리 생성
client.makedirs('/user/hadoop/new_project/input')

# 파일 삭제
client.delete('/user/hadoop/temp/old_file.txt')

# 상태 정보 조회
status = client.status('/user/hadoop/data/large_file.parquet')
print(f"파일 크기: {status['length']} bytes")
print(f"복제 계수: {status['replication']}")

실무 대화 예시

주니어 엔지니어: "Hadoop 클러스터 구축하려는데, NameNode HA는 꼭 필요한가요?"
시니어 엔지니어: "프로덕션이면 필수야. NameNode가 SPOF(단일 장애점)라서, HA 없으면 NameNode 장애 시 전체 클러스터가 멈춰. ZooKeeper로 자동 Failover 설정해야 해."
주니어 엔지니어: "YARN 메모리 설정은 어떻게 하면 좋을까요? 노드에 128GB 메모리가 있는데..."
시니어 엔지니어: "OS와 다른 데몬용으로 최소 20% 남겨둬. 그러면 약 100GB를 YARN에 할당하고, 컨테이너 최소 1GB, 최대 16GB 정도로 설정해. vcores는 실제 코어 수의 1.5~2배로 설정하기도 해."
주니어 엔지니어: "요즘 Hadoop 대신 클라우드 서비스 많이 쓴다던데, Hadoop 배울 필요 있나요?"
시니어 엔지니어: "기본 개념은 알아야 해. EMR, Dataproc 같은 클라우드 서비스도 Hadoop 기반이거든. 그리고 온프레미스 환경이나 데이터 주권 이슈가 있는 곳에선 아직 많이 써."

주의사항

HDFS 주의사항

  • 작은 파일 다수 저장은 NameNode 메모리 부담 - 파일 병합 권장
  • 블록 크기보다 작은 파일은 공간 낭비 없지만 메타데이터 오버헤드
  • 복제 계수 변경은 네트워크 트래픽 발생 - 유휴 시간에 수행

YARN 주의사항

  • 메모리 오버커밋 설정 시 OOM 발생 가능
  • 큐 용량 설정이 워크로드에 맞지 않으면 리소스 낭비
  • ApplicationMaster 실패 시 전체 작업 재시작 - 체크포인팅 필수

클러스터 운영

  • 데이터 편향(skew)은 특정 노드에 부하 집중 유발
  • 디스크 장애 시 자동 복구되지만 모니터링 필수
  • 네트워크 대역폭이 병목이 되는 경우가 많음

관련 용어

더 배우기