Spark 파일 읽기 → RDD 생성 → BlockManager 저장 전체 구조
전체 흐름 다이어그램
HDFS / S3 / Local FS
────────────────────────────────────────────────────────────────
• 파일을 블록 단위로 분할 (HDFS block, 기본 128 MB)
• Hadoop InputFormat을 통해 InputSplit 생성
────────────────────────────────────────────────────────────────
│
▼
Driver JVM
────────────────────────────────────────────────────────────────
• SparkContext.textFile() → HadoopRDD 생성
• InputSplit → Partition 매핑
• DAGScheduler → TaskScheduler 통해 Task 생성 및 분배
│
├── BlockManagerMaster
│ • 모든 Executor BlockManager 등록·관리
│ • 블록 메타데이터(위치·크기·StorageLevel) 기록
│ • 실제 데이터 저장 ✗ → "주소록"만 유지
│ • 일부 Broadcast 데이터만 예외적으로 보관
│
└── ApplicationMaster (YARN)
• Executor 컨테이너 생성 및 리소스 관리
• 데이터 처리·저장 관여 ✗
────────────────────────────────────────────────────────────────
│
▼
Executors (N개)
────────────────────────────────────────────────────────────────
각 Executor JVM은 다음 구성요소를 가짐:
├── BlockManager (실제 데이터 저장소)
│ ├─ MemoryStore → JVM Heap / Off-Heap 메모리
│ ├─ DiskStore → 로컬 디스크
│ ├─ BlockInfoMap → 블록 메타데이터
│ └─ BlockTransferService → Executor 간 블록 네트워크 전송
│
├── Task 실행 흐름
│ ① InputSplit 범위의 파일 블록 읽기
│ ② Iterator 기반으로 map / filter 연산 수행
│ ③ cache() / persist() 지정 시 BlockManager에 저장
│ ④ Driver의 BlockManagerMaster에 블록 정보 보고
│
└── ExecutorMemory (Heap + Off-Heap)
BlockManager가 사용하는 실제 메모리 공간
────────────────────────────────────────────────────────────────
│
▼
BlockManager 간 통신 흐름
────────────────────────────────────────────────────────────────
① Executor에서 블록 생성 후 Driver에 등록 보고
→ updateBlockInfo() RPC 호출
② Driver의 BlockManagerMaster가 "rdd_x_y → Executor N" 기록
③ 다른 Executor가 필요 시 Driver에서 블록 위치 조회
④ BlockTransferService가 Executor 간 네트워크로 블록 전송
────────────────────────────────────────────────────────────────
컴포넌트별 역할 요약
| 컴포넌트 | 역할 | 데이터 보관 |
|---|
| BlockManagerMaster (Driver) | 블록 위치·메타데이터 "주소록" 관리 | ✗ (Broadcast 예외) |
| ApplicationMaster (YARN) | Executor 컨테이너·리소스 관리 | ✗ |
| BlockManager (Executor) | 실제 데이터 저장 (Memory / Disk) | ✓ |
| BlockTransferService | Executor 간 블록 네트워크 전송 | — |
핵심 정리
- Executor가 파일 블록을 읽어 자신의 BlockManager 메모리(또는 디스크)에 저장한다.
- Driver의 BlockManagerMaster는 그 위치와 상태를 논리적으로 기록할 뿐, 데이터를 직접 보유하지 않는다.
- ApplicationMaster는 오로지 리소스 및 컨테이너 관리만 담당하며, 데이터 처리·보관에는 관여하지 않는다.
- Executor 간 데이터 이동이 필요한 경우, Driver에서 위치를 조회한 후 BlockTransferService를 통해 직접 전송한다.