-
[Glue] 데이터 처리 개념 정리클라우드/Data Engineering 2025. 10. 11. 16:17
1) Apache Spark
- Spark란 빅데이터를 빠르게 처리하는 엔진임
- 데이터를 여러 노드에 나눠서 병렬 처리 함
- AWS Glue 내부에서도 ETL 작업을 실행할 때, Apache Spark가 자동으로 돌아가게됨
Excel 한 사람이 쓰는 계산기 수천 행 정도 처리 가능 Python + Pandas 조금 빠른 계산기 수십만~수백만 행까지 가능 Spark 수백 명이 동시에 계산하는 공장 시스템 수억 행~수십억 행도 가능! 2) RDD (Resilient Distributed Dataset)
- Spark에서 데이터를 가장 기초적으로 저장하는 단위
- 분산(Distributed) 되어 있고, 복원 가능(Resilient)한 데이터 묶음(Dataset)이라는 뜻
- 여러 서버에 나눠서 저장함
- RDD는 계산 중 하나의 노드가 고장 나도, 어떤 연산을 했는지 기록(라인리지, lineage)을 가지고 있어서 필요한 부분만 다시 계산 가능
3) DataFrame
- Spark에서 데이터를 다룰 때 쓰는 표(table) 형태의 구조
- RDD에 표형태를 씌운 버전
구분 RDD DataFrame 데이터 표현 비구조화 (튜플, 리스트 형태) 구조화 (행과 열) 스키마(Schema) 없음 있음 (열 이름, 타입 정보) API map, filter, reduce select, filter, groupBy 최적화 엔진 없음 (직접 연산만) Catalyst Optimizer 자동 최적화 성능 느림 (직접 연산) 빠름 (쿼리 플랜 최적화) 쓰기 난이도 복잡 SQL처럼 쉽고 직관적 용도 저수준 제어, 특수 연산 일반적인 ETL, 분석 작업 * DataFrame이 빠른 이유?
- Spark의 DataFrame은 내부적으로 SQL 엔진처럼 동작함
- DataFrame 연산을 Spark가 자동으로 분석해서 가장 빠른 실행계획을 세움
DataFrame
df.filter(df.age > 30).select("name")-> 이렇게 쓰면 Spark는 “필터 → select 순서”를 최적화해서 최소한의 데이터 이동(shuffle)으로 처리
RDD
rdd.filter(lambda x: x[1] > 30).map(lambda x: x[0])
-> Spark가 내부 구조를 모르기 때문에 사용자가 시킨 대로만, 그대로 계산
데이터가 구조적 (CSV, Parquet, DB 테이블 등) ✅ DataFrame 데이터가 비정형 (JSON logs, custom binary 등) ⚙️ RDD 복잡한 변환 로직, 낮은 레벨 제어 필요 ⚙️ RDD 대부분의 ETL, ML, 분석 작업 ✅ DataFrame (표준 방식) 4) Scroll 방식 (대량 데이터 조회)
- OpenSearch(또는 Elasticsearch)에서 한 번에 다 가져올 수 없는 대량 데이터를 여러 번에 나눠서 가져오는 방식
- 일반 search는 1회 요청으로 제한된 결과(예: 10,000건)만 반환하지만, scroll은 세션을 유지하면서 반복 호출로 전체 데이터를 끝까지 가져옴
- scroll_id를 이용해 세션 유지하며 다음 batch 요청
- 세션은 마지막 요청 후 5분 동안 유지 (scroll=5m)
- 한 번에 가져오는 데이터 수(batch_size)가 너무 크면 → 메모리 부담 / 너무 작으면 → 호출 횟수가 많아져서 느려짐
5) Slice (병렬 수집)
- 전체 인덱스를 여러 조각(slices)으로 나눠서 동시에 여러 요청을 보냄 → 병렬 데이터 수집 가능
- 예: 20 slices 설정 시 → OpenSearch는 데이터를 20개 조각으로 나누어 병렬 전송
- 각 slice는 독립적으로 scroll을 수행하므로, 속도는 slice 개수에 비례해서 향상 (단, OpenSearch 클러스터 부하도 증가)
6) Spark 내부 병렬 처리
Partition Spark 내부에서 데이터를 나누어 처리하는 기본 단위 (RDD/DataFrame 조각) Shuffle Spark가 데이터를 조인·집계 시 파티션 간에 재분배(섞기) 하는 과정 - OpenSearch에서 20개의 slice로 병렬 읽기
→ Spark에 DataFrame 20개 조각이 동시에 들어옴 - Spark는 각 slice를 여러 partition으로 더 잘게 나눠 병렬 연산
- 이후 join, groupBy, aggregate 같은 연산 시 Spark가 데이터를 섞어 재분배 (shuffle)
→ 각 executor가 필요한 데이터만 받도록 정렬
7) 병렬도 & 최적화 단계
-Spark 내부에서는 더 잘게 쪼개면 → 각 작업이 더 빨리 끝나고 대기 없이 이어서 처리 가능. 그래서 슬라이스 개수 × 4 만큼 파티션을 늘려줌
- 단, 최소는 64개(슬라이스가 적어도 병렬성을 유지하려고).
슬라이스 수 (slices) OpenSearch에서 데이터를 나누는 병렬 단위 파티션 수 (partitions) Spark 내부에서 데이터를 처리하는 병렬 단위 권장 설정 spark.sql.shuffle.partitions = max(64, slices × 4) [OpenSearch]
↓
├─ 1) Scroll: 대용량 데이터를 여러 번 요청
├─ 2) Slice: 전체 인덱스를 20조각으로 병렬 분할
↓
[Spark]
├─ 3) 각 Slice를 받아 80개 Partition으로 나눔 (20×4)
├─ 4) 캐싱, 조인, 집계 중에 Shuffle 발생
└─ 5) 처리 후 S3 등으로 저장요약
Scroll: OpenSearch에서 대량 데이터를 여러 번 나눠 가져오는 방식
Slice: Scroll을 병렬로 수행하는 단위 (예: 20개 조각)
Partition: Spark 내부의 병렬 처리 단위 (예: slice × 4)
Shuffle: Spark가 조인·집계 시 데이터를 파티션 간에 섞는 과정OpenSearch는 Slice로 병렬 읽기, Spark는 Partition으로 병렬 처리
'클라우드 > Data Engineering' 카테고리의 다른 글
[Glue] Session / Context 개념 정리 (0) 2025.10.11 [Glue] Glue 옵션 파헤치기 (0) 2025.08.12