📊
데이터공학
Hadoop
Apache Hadoop
분산 저장/처리 프레임워크. HDFS와 MapReduce 기반. 빅데이터 처리의 초기 표준.
Apache Hadoop
분산 저장/처리 프레임워크. HDFS와 MapReduce 기반. 빅데이터 처리의 초기 표준.
Apache Hadoop은 대규모 데이터 세트를 분산 처리하기 위한 오픈소스 프레임워크입니다. Google의 GFS와 MapReduce 논문을 기반으로 개발되어 빅데이터 시대를 여는 핵심 기술이 되었습니다.
| 구성요소 | 역할 | 특징 |
|---|---|---|
| NameNode | 메타데이터 관리 | 파일 위치, 블록 정보 저장 |
| DataNode | 실제 데이터 저장 | 블록 단위(128MB) 저장 |
| Secondary NameNode | 체크포인트 생성 | NameNode 백업 아님 |
| Block | 데이터 저장 단위 | 기본 3중 복제 |
| 구성요소 | 역할 | 설명 |
|---|---|---|
| ResourceManager | 글로벌 리소스 관리 | 클러스터 전체 리소스 할당 |
| NodeManager | 노드별 리소스 관리 | 컨테이너 실행 및 모니터링 |
| ApplicationMaster | 애플리케이션 관리 | 작업별 리소스 협상 |
| Container | 실행 환경 | CPU, 메모리 할당 단위 |
<!-- 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-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 기본 명령어
# 디렉토리 목록 조회
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 파일 시스템 접근
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']}")