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)을 제출하면, 클러..
intellij 에서 Spark를 Scala로 실행하는 도중 만난 에러Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$ at ReadCsvGzExample$.main(ReadCsvGzExample.scala:6) at ReadCsvGzExample.main(ReadCsvGzExample.scala)Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$ at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java..
에러 내용Caused by: org.apache.spark.SparkUpgradeException: [INCONSISTENT_BEHAVIOR_CROSS_VERSION.PARSE_DATETIME_BY_NEW_PARSER] You may get a different result due to the upgrading to Spark >= 3.0:Fail to parse '2024-05-26 12:11:38.478' in the new parser. You can set "spark.sql.legacy.timeParserPolicy" to "LEGACY" to restore the behavior before Spark 3.0, or set to "CORRECTED" and treat it as an inval..
Spark PartitionSpark에서 파티션(Partition)은 큰 데이터 세트를 더 작은 청크로 나누는 개념임.데이터의 병렬 처리와 분산 처리 성능을 향상시키는 데 중요한 역할을 함.파티셔닝은 RDD(Resilient Distributed Dataset), DataFrame, Dataset 등 Spark의 주요 데이터 구조들에서 자동으로 관리됨. Spark Partition 기본 개념1. 파티션 정의Spark에서 데이터를 논리적으로 분할한 조각임.각 파티션은 클러스터의 다른 노드에서 독립적으로 처리될 수 있음. 2. 병렬 처리파티션은 병렬 처리의 기본 단위가 되며, 각 파티션은 클러스터 내의 다른 실행자(Executor)에 의해 동시에 처리될 수 있음. Spark Partition 관리Spark..
Apache Spark SpillApache Spark에서 spill은 메모리 용량을 초과할 때 발생하는 작업을 의미함.Spark는 큰 데이터 세트를 처리할 때 필요한 메모리를 모두 확보할 수 없는 경우, 임시적으로 디스크에 데이터를 저장함.이 과정을 spill to disk라고 하며, 이를 통해 메모리 부족 문제를 회피하고 작업의 계속을 가능하게 함. Apache Spark Spill 발생 원인Spark에서 다양한 상황에서 spill이 발생할 수 있음.1. Shuffle 작업 중여러 노드 간에 데이터를 재분배할 때, 각 노드에서 처리해야 할 데이터가 메모리에 들어갈 수 없는 경우. 2. Aggregations 및 Joins큰 키에 대한 데이터 집계나 조인을 수행할 때, 관련 데이터를 메모리에 모두 유지..