🎯 목표
- Apache Spark 학습 동기.
- 어떤 언어(PySpark vs Scala)를 선택할지
Spark를 공부하려는 이유
약 4년간 데이터 엔지니어로 일하면서 파이프라인, 적재, 가공 등 다양한 작업을 경험했지만, 지금까지는 주로 SQL 기반이나 단일 배치 중심의 작업이 많았다. 대규모 데이터를 다루는 데 있어 병렬 처리, 분산 시스템 개념을 실제로 더 깊게 이해하고 싶다는 갈증이 있었다.
Spark는 그동안 운영상 일부 파이프라인에 제한적으로 사용한 적이 있었지만, 실전 활용은 극히 제한적이었다. 특히 스칼라로 몇 개의 작업을 구성해 본 정도가 전부였고, 내부적으로 어떻게 동작하는지, 튜닝 포인트가 어디인지, 어떤 방식으로 확장 가능한지에 대한 감이 부족하다고 느껴졌다.
→ 그래서 이번 기회에 Spark를 본격적으로 다뤄보기로 했다. 목표는 단순한 튜토리얼 수준을 넘어서, 실무형 파이프라인과 튜닝, 분산 처리의 구조를 직접 구성해 보는 데 있다.
PySpark로 할 것인가, Scala로 할 것인가
초기에는 언어 선택도 꽤 고민스러웠다. Spark는 본래 Scala로 만들어졌고, 그래서 기본적인 구조나 문서들이 대부분 Scala에 맞춰져 있는 게 많다. 실제로 내가 예전에 했던 Spark 작업도 전부 Scala였고, 당시엔 "PySpark는 좀 느리고, 완전한 기능을 못 쓴다"는 인식도 많았다.
그런데 다시 살펴보니 요즘은 PySpark도 꽤 괜찮다는 평이 많았고, 게다가 나는 Python에 더 익숙하고, 회사에서 쓰는 대부분의 툴이나 라이브러리(GCP, BigQuery, Pandas 등)도 Python이 중심이라 자연스럽게 PySpark 쪽이 편하게 느껴졌다.
그래서 이번 독학 시리즈는 PySpark로 시작하기로 했다. 나중에 필요해지면 Scala도 같이 살펴보면 되니까.
참고로 둘을 비교하면 대충 이런 느낌이었다:
항목 | PySpark | Scala |
학습 난이도 | Python에 익숙하면 진입 장벽 낮음 | 문법이 복잡하고 JVM 관련 배경지식이 필요함 |
생산성 | 빠르게 결과 확인하며 실습하기 좋음 | 복잡한 로직이나 정교한 작업에 적합할 수 있음 |
문서/자료 | 튜토리얼과 예제가 많고 다양함 | 공식 문서 위주, 최신 자료는 제한적일 수 있음 |
속도 | 대부분 차이 없음, UDF 사용 시 오버헤드 가능 | 네이티브에 가까워 상황에 따라 조금 더 유리할 수 있음 |
참고로 이 "속도" 항목에 있는 내용은 사실 나도 처음에 잘 이해가 안 돼서 좀 찾아봤다.
Spark는 Java 기반의 시스템이라서 JVM(Java Virtual Machine) 위에서 돌아간다.
Scala는 JVM 언어라 Spark랑 거의 바로 연결되지만, PySpark는 Python으로 작성되기 때문에 내부적으로는 Py4J라는 브릿지를 통해 Python ↔ Java 간의 통신이 이루어진다.
대부분의 연산은 Spark 엔진 자체가 처리하기 때문에 PySpark든 Scala든 큰 차이가 없다고 하는데, 사용자 정의 함수(UDF)처럼 Python 코드로 직접 로직을 작성해야 할 땐 얘기가 달라진다. 이럴 경우 Python 함수가 자바로 넘겨졌다가 다시 결과를 받아오는 과정이 추가되는데, 이게 꽤 느릴 수 있다고 한다. 반복적으로 많이 호출되면 성능이 꽤 떨어진다고 해서, 그런 연산은 Scala 쪽이 더 낫다는 말이 있는 것 같다.
아직 이걸 내가 체감한 건 아니지만, 나중에 직접 실습하면서 차이가 나는지 보게 되면 더 정리해보면 좋을 것 같다. 있는 내용은 사실 나도 처음에 잘 이해가 안 돼서 좀 찾아봤다. Spark는 JVM 위에서 돌아가는데, PySpark는 Python에서 JVM으로 명령을 보내는 구조라 중간에 브릿지(Py4J)가 필요하다. 대부분의 연산은 크게 차이가 없지만, 사용자 정의 함수(UDF) 같은 걸 Python으로 쓰면 성능이 떨어질 수 있다고 한다. Scala는 그 점에서 Spark랑 더 직접 연결돼 있어서 그런 부분이 좀 더 유리한가 보다..
> 예를 들어 아래처럼 Python UDF를 등록해서 쓰는 경우
```python
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
@udf(returnType=StringType())
def add_suffix(x):
return x + "_suffix"
df.withColumn("new_col", add_suffix(df.col1))
지금 내 상황에서는 빠르게 실습하면서 Spark 구조를 파악하는 데에는 PySpark가 더 나아 보였다. 이후 필요하면 Scala로 옮기거나 비교해보는 것도 좋은 흐름일 것 같다.
앞으로의 방향
일단은 환경부터 잘 정리하고, PySpark 문법을 빠르게 훑은 다음 실제로 데이터를 가공하거나 저장하는 작업을 해보는 게 목표다. 단순히 문법을 익히는 게 아니라, 실무에서 자주 겪는 데이터 처리 흐름을 PySpark로 어떻게 구성할 수 있을지를 중심으로 보고 싶다.
그리고 나중에는 성능 튜닝, 분산 처리 구조 같은 Spark의 좀 더 깊은 영역도 직접 실습하면서 익혀볼 계획이다. 아직은 하나씩 해보면서 감을 잡아야 할 것 같지만, 그 과정을 기록으로 남기면 나중에 돌아보기에도 좋을 것 같다.
'Python > Spark' 카테고리의 다른 글
Spark 독학하기 3일차 – 분산 처리가 뭐야.. (0) | 2025.05.11 |
---|---|
Spark 독학하기 2일차 – Spark의 기본 개념 구조 (0) | 2025.05.10 |
Spark 독학하기 1일차 – M1 맥에서 PySpark 환경 구성 및 테스트 (2) | 2025.05.10 |
댓글