PySpark vs. Scala Spark 어떤 언어를 선택해야할까?
Spark를 사용할 때 가장 많이 고민하는 것 중 하나는 PySpark와 Scala Spark중 어떤 것을 선택하는지 아닐까 싶습니다.
저도 실무에는 PySpark만 사용해봤지만 오늘은 두 가지 방식을 비교해 보도록 하겠습니다.
1. 비교 기준
- 성능 : 동일한 작업을 실행할 때 두 방식의 속도 차이
- 개발 생산성 : 코드 작성, 유지보수, 디버깅 편의성
- 확장성 과 활용 사례 : ML, 데이터 처리, 스트리밍 환경에서의 사용성
- 팀 구성 및 프로젝트 요구사항 : 팀의 기술 스택과 목적에 따라 달라지는 선택 기준
2. 장담점 비교
PySpark
✳️ 장점
- Python 기반이라 배우고 쉽고, 데이터 분석팀과 협업하기 용이
- 풍부한 데이터 사이언스 라이브러리(Pandas, NumPy, Scikit-learn 등)
- 빠른 프로토타이핑 가능
✴️ 단점
- JVM 기반 Spark에 비해 상대적으로 느림
- RDD 변환 과정에서 성능 저하 발생
- 메모리 사용량이 많고 최적화가 어려울 수 있음
Scala Spark
✳️ 장점
- Spark의 기본 언어로 성능 최적화에 유리
- 낮은 오버헤드로 실행 속도가 빠름
- Spark의 저수준 API까지 활용 가능
✴️ 단점
- Scala 언어 자체의 학습 곡선이 높음
- 개발 생산성이 떨어질 수 있음 (ex 코드 작성 속도 등)
- Python 생태계와의 연계가 어려움
3. 속도 비교 테스트
실험 환경
- 데이터 셋 : 1GB, 10GB, 100GB (.csv 파일)
- GroupBy _ Aggregation, Broadcast Join 비교
- 클러스터 : 4CORE, 16GM RAM
PySpark 코드
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, broadcast
import time
spark = SparkSession.builder.appName("PySparkTest").getOrCreate()
df = spark.read.csv("data.csv", header=True, inferSchema=True)
small_df = spark.read.csv("small_data.csv", header=True, inferSchema=True)
start_time = time.time()
grouped_result = df.groupBy("category").agg(sum("value")).collect()
joined_result = df.join(broadcast(small_df), "category", "inner").collect()
end_time = time.time()
print("Execution Time (PySpark):", end_time - start_time)
Scala Spark 코드
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
val spark = SparkSession.builder.appName("ScalaSparkTest").getOrCreate()
val df = spark.read.option("header", "true").csv("data.csv")
val smallDf = spark.read.option("header", "true").csv("small_data.csv")
val startTime = System.nanoTime()
val groupedResult = df.groupBy("category").agg(sum("value")).collect()
val joinedResult = df.join(broadcast(smallDf), "category", "inner").collect()
val endTime = System.nanoTime()
println(s"Execution Time (Scala Spark): ${(endTime - startTime) / 1e9} seconds")
결과 비교
방식 | 1GB 실행 속도 | 10GB 실행 속도 | 100GB 실행 속도 |
PySpark | 2.1초 | 12.4초 | 78.7초 |
Scala Spark | 1.6초 | 7.9초 | 50.1초 |
Scala Spark가 실행 속도에서는 우수한 성능을 보였습니다.
PySpark는 JVM과 Python 사이에서 데이터를 변환하는 오버헤드가 있기 때문입니다.
Spark 3. 버전에서는 Adaptive Query Execution(AQE) 기능이 추가되어, PySpark에서도 성능 향상이 이루어져
자동 최적화가 가능해 지면서 성능 차이도 줄어든 부분이 있습니다.
그럼 어떤 걸 선택해야할까? (고려 사항)
- 팀에서 가장 잘 지원할 수 있는 언어는 무엇인가?
- 현재 내 코드베이스는 어떤 언어로 작성되어 있는가?
- 내 파이프라인의 로직은 얼마나 복잡한가?
- 사용하고 지원해야 하는 타사 라이브러리가 있는가?
- 특정 언어에 대한 더 나은 지원을 제공하는 외부 시스템과 통합하는가?
제가 생각 했을 때의 정리사항입니다.
a. 성능: 성능이 애플리케이션에 중요한 요소이고 더 빠른 실행을 우선시한다면 Scala가 더 나은 선택일 수 있습니다 .
컴파일된 특성과 JVM 최적화로 인해 상당한 성능 향상을 얻을 수 있습니다.
b. 개발 생산성: 사용 편의성과 개발 속도가 더 중요한 경우, 특히 데이터 과학 작업의 경우,
PySpark의 Python API는 더 사용자 친화적이고 대화형 프로그래밍 환경을 제공합니다.
c. 기존 지식: 팀의 기술과 전문성을 고려하세요. 이미 Scala나 Python에 능숙하다면
기존 지식을 활용하면 개발 속도가 빨라지고 유지 관리가 더 쉬워질 수 있습니다.
d. 생태계 및 지원: 각 언어에 대한 라이브러리, 리소스 및 커뮤니티 지원의 가용성을 평가합니다.
Scala는 Spark 개발을 위한 강력한 생태계를 가지고 있는 반면, Python은 더 광범위한 데이터 과학 라이브러리를 제공합니다.
결론
결론적으로 Spark에서 Scala와 PySpark 중에서 선택하는 것은 특정 요구 사항과 우선순위에 따라 달라집니다.
Scala는 뛰어난 성능과 표현력을 제공하므로 성능이 중요한 애플리케이션에 적합한 선택입니다.
반면 PySpark의 사용 편의성, Python 데이터 과학 생태계와의 통합, 더 큰 커뮤니티 지원은 데이터 과학 및 프로토타입 작업에 매력적인 옵션입니다.
팀의 기술, 프로젝트 요구 사항 및 생태계 요인을 고려하여 프로젝트에 가장 적합한 언어를 찾는게 가장 최우선이라고 생각합니다.