Spark 데이터 시스템 아키텍처
- 아키텍처
데이터 병렬 처리
- 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록(128MB)
- hdfs-site.xml에 있는 dfs.block.size 프로퍼티가 결정
- spark 에서는 이를 파티션이라 부름. 파티션의 기본크기도 128MB
- spark.sql.files.maxPartitionBytes: HDFS등에 있는 파일을 읽어올 때만 적용됨
- 다음으로 나눠진 데이터를 각각 따로 동시 처리
- 맵리듀스에서 N개의 데이터 블록으로 구성된 파일 처리시 N개의 Map 태스크가 실행
- Spark에서는 파티션 단위로 메모리로 로드되어 Executor가 배정됨
Spark 데이터 처리 흐름
- 데이터프레임은 작은 파티션들로 구성됨
- 데이터프레임은 한번 만ㄴ들어지면 수정 불가 (Immutable)
- 입력 데이터프레임을 원하는 결과 도출까지 다른 데이터 프레임으로 계속 변환
- sort, group by, filter, map, join, ...
- 셔플링 : 파티션간에 데이터 이동이 필요한 경우 발생
- 셔플링이 발생하는 경우
- 명시적 파티션을 새롭게 하는 경우 (예: 파티션 수를 줄이기)
- 시스템에 의해 이뤄지는 셔플링 (ex. 그룹핑 등의 aggregration이나 sorting)
- 셔플링이 발생할 때 네트웍을 타고 데이터가 이동하게 됨
- 몇 개의 파티션이 결과로 만들어질까?
- spark.sql.shuffle.partitions이 결정
- 기본값은 200이며 이는 최대 파티션 수
- 오퍼레이션에 따라 파티션 수가 결정됨
- random, hashing partition, range partition 등등
- sorting의 경우 range partition을 사용함
- 또한 이때 Data Skew 발생 가능!
- 데이터가 균등하게 분포하지 않는 경우 발생
- 주로 데이터 셔플링 후에 발생
- 셔플링을 최소화 및 파티션 최적화를 하는 것이 중요!!
- spark.sql.shuffle.partitions이 결정
- 몇 개의 파티션이 결과로 만들어질까?
Spark 데이터 구조
- RDD, DataFrame, Dataset
- 2016년에 DataFrame과 Dataset은 하나의 API로 통합됨
- 모두 파티션으로 나뉘어 Spark에서 처리됨
RDD | DataFrame | Dataset | |
무엇인지? | Distributed collection of records (structered & unstructured) |
RDD organized into named coumn | Extension of data frame |
언제 소개되었는지 | 1.0 | 1.3 | 1.6 |
컴파일타임 타입 체크 | X | O | O |
사용하기 쉬운 API | X | O | O |
SparkSQL기반 | X | O | O |
Catalyst Optimizer | X | O | O |
'Programmers TIL' 카테고리의 다른 글
[Spark] Spark SQL _TIL (2) | 2023.07.05 |
---|---|
[Spark] Spark 프로그램 구조 _TIL (0) | 2023.07.04 |
[Airflow] Airflow 기타 기능 _TIL (1) | 2023.06.21 |
[K8s] Kubernetes(K8s)_TIL (1) | 2023.06.16 |
[Docker] Docker Compose_TIL (1) | 2023.06.15 |