Spark 데이터 시스템 아키텍처
데이터 병렬처리가 가능하려면?
- 1. 데이터가 먼저 분산되어야 함
- 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록 (128MB)
- hdfs-site.xml에 있는 dfs.block.size 프로퍼티가 결정
- Spark에서는 이를 파티션이라고 부름. 파티션의 기본 크기도 128MB
- spark.sql.files.maxPartitionBytes: HDFS등에 있는 파일을 읽어올 때만 적용됨
- 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록 (128MB)
- 2. 나눠진 데이터를 각각 따로 동시 처리
- 맵리듀스에서 N개의 데이터 블록으로 구성된 파일 처리시 N개의 Map 태스크가 실행
- Spark에서는 파티션 단위로 메모리로 로드되어 Executor가 배정됨
처리 데이터를 나누기 -> 파티셔닝 -> 병렬처리
적절한 파티션의 수 = Executor 수 x Executor 당 CPU의 수
Spark 데이터 처리 흐름
- 데이터프레임은 작은 파티션들로 구성됨
- 데이터프레임은 한번 만들어지면 수정 불가 (Immutable)
- 입력 데이터프레임을 원하는 결과 도출까지 다른 데이터 프레임으로 계속 변환
- sort, group by, filter, map, join, ...
셔플링
파티션 간에 데이터 이동이 필요한 경우 발생
- 셔플링이 발생하는 경우
- 명시적 파티션을 새롭게 하는 경우 (ex. 파티션 수 줄이기)
- 시스템에 의해 이뤄지는 셔플링
- 예를 들면, 그룹핑 등의 aggregation이나 sorting
- 셔플링이 발생할 때 네트워크를 타고 데이터가 이동하게 됨
- 몇 개의 파티션이 결과로 만들어지는가
- spark.sql.shuffle.partitions이 결정
- 기본값은 200 (최대 파티션 수)
- 오퍼레이션에 따라 파티션 수가 결정됨
- random, hashing partition, range partition 등등
- sorting의 경우 range partition을 사용함
- 또한 이 때 Data Skew 발생 가능
- spark.sql.shuffle.partitions이 결정
- 몇 개의 파티션이 결과로 만들어지는가
Data Skewness
- Data partitioning은 데이터 처리에 병렬성을 주지만 단점도 존재
- 이는 데이터가 균등하게 분포하지 않는 경우
- 주로 데이터 셔플링 후에 발생
- 이는 데이터가 균등하게 분포하지 않는 경우
- 셔플링을 최소화 하는 것이 중요하고 파티션 최적화 하는 것이 중요
Spark 데이터 구조
- RDD
- 로우레벨 데이터로 클러스터 내의 서버에 분산된 데이터를 지정
- 레코드별로 존재하지만 스키마가 존재하지 않음
- 구조화된 데이터와 비구조화된 데이터 모두 지원
- DataFrame과 Dataset
- RDD 위에 만들어지는 RDD와는 달리 필드 정보를 갖고 있음 (테이블)
- Dataset은 타입 정보가 존재하며 컴파일 언어에서 사용가능
- 컴파일 언어: Scala/Java에서 사용가능
- PySpark에서는 DataFrame을 사용
Spark 데이터 구조
- Dataframe
- 변경이 불가한 분산 저장된 데이터
- RDD와는 다르게 관계형 데이터베이스 테이블처럼 컬럼으로 나눠 저장
- 판다스의 데이터 프레임 혹은 관계형 데이터베이스의 테이블과 거의 흡사
- 다양한 데이터소스 지원: HDFS, Hive, 외부 데이터베이스, RDD 등등
- 스칼라, 자바, 파이썬과 같은 언어에서 지원
반응형