Hadoop MapFile Reader를 이용한 분산 데이터 Key 조회 과정

Hyunjun Kim·2025년 10월 9일

Data_Engineering

목록 보기
154/157

MapFile이 분산된 HDFS 환경에서 어떻게 key 기반으로 데이터를 빠르게 찾는가, 즉 "물리적으로 분산된 데이터 → 논리적으로 정렬된 MapFile"로 변환하는 과정


1. MapFile은 HDFS 상의 "논리적 정렬 단위"이다

먼저 전제부터 잡고 가보자.
MapFile은 Hadoop의 HDFS 파일 포맷 중 하나로, 실제로는 "정렬된 SequenceFile + 인덱스 파일(index)" 조합이다.

즉, MapFile은 아래 두 부분으로 구성된다.

구성 요소역할
data 파일 (data)Key-Value 쌍이 정렬된 실제 데이터
index 파일 (index)각 key가 data 파일의 어느 오프셋(offset)에 있는지 기록

💡 그래서 MapFile.Reader는 전체 파일을 스캔하지 않고
index 파일을 참조해 곧바로 data 블록의 특정 위치로 점프(Seek)한다.


2. MapFile은 "하나의 노드에서만" 사용하는 게 아니라 "분산된 출력의 집합"으로 사용된다

MapReduce Job을 수행하면, Reducer 개수(numReduceTasks)만큼 출력 파일(=MapFile 파티션) 이 생긴다.

예를 들어 4개의 리듀서가 있다면 다음과 같은 구조가 된다.

/output/
├── part-r-00000 (MapFile)
├── part-r-00001 (MapFile)
├── part-r-00002 (MapFile)
└── part-r-00003 (MapFile)

각 MapFile은 개별 Reducer가 출력한 결과이고, 해시 파티셔너(HashPartitioner)에 의해 key 값의 범위 혹은 해시값으로 분산된다.

즉, 물리적으로는 4개의 DataNode에 걸쳐 저장되어 있어도, 논리적으로는 key의 범위 혹은 파티션별로 분리된 정렬 MapFile들이다.


3. SearchValueList가 하는 일 = "분산된 MapFile 파티션 중 올바른 파일 선택 + Key 탐색"

이제 아래 코드를 보자.

Reader[] readers = MapFileOutputFormat.getReaders(path, getConf());
Partitioner<IntWritable, Text> partitioner = new HashPartitioner<>();
Reader reader = readers[partitioner.getPartition(key, value, readers.length)];

이 로직은 다음 단계를 수행한다:

단계설명
HDFS 경로(/output)에 존재하는 여러 개의 MapFile(part-r-00000~)을 readers[] 배열로 로드
HashPartitioner를 사용하여, "이 key가 어느 파티션에 속하는가?" 계산
해당 파티션의 Reader 객체를 선택
그 Reader(MapFile)의 index를 이용해 key를 빠르게 검색

💡 즉, Hadoop 클러스터 전체에서 "모든 파일을 뒤지는 것"이 아니라
"해시로 파티션을 지정 → 해당 MapFile만 접근 → 인덱스로 빠르게 탐색" 하는 구조다.


4. 실제 물리적 흐름 (요약 다이어그램)

[전체 HDFS 데이터]
       │
       ▼
[Map 단계]
Key-Value 추출 및 중간 정렬
       │
       ▼
[Reduce 단계]
HashPartitioner로 파티셔닝 → 각 파티션별 정렬(MapFile 생성)
       │
       ▼
[출력 디렉토리: /output]
├── part-r-00000 (key 범위 0~100)
├── part-r-00001 (key 범위 101~200)
├── part-r-00002 (key 범위 201~300)
└── part-r-00003 (key 범위 301~400)
       │
       ▼
[SearchValueList 실행 시]
입력 key=220 → HashPartitioner 계산 → part-r-00002 선택 → index lookup → 결과 반환

5. 질문 정리

"물리적으로 나눠져 있는 데이터 노드들에 퍼져 있는 동일한 키의 데이터들을 찾아서 맵파일로 변경하고 거기에서 데이터를 조회하는 건가?"

정확히 정리하면 이렇게 된다 👇

Yes, MapReduce 작업 시점에서

  • HDFS 전체에 분산된 데이터를 읽어
  • Key 기준으로 정렬한 뒤
  • Reducer 단위로 나누어
  • 각 파티션을 MapFile 형식으로 저장한다.

✅ 하지만 SearchValueList 실행 시점에는

  • 이미 그 정렬·인덱싱이 끝난 MapFile을 활용하기 때문에
  • 전체 클러스터를 다시 뒤지지 않고
  • HashPartitioner → 특정 MapFile 선택 → 인덱스로 Seek → value 조회 방식으로 접근한다.

즉,

"처음 한 번은 분산 데이터를 정렬해서 MapFile로 만들고,
그 이후엔 인덱스 덕분에 빠르게 특정 key를 조회한다."
라고 요약할 수 있다.


6. 최종 요약 표

단계동작데이터 범위특징
1️⃣ MapReduce 실행원본 분산 데이터 전체 처리전체 HDFSkey 기준 정렬 + MapFile 생성
2️⃣ MapFile 저장각 Reducer 출력파티션 단위인덱스 + 정렬된 key-value
3️⃣ SearchValueList 조회특정 key 검색1개의 MapFile인덱스로 빠른 탐색 (O(log n))
profile
Data Analytics Engineer 가 되

0개의 댓글