
빅데이터 처리 환경은 빠르게 변화하고 있습니다. 데이터 엔지니어와 데이터 사이언티스트들은 복잡한 데이터 파이프라인을 구축하고 운영하면서도 더 단순하고 효율적인 방식을 찾고 있습니다. Apache Spark는 오랫동안 대규모 데이터 처리의 핵심 플랫폼으로 자리 잡았지만, 파이프라인이 커질수록 관리와 최적화는 점점 더 어려워졌습니다.
이 문제를 해결하기 위해 Apache Spark 4.0은 선언적 파이프라인(Declarative Pipelines) 을 도입했습니다. 이제 사용자는 데이터 파이프라인의 원하는 결과를 정의하기만 하면 되고, 실행의 세부적인 방법은 Spark가 알아서 처리합니다. 이번 글에서는 Spark의 선언적 파이프라인 개념과 특징, 간단한 예제, 그리고 기대되는 효과까지 정리해 보겠습니다.
명령형 방식에서 선언적 방식으로
명령형(Imperative) 방식의 한계
기존 Spark에서는 Python, Scala, SQL API를 이용해 데이터 변환 과정을 단계별로 정의했습니다. 예를 들어, ETL 파이프라인을 작성하려면 데이터 읽기, 조인, 집계, 저장까지 모든 과정을 코드로 지시해야 했습니다.
df_sales = spark.read.format("csv").load("s3://raw-data/sales.csv")
df_products = spark.read.format("json").load("s3://raw-data/products.json")
df_joined = df_sales.join(df_products, "product_id")
df_aggregated = df_joined.groupBy("product_category").agg(sum("amount").alias("total_sales"))
df_aggregated.write.format("delta").mode("overwrite").save("s3://curated-data/product_sales_summary")
이 방식은 세밀한 제어가 가능하지만, 파이프라인이 복잡해질수록 관리가 어렵고 코드가 장황해집니다. 데이터 종속성 관리, 증분 처리, 실행 최적화 등은 많은 추가 코드와 수작업이 필요했습니다.
선언적(Declarative) 방식의 혁신
선언적 방식은 무엇을(what) 하고 싶은지만 정의하면 됩니다. SQL이 대표적인 예입니다.
SELECT customer_name, SUM(order_total)
FROM orders
GROUP BY customer_name;
위 쿼리는 원하는 결과만 표현할 뿐, 어떤 조인 전략이나 실행 계획을 사용할지는 데이터베이스가 스스로 결정합니다.
Spark Declarative Pipelines는 이 개념을 데이터 파이프라인 전체에 확장합니다. 사용자는 고수준의 결과만 정의하고, Spark가 실행 최적화와 데이터 흐름을 자동으로 구성합니다.
Apache Spark 선언적 파이프라인의 핵심 개념
파이프라인 (Pipeline)
파이프라인은 실행 및 배포의 기본 단위입니다. 내부에는 여러 테이블과 변환 로직이 포함되며, 데이터 종속성을 나타내는 DAG(Directed Acyclic Graph)를 자동으로 생성합니다.
플로우 (Flows)
데이터 처리 흐름을 나타내며, Spark가 자동으로 배치(Batch Flow)와 스트리밍(Streaming Flow)으로 구분합니다.
스트리밍 테이블 (Streaming Tables)
실시간 데이터 처리를 위해 설계된 Delta 테이블입니다. 새로 들어온 데이터만 증분 처리하여 효율적인 스트리밍 분석이 가능합니다.
머터리얼라이즈드 뷰 (Materialized Views)
쿼리 결과를 미리 계산해 저장하는 구조입니다. 소스 데이터가 변경될 때마다 증분 업데이트가 이루어지므로, 복잡한 집계나 조인 쿼리 성능을 크게 향상시킵니다.
선언적 파이프라인 예제
Apache Spark 4.0에서는 spark-pipelines 스크립트를 활용해 쉽게 파이프라인 프로젝트를 생성할 수 있습니다.
1단계: 샘플 프로젝트 생성
$spark-pipelines init --name helloworld_app
2단계: 프로젝트 구조 확인
$ tree
.
├── pipeline.yml
└── transformations
├── example_python_materialized_view.py
└── example_sql_materialized_view.sql
- pipeline.yml: 파이프라인 정의 파일
- transformations/: Python 및 SQL 기반 변환 로직 저장
3단계: 파이썬 뷰 정의
from pyspark import pipelines as sdp
from pyspark.sql import DataFrame, SparkSession
spark = SparkSession.active()
@sdp.materialized_view
def example_python_materialized_view() -> DataFrame:
return spark.range(10)
4단계: SQL 뷰 정의
CREATE MATERIALIZED VIEW example_sql_materialized_view AS
SELECT id FROM example_python_materialized_view
WHERE id % 2 = 0;
실행하면 0부터 9까지 생성된 데이터 중 짝수 값만 남는 결과를 얻습니다.
선언적 파이프라인의 장점
- 간결한 코드 작성
원하는 결과만 정의하면 되므로 코드량이 크게 줄어듭니다. - 자동 최적화 및 실행
Spark가 전체 파이프라인을 분석하고 최적의 실행 계획을 선택합니다. - 가독성과 유지보수성 향상
파이프라인 정의가 직관적이어서 협업과 디버깅이 쉬워집니다. - 배치와 스트리밍 모두 지원
동일한 프레임워크 내에서 배치 처리와 실시간 처리를 유연하게 다룰 수 있습니다.
Apache Spark 4.0의 선언적 파이프라인은 단순한 기능 추가가 아니라, 데이터 파이프라인을 설계하고 관리하는 방식을 근본적으로 변화시키는 전환점입니다.
- 기존처럼 세부 실행 단계를 지시하지 않아도 되며
- 원하는 결과만 정의하면 Spark가 알아서 효율적으로 실행합니다.
- 코드의 단순화, 유지보수성 향상, 자동 최적화라는 이점을 제공합니다.
앞으로 데이터 엔지니어링에서는 선언적 접근이 점점 보편화될 것이며, Spark Declarative Pipelines는 이러한 변화를 주도할 핵심 기술로 자리매김할 것입니다.

'빅데이터' 카테고리의 다른 글
| Apache Kafka 4.1: 개발자가 꼭 알아야 할 3가지 핵심 업데이트 (0) | 2025.09.11 |
|---|---|
| AI 시대의 데이터 엔지니어링: 스트리밍 역량이 미래를 결정한다 (0) | 2025.08.29 |
| 지금이 업그레이드 적기: OpenSearch 3.0, 왜 주목해야 할까? (0) | 2025.07.25 |
| Kafka 운영, 더 이상 복잡할 필요 없습니다: ktea로 Kafka 클러스터를 터미널에서 간편하게 관리하는 방법 (0) | 2025.07.22 |
| Kafka를 HTTP처럼? Go 개발자를 위한 Kafka 활용법, xkafka (0) | 2025.07.14 |