데이터엔지니어링
[11주차] 하둡과 Spark (2)
heecup
2024. 6. 18. 13:33
🙂 Spark 프로그래밍
✔ 데이터 병렬처리
- 데이터가 먼저 분산되어야 함
- 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록 (128MB)
- hdfs-site.xml에 있는 dfs.block.size 프로퍼티가 결정
- Spark에서는 이를 Partition이라 부름. (128MB)
- spark.sql.files.maxPartitionBytes: HDFS 등에 있는 파일을 읽어올 때만 적용
- 하둡 맵의 데이터 처리 단위는 디스크에 있는 데이터 블록 (128MB)
- 나눠진 데이터를 각각 따로 동시 처리
- 맵리듀스에서 N개의 데이터 블록으로 구성된 파일 처리 시 N개의 Map 태스크가 실행
- Spark에서는 파티션 단위로 메모리로 로드되어 Executor가 배정
🍦 처리 데이터를 나누기 -> 파티션 -> 병렬처리
✔ Spark 데이터 처리 흐름
- 데이터프레임은 작은 파티션들로 구성됨
- 데이터프레임은 한 번 만들어지면 수정 불가 (Immutable)
- 입력 데이터프레임을 원하는 결과 도출까지 다른 데이터프레임으로 계속 변환
- sort, group by, filter, map, join, ...
🍦 셔플링
- 파티션 간에 데이터 이동이 필요한 경우
- 명시적 파티션을 새롭게 하는 경우 (예: 파티션 수를 줄이기)
- 시스템에 의해 이루어지는 셔플링
- 예를 들면 그룹핑 등의 aggregation이나 sorting
- 셔플링이 발생할 때 NW을 타고 데이터 이동
- 몇 개의 파티션이 결과로 만들어질까
- spark.sql.shuffle.partitions이 결정 (default: 200)
- 오퍼레이션에 따라 파티션 수 결정
- random, hashing partition, range partition 등
- Data Skew 발생 가능
🙂 Spark 데이터 구조
- RDD (Resilient Distributed Dataset)
- Low Level 데이터로 클러스터 내의 서버에 분산된 데이터를 지칭
- 레코드별로 존재하지만 스키마 존재 X
- 구조화된 데이터나 비구조화된 데이터 모두 지원
- 변경이 불가능한 분산 저장된 데이터
- RDD는 다수의 파티션으로 구성
- Low Level의 함수형 변환 지원 (map, filter, flatMap 등)
- 일반 파이썬 데이터는 parallelize 함수로 RDD로 변환
- 반대는 collect로 파이썬 데이터로 변환 가능
- DataFrame과 Dataset
- RDD위에 만들어지는 RDD와는 달리 필드 정보(컬럼)를 갖고 있음
- Dataset은 타입 정보가 존재
🙂 Spark Session
- Spark 프로그램의 시작은 Spark Session을 만드는 것
- 프로그램마다 하나를 만들어 Spark Cluster와 통신: Singleton 객체
- Spark 2.0에서 처음 소개됨
- Spark Session을 통해 Spark이 제공해주는 다양한 기능을 사용
- DataFrame, SQL, Streaming, ML API 모두 이 객체로 통신
- config 메소드를 이용해 다양한 환경설정 가능
- 단 RDD와 관련된 작업을 할 때는 SparkSession 밑의 sparkContext 객체 사용
🍦 환경 변수
- executor별 메모리: spark.executor.memory (default: 1g)
- executor별 CPU: spark.executor.cores (default: 1)
- driver 메모리: spark.driver.memory (default: 1g)
- Shuffle 후 Partition의 수: spark.sql.shuffle.partitions (default: 200)
✔ 전체적인 플로우
- SparkSession 만들기
- 입력 데이터 로딩
- 데이터 조작 작업
- DataFrame API나 Spark SQL 사용
- 최종 결과 저장