FAQ 보강 — PySpark 학습 경로와 ETL 적합성 판단, 로컬 vs 클러스터
PySpark Tutorial: Build a Real Pipeline and Read the Spark UI — Darshil Parmar PySpark Tutorial: Build a Real Pipeline and Read the Spark UI — Frequently asked questions 구간 (27~29페이지)
이 모듈을 다 읽으면
- PySpark를 배우는 진짜 어려움이 API 문법이 아니라 지연 평가·셔플·기본 파티션 수 같은 실행 모델에 있다는 점을 설명할 수 있다
- PySpark가 적합한 상황과 DuckDB/pandas가 더 나은 상황을 데이터 크기와 인프라 기준으로 구분할 수 있다
- 로컬(local[*]) 모드와 실제 클러스터의 차이가 '코드가 다르다'가 아니라 '태스크가 실행되는 위치가 다르다'는 것임을 설명할 수 있다
이 FAQ는 앞선 실습에서 실제로 겪은 것들을 요약한다. PySpark 문법 자체는 Python과 SQL을 이미 아는 사람에게는 주말이면 익힐 수 있지만, 진짜 난이도는 지연 평가·셔플·기본 200개 셔플 파티션 같은 실행 모델을 이해하는 데 있다. PySpark는 pandas가 한 대의 메모리에서 감당하기 힘든 규모이거나 이미 Databricks/EMR 같은 Spark 인프라 위에서 일할 때 적합하고, 반대로 작은 파일이라면 DuckDB나 pandas가 오버헤드 없이 더 빠르게 끝낸다. 클러스터 없이 배우는 것이 가능한 이유는 local[*] 모드가 드라이버와 익스큐터를 한 프로세스 안에서 실행하며 지연 평가, 셔플, 브로드캐스트 조인, 파티셔닝, Spark UI를 포함한 핵심 개념을 전부 재현하기 때문이다. 클러스터는 태스크가 물리적으로 어디서 실행되는지를 바꿀 뿐, 코드 자체는 입력 경로 외에 바뀌는 것이 없다.
PySpark가 쉬운 이유와 어려운 이유는 다르다
Python과 SQL을 이미 다룰 줄 안다면 PySpark의 API 자체(select, filter, withColumn, groupBy, join)는 주말이면 익힐 수 있다. 진짜 어려운 부분은 문법이 아니라 실행 모델이다 — 트랜스포메이션은 지연 평가되어 액션이 호출되기 전까지 아무 일도 하지 않고, groupBy나 join 같은 wide 연산은 파티션 간 데이터를 이동시키는 셔플을 일으키며, 셔플 파티션 수는 기본 200이라 257행짜리 결과도 200개의 태스크로 처리될 수 있다. localhost:4040의 Spark UI를 일찍부터 열어 확인하는 습관을 들이면 이런 동작들이 더 이상 '알 수 없는 마법'처럼 느껴지지 않게 된다.
핵심 포인트
- PySpark API 문법 자체는 Python/SQL 경험자에게 어렵지 않다
- 진짜 학습 난이도는 지연 평가, 셔플, 기본 200 셔플 파티션 같은 실행 모델에 있다
- Spark UI를 일찍부터 습관적으로 확인하는 것이 실행 모델을 체감하는 가장 빠른 방법이다
PySpark가 과한 선택일 때 — DuckDB/pandas와의 경계
PySpark가 ETL에 널리 쓰이는 이유는 파티션 단위 병렬 처리, 실패한 태스크의 재시도, Parquet/JDBC/클라우드 스토리지와의 기본 연동을 갖췄기 때문이다. 다만 작은 파일을 다룰 때는 이 모든 것이 오버헤드일 뿐이며, DuckDB나 pandas가 훨씬 적은 오버헤드로 더 빠르게 끝낸다. 실용적인 기준은 데이터가 더 이상 한 대의 머신 메모리에 편하게 들어가지 않을 때, 또는 이미 Databricks나 EMR 같은 Spark 인프라 위에서 일하고 있을 때 PySpark를 쓰는 것이다.
핵심 포인트
- PySpark는 파티션 병렬 처리, 태스크 재시도, 다양한 포맷 연동 덕분에 대규모 ETL에 강하다
- 작은 파일에는 PySpark의 분산 처리 오버헤드가 오히려 손해이며 DuckDB/pandas가 더 빠르다
- 판단 기준은 데이터가 한 머신 메모리를 넘어서는지, 이미 Spark 인프라 위에 있는지다
클러스터 없이도 배우는 이유 — 코드가 아니라 실행 위치가 다르다
SparkSession.builder.master("local[*]")는 드라이버와 익스큐터를 노트북 하나의 프로세스 안에서 실행하며 가용한 모든 코어를 사용하는데, 이것만으로도 셔플, 브로드캐스트 조인, 파티셔닝, Spark UI를 포함해 실전에서 마주치는 핵심 개념을 전부 배울 수 있다. 165KB짜리 CSV를 처리하던 것과 동일한 스크립트가 Databricks나 EMR에서 테라바이트 단위 데이터를 처리할 때도 입력 경로 외에는 코드 변경 없이 그대로 동작한다. 클러스터가 바꾸는 것은 태스크가 실행되는 물리적 위치이지, 코드를 작성하는 방식이 아니다.
핵심 포인트
- local[*]만으로도 셔플, 브로드캐스트 조인, 파티셔닝, Spark UI를 포함한 실전 핵심 개념을 모두 배울 수 있다
- 로컬에서 검증한 스크립트는 입력 경로 외의 변경 없이 클러스터에서 테라바이트 단위로 그대로 동작한다
- 클러스터는 코드를 바꾸지 않고 태스크가 실행되는 물리적 위치만 바꾼다