16주차 월요일, 76일차 Today I Learned
Spark 기타 기능, 메모리 관리
✏️ 학습 내용
1. Spark 기타 기능
- Broadcast Variable : 룩업 테이블등을 UDF로 브로드캐스팅하여 셔플링을 막는 방식으로 사용
- Closure, Broadcast 두 가지 방법으로 룩업 테이블(파일)을 UDF로 보낼 수 있다.
- Accumulators : 특정 이벤트의 수를 기록하거나 특정값 합산 등 연산에 사용되는 일종의 전역 변수
- Speculative Execution : 느린 태스크를 다른 워커 노드에 있는 엑시큐터에서 새로 태스크로 실행하여 중복으로 실행하도록 함
- Scheduler : 하나의 Spark Application 내의 잡들에 리소스를 나눠주는 정책
- Dynamic Resource Allocation
2. Driver와 Executor
Spark Application = (1 Driver) + (1+ Executor)
Driver는 main 함수를 실행하고, SparkSession/SparkContext를 생성한다. 그리고 코드를 태스크로 변환하여 DAG를 생성한다. 이를 execution/logical/physical plan으로 변환하고, 리소스 매니저의 도움을 받아 태스크들을 실행하고 관리한다. 위의 정보들을 4040 포트로 Web UI로 노출시키기도 한다.
Executor 메모리가 부족해지기 시작하면 Storage Memory Pool에 남는 메모리를 사용하게 된다. 반대로 Storage 메모리가 부족하기 시작하면, 데이터프레임 캐싱을 하기 위한 메모리가 부족해지면 Executor Memory Pool에 남는 메모리를 사용한다. 더 이상 쓸 메모리가 없다면 데이터를 메모리에서 디스크로 옮기고, 디스크로 spill할 수 없다면 OOM이 발생한다.
3. JVM과 Python 간의 통신
Driver는 파이썬 프로그램이지만, JVM으로 작성된 Spark 클러스터와 통신이 필요하다. 그 과정에서 Spark Session을 만들어야 하고, 이 때 Spark Context도 생성된다. 이를 통해 Spark 클러스터와 통신 가능하다. Spark은 JVM 애플리케이션이지만 PySpark은 파이썬 프로세스이다.
- Driver Program (Python) <- Py4J -> Spark Context (JVM)
- Py4J : 파이썬과 JVM 간의 데이터 교환을 통해 둘간의 연동을 도와주는 프레임웍
4. Caching과 Persist
어느 데이터시스템이건 반복되어서 사용되는 데이터가 있다면, 매번 계산하는 것보다 메모리에 두는 것이 좋다. 이를 위해 Caching을 사용하여 반복 사용되는 데이터프레임을 메모리에 둠으로써 재사용할 때 효율성을 높인다.
- cache()
- persist()
데이터프레임에 캐싱하는 방법은 두 가지가 존재하는데, 둘 다 데이터프레임을 메모리/디스크/오프힙에 보존한다. persist는 5개의 파라미터가 존재하며, 인자를 통해 세부 제어가 가능하다. 기본적으로 캐싱되는 데이터프레임을 메모리와 디스크에 보관하고 복제도 수행한다. cache는 persist의 다음 버전이다.
5. Dynamic Partition Pruning
비 Partition 테이블에 적용된 필터링을 파티션 테이블에 적용해보는 것으로, 후자가 작은 dimension 테이블이라면 브로드캐스트 조인까지 하면 금상천화이다. 기본적으로 활성화되어 있으며, 환경변수로 조작 가능하다.
💡 배운 점
- Spark 기본 기능 및 개념에 대해 살펴보았다.
- Driver와 Executor에 대해 배웠다.
- 메모리 이슈를 보았다.
- JVM과 Python 간의 통신을 알아보았다.
- Caching과 Persist에 대해 배웠다.
- Dynamic Partition Pruning을 보았다.
☁️ 소감
Spark에는 아직 배울 것들이 더 많이 남아있는 것 같다. 지금은 이 개념이 왜 등장하고 왜 필요한지 감이 안 잡히지만, 언젠가는 익힐 수 있으면 좋겠다.
'Data Engineering > grepp 데브코스 : TIL' 카테고리의 다른 글
[TIL_2024.02.07] Spark Partition (0) | 2024.02.27 |
---|---|
[TIL_2024.02.06] Spark Shuffling 최적화 (1) | 2024.02.27 |
[TIL_2024.01.29-02.02] 머신러닝 : ML E2E, 기초개념, 기초선형대수, 확률기초/분포, 선형회귀/분포 (0) | 2024.02.26 |
[TIL_2024.01.26] 스트리밍 처리 (5) : Spark Streaming (1) | 2024.02.26 |
[TIL_2024.01.25] 스트리밍 처리 (4) : Kafka 기본 프로그래밍 (0) | 2024.02.26 |