Adaptive Query ExecutionApache Spark 3.0부터 본격적으로 도입된 Adaptive Query Execution(AQE)는 런타임에 실행 계획을 동적으로 최적화함으로써, 기존의 정적(Static) 최적화가 갖는 한계를 보완하고 Spark SQL 성능을 크게 향상시키는 기술임.일반적으로 Spark SQL은 쿼리를 제출할 때 Catalyst 옵티마이저를 통해 논리적/물리적 계획을 최적화하지만, 쿼리 실행 이전에 추정된 통계 정보(Statistics) 를 기반으로 계획이 결정됨.그러나 빅데이터 환경에서는 데이터 분포가 매우 다양하여 사전에 추정된 통계가 실제와 많이 다를 수 있기 때문에, 기존 정적 최적화만으로는 완벽한 성능을 보장하기 어려움.이 문제를 해결하기 위해 AQE는 실행 ..
Apache Spark의 Job, Stage, TaskApache Spark의 실행 모델에서 Job, Stage, Task는 분산 처리를 구조화해서 이해하는 핵심 개념임.Spark가 내부적으로 어떻게 작업을 쪼개고, 네트워크를 통해 데이터를 주고받으며, 실제 연산을 실행하는지 파악하기 위해서는 이 세 가지 개념을 명확히 이해해야 함. Job : Job이란 무엇인가?Job은 사용자가 Action을 호출했을 때 트리거되는, 물리적 실행 단위들의 묶음임.Spark에서 collect(), count(), save(), show() 등 Action 함수를 호출할 때마다 새로운 Job이 생성됨.단일 Spark 애플리케이션 안에서도 여러 Job이 순차적으로(또는 때때로 병렬적으로) 실행될 수 있음. Job : Job..
Apache Spark 동작 원리Apache Spark는 대규모 데이터 처리를 위해 메모리 기반의 빠른 연산을 제공하는 분산 컴퓨팅 엔진임.스파크가 내부적으로 어떻게 애플리케이션을 실행하고, 자원을 스케줄링하며, 데이터를 처리하는지 이해하는 것은 성능 최적화와 효율적인 운영을 위해 매우 중요함. 전체 아키텍처 개요1. Spark Application사용자가 작성한 스파크 애플리케이션(예: Scala, Python, R, Java 코드)임.SparkContext(Spark 1.x) 또는 SparkSession(Spark 2.x 이상)을 생성하여, Spark 클러스터에 작업을 제출함. 2. DriverSpark Application의 메인 프로세스로, 사용자가 작성한 코드를 해석하고, 스케줄링 및 실행을 제..
Apache Spark ShuffleApache Spark에서 Shuffle은 매우 중요한 핵심 메커니즘 중 하나임.대규모 데이터를 분산 환경에서 처리할 때 발생하는 ‘데이터 재분배(Data Redistribution) 또는 재파티셔닝(Shuffle)’ 과정을 의미함.Shuffle 단계에서는 특정 Transformation(예: reduceByKey, groupByKey, join 등)을 실행하기 위해, 클러스터의 여러 노드에 분산되어 있던 데이터를 필요한 형태로 재배치해야 함.이때 대규모 네트워크 I/O와 디스크 I/O가 발생하므로, Spark 성능과 자원 활용도에 큰 영향을 미침. Shuffle의 기본 개념1. 데이터 재분배(Partition Shuffling)Spark는 RDD(혹은 Dataset/..
Apache Spark Cluster Manager 종류Apache Spark는 다양한 환경에서 유연하게 동작할 수 있도록 여러 종류의 클러스터 매니저(Cluster Manager)를 지원함.클러스터 매니저는 Spark 응용 프로그램이 실행되는 물리적/가상 자원을 효과적으로 관리하고, Executor(작업 실행 프로세스)를 스케줄링하는 핵심 역할을 담당함.전문가 수준으로 이해하기 위해서는 각각의 클러스터 매니저가 어떤 원리로 자원을 할당하고, Spark가 어떤 방식을 통해 이들과 상호작용하는지 살펴봐야 함. Standalone Cluster Manager : 동작 방식1. Master-Slave 구조Spark Standalone 클러스터는 하나의 Master 프로세스와 여러 Worker 노드(노드마다 W..
Apache Spark의 ExecutorApache Spark에서 “Executor”는 클러스터 환경에서 실제로 작업(Task)을 실행하고, 데이터 처리를 담당하는 프로세스를 의미함.즉, Spark Driver가 분산 처리 계획을 세우고 Task를 스케줄링하면, 실제 연산은 Executor가 수행함.Spark 애플리케이션이 실행되는 동안, 각 Executor는 애플리케이션에 할당된 자원을 사용하여 RDD나 DataFrame, Dataset 등을 메모리에 적재하고 계산을 수행함. Executor의 생성 및 배포 방식Spark 애플리케이션이 시작되면, 다음과 같은 흐름으로 Executor가 배포됨. 1. Driver 시작사용자가 Spark Application(예: spark-submit)을 제출하면, 클러..
EMR JVM 모니터링Amazon EMR 클러스터에서 Spark, Hadoop, YARN 등과 같은 JVM 기반 프로세스를 실시간으로 모니터링하기 위해서는 크게 다음과 같은 방법이 있음. 1. JMX 기반의 직접 모니터링2. Ganglia, CloudWatch, Datadog 등 외부 툴/에이전트를 통한 모니터링3. Spark UI, YARN UI와 같은 내장 모니터링 인터페이스를 혼합하여 사용하는 방법 JMX 기반 실시간 모니터링 : JMX 개요JVM 내부 Heap 사용량, GC(가비지 컬렉션) 이벤트, 스레드 정보 등 다양한 메트릭을 실시간으로 노출하는 표준 인터페이스.com.sun.management.jmxremote 등의 JVM 옵션을 통해 원격에서 모니터링 도구(VisualVM, JConsole..
SPARK_DAEMON_JAVA_OPTSSPARK_DAEMON_JAVA_OPTS는 Spark의 “데몬 프로세스(daemon processes)”에 적용될 JVM 옵션을 지정하는 환경 변수임.여기서 “데몬 프로세스”란 Spark Master, Spark Worker, Spark History Server 등과 같이 장기간 동작하면서 클러스터/작업을 관리하거나 모니터링하는 Spark의 백그라운드 프로세스를 말함.Spark Driver나 Executor 프로세스와는 별도로, Spark 클러스터 자체를 운영하기 위한 프로세스에 적용되는 설정이라는 점이 핵심임. SPARK_DAEMON_JAVA_OPTS의 역할1. Spark 마스터와 워커, 히스토리 서버 등에 공통적으로 적용Spark에는 Master, Worker..
파이썬으로 EMR 클러스터 생성AWS에서 EMR Spark 클러스터를 생성하는 가장 대표적인 방법은 boto3(AWS SDK for Python)를 사용하는 것임.이때, run_job_flow 메서드를 통해 EMR 클러스터를 손쉽게 생성할 수 있음.아래 예시는 기본적인 Spark 클러스터를 파이썬 코드로 구성하는 예시임. 사전 준비 사항1. AWS CLI 설정로컬 환경에서 AWS CLI를 설치하고, aws configure 명령어를 통해 자격 증명(AWS Access Key ID, Secret Access Key)과 기본 리전을 설정해야 함.또는, EC2 인스턴스 등에서 IAM Role을 통해 호출할 수도 있음.이 경우 별도의 키 설정이 필요 없음. 2. boto3 설치pip install boto3 3..
EMR의 유형별 노드AWS EMR(Amazon Elastic MapReduce) 클러스터는 다음 세 가지 유형의 노드로 구성됨. 1. 프라이머리 노드(Primary Node)2. 코어 노드(Core Node)3. 태스크 노드(Task Node) 여기서 각 노드는 Hadoop/Spark 등 다양한 빅데이터 프레임워크를 실행하는 데 필요한 역할을 분담함.클러스터 운영 및 확장/축소에도 중요한 영향을 미침. 프라이머리 노드 : 주요 역할1. 클러스터 전반 제어 및 코디네이션프라이머리 노드는 클러스터를 제어하고 관리하는 핵심 역할을 수행함.전통적인 용어로는 "마스터 노드(Master Node)"라고도 하며, 아래와 같은 주요 프로세스를 실행함. Hadoop YARN ResourceManager: 전체 클러스터에..