Hadoop 요약 정리
Posted by Albert 67Day 8Hour 23Min 19Sec ago [2025-12-01]
Hadoop은 대용량 데이터를 분산 처리하기 위한 오픈소스 프레임워크입니다. 구글의 논문(MapReduce, GFS)에서 영감을 받아 개발되었으며, 현재 Apache 재단에서 관리하고 있습니다.
핵심 개념
왜 Hadoop이 필요한가?
- 일반 컴퓨터 한 대로는 처리할 수 없는 수십~수백 테라바이트 데이터 처리
- 하드웨어 장애에 대한 자동 복구
- 저렴한 비용으로 대규모 데이터 처리 인프라 구축
주요 구성 요소
1. HDFS (Hadoop Distributed File System)
데이터를 여러 서버에 분산 저장하는 파일 시스템입니다.
작동 원리:
- NameNode: 파일 메타데이터 관리 (파일 위치, 크기 등)
- DataNode: 실제 데이터 블록 저장
- 파일을 128MB 또는 256MB 블록으로 나누어 저장
- 각 블록을 3개 복사본으로 저장 (기본값)
예제 시나리오:
1TB 로그 파일을 HDFS에 저장하면: → 약 4,000개의 블록으로 분할 (256MB 기준) → 총 12,000개 블록이 클러스터에 분산 저장 (3배 복제) → 하나의 서버가 고장나도 데이터 손실 없음
2. MapReduce
대용량 데이터를 병렬로 처리하는 프로그래밍 모델입니다.
2단계 처리:
- Map 단계: 데이터를 읽고 key-value 쌍으로 변환
- Reduce 단계: 같은 key를 가진 값들을 집계
실전 예제
예제 1: 단어 개수 세기 (WordCount)
가장 기본적인 Hadoop 예제입니다.
입력 데이터:
file1.txt: "Hello World" file2.txt: "Hello Hadoop" file3.txt: "Hadoop World"
Map 단계:
Map(file1.txt) → (Hello, 1), (World, 1) Map(file2.txt) → (Hello, 1), (Hadoop, 1) Map(file3.txt) → (Hadoop, 1), (World, 1)
Shuffle & Sort:
Hello → [1, 1] Hadoop → [1, 1] World → [1, 1]
Reduce 단계:
Reduce(Hello) → (Hello, 2) Reduce(Hadoop) → (Hadoop, 2) Reduce(World) → (World, 2)
Java 코드 예제:
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
}
```
''' 예제 2: 웹 로그 분석
실무에서 자주 사용되는 패턴입니다.
**입력 데이터 (access.log):**
```
192.168.1.1 - - [01/Dec/2025:10:00:00] "GET /index.html" 200
192.168.1.2 - - [01/Dec/2025:10:00:05] "GET /about.html" 200
192.168.1.1 - - [01/Dec/2025:10:00:10] "GET /contact.html" 404
```
**목표: 각 페이지별 방문 횟수 계산**
**Map 출력:**
```
/index.html → 1
/about.html → 1
/contact.html → 1
```
**Reduce 출력:**
```
/index.html → 1
/about.html → 1
/contact.html → 1
```
''' 예제 3: 온도 데이터 분석
연도별 최고 온도를 찾는 예제입니다.
**입력 데이터:**
```
2023,Seoul,35
2023,Busan,32
2024,Seoul,37
2024,Busan,33
Map 단계:
// (연도, 온도) 형태로 출력
map("2023,Seoul,35") → (2023, 35)
map("2023,Busan,32") → (2023, 32)
map("2024,Seoul,37") → (2024, 37)
map("2024,Busan,33") → (2024, 33)
Reduce 단계:
// 각 연도별 최고 온도 계산 reduce(2023, [35, 32]) → (2023, 35) reduce(2024, [37, 33]) → (2024, 37)
Hadoop 실행 명령어
HDFS 기본 명령어:
' 파일 업로드 hdfs dfs -put local_file.txt /user/hadoop/ ' 파일 목록 보기 hdfs dfs -ls /user/hadoop/ ' 파일 다운로드 hdfs dfs -get /user/hadoop/file.txt ./ ' 파일 삭제 hdfs dfs -rm /user/hadoop/file.txt ' 디렉토리 생성 hdfs dfs -mkdir /user/hadoop/data
MapReduce 작업 실행:
' Jar 파일 실행 hadoop jar wordcount.jar WordCount /input /output ' 작업 상태 확인 hadoop job -status job_123456 ' 작업 종료 hadoop job -kill job_123456
Hadoop 생태계
Hadoop 주변에는 다양한 도구들이 있습니다:
Hive: SQL 쿼리로 데이터 분석
SELECT year, MAX(temperature) FROM weather_data GROUP BY year; ``` **Pig**: 스크립트 언어로 데이터 처리 ``` data = LOAD '/data/logs' AS (ip, time, url); grouped = GROUP data BY url; counted = FOREACH grouped GENERATE group, COUNT(data);
HBase: NoSQL 데이터베이스
Spark: 메모리 기반 빠른 처리 (MapReduce보다 100배 빠름)
실무 활용 사례
- 로그 분석: 수백만 개의 서버 로그에서 에러 패턴 찾기
- 추천 시스템: 사용자 행동 데이터 분석하여 상품 추천
- 이미지 처리: 대량의 이미지 변환 및 분석
- 금융 분석: 거래 데이터에서 사기 패턴 탐지
장단점
장점:
- 저렴한 하드웨어로 대규모 클러스터 구축
- 자동 장애 복구
- 수평 확장 용이 (서버만 추가하면 됨)
단점:
- 실시간 처리에는 부적합 (배치 처리 중심)
- 작은 파일 처리에 비효율적
- 복잡한 설정과 관리
Hadoop은 빅데이터 처리의 기초가 되는 기술입니다. 최근에는 Spark 같은 더 빠른 기술들이 등장했지만, 여전히 많은 기업에서 대용량 데이터 저장과 배치 처리에 활용하고 있습니다.