Spark환경에서 Python과 Scala API 성능 비교
#spark
#pyspark
#scala
#python
2025-04-03
Spark환경에서 Python과 Scala API 성능 비교

Spark 개요와 실험 목적

Apache Spark는 대규모를 분산처리하는 프레임워크로, 메모리 기반 연산을 통해 Hadoop에 비해 실시간 데이터 처리 성능을 높인 플랫폼이다. Spark는 Scala, Python, Java, R 등 다양한 언어의 API를 제공하는데, 해당 논문의 목적은 동일한 Spark 분산환경에서 프로그래밍 언어에 따라 성능 차이가 발생하는지를 실험적으로 분석하는 것이다. 이를 통해 언어 선택이 Spark 성능에 미치는 영향을 확인하고 향후 프로젝트에 어떤 언어의 API를 사용해야하는지 참고하면 될 것 같다.

논문 실험 환경과 데이터

  • 클러스터 환경 구성

    • 마스터 노드 1개 : Intel Core i7-7700 CPU, 8GB RAM, CentOS 6.6

    • 워커 노드 최대 3개 : Intel Core i5-7500 CPU, 8GB RAM, CentOS 6.6

    • 네트워크 1Gbps 유선 LAN 연결

  • 사용 데이터 : 미국 교통부의 항공 운항 데이터 (총 120GB)

    • 기간 : 1987년 10월~2008년 4월 (상업용 비행기의 출발 및 도착 정보)

    • 분석 목표: 항공 지연이 빈번한 월/요일 등 통계 분석

Python과 Scala로 각각 구현하여 성능을 비교하였고, 각 실험 마다 데이터를 로딩하여 RDD에 저장하고, Map Reduce와 같은 Spark 연산을 수행하여 결과를 얻기까지 걸린 시간을 측정하였다.

실험 결과

위에 표는 Spark 워커 노드의 개수를 1개, 2개 3개로 변화시키며 Python과 Scala 의 평균 처리시간에 관한 내용이다. 표를 보면 알 수 있듯이 워커 노드가 늘어날수록 처리 시간은 단축이 된다. 다만 증가분에 따른 효율 향상이 둔화가 된다. 이는 워커 노드 증가에 따른 분산 처리 오버헤드와 작업 분할 한계 때문이다. 노드 수를 두배로 늘린다고 처리시간이 반으로 줄어들지 않는다는 걸 확인 할 수 있다. 최종적으로 워커 노드 증가는 초기 1개에서 2개로 늘릴 때 가장 큰 효과를 보였고, 이후 추가 증가는 점진적으로 한계 효용이 감소하는 양상을 보였다.

그렇다면 Scala가 더 빠른 이유는 무엇일까?

Scala API의 성능이 Python API보다 뛰어난 이유는 주로 Spark의 실행 환경과 언어 구현상의 차이에서 비롯된다. Spark의 핵심 데이터 구조인 RDD(Resilient Distributed Dataset)는 JVM 상에 저장되고 처리되는데 Scala는 JVM 위에서 바로 실행되는 언어이므로 데이터에 대한 접근과 연산이 직접적이다. 반면 PySpark (Python API)의 경우 Py4J(Python for Java)라는 인터페이스 게이트웨이를 통해 Spark JVM 엔진과 통신한다. Python 코드에서 Spark의 Java 객체를 호출하거나 데이터를 주고받을 때 직접적인 메모리 접근이 아닌 Py4J를 통한 직렬화/역직렬화 및 IPC(프로세스 간 통신) 오버헤드가 발생한다. 즉, Scala는 Spark엔진과 동일한 프로세스 공간에서 동작하지만, Python은 별도 Python 프로세스에서 명령을 내리고 결과를 받는 구조이기 때문에 추가 비용이 든다. 이러한 구조적 차이로 인해, 동일한 작업을 수행할 때 Scala가 Python보다 훨씬 빠른 실행 시간을 보여준다.

두개의 언어 API의 장단점

우선, Python의 장점으로는 배우기 쉽고 문법이 간단하여 개발 생산성이 높으며, 데이터 과학자나 분석가에게 친숙한 언어이다. 풍부한 라이브러리 생태계(예: pandas, NumPy, sci-kit learn 등)와 결합하기 용이해 머신러닝 및 데이터 분석 작업을 빠르게 구성할 수 있다. 또한 커뮤니티와 자료가 풍부하여 유지보수와 협업에도 이점이 있다. 그래서 복잡한 성능보다는 분석 자체에 초점에 맞추는 프로젝트에 적합하다고 할 수 있다.

단점으로는 앞서 실험 결과에서 보았듯 Spark 환경에서의 실행 성능이 낮다. 이는 JVM과의 호환성 부족으로 인한 오버헤드와 Python 자체의 처리 속도 한계에서 기인한다. 대용량 데이터를 다룰 때 Py4J 통신 지연, 데이터 직렬화 비용, Python 함수 처리 속도 등이 병목이 될 수 있어, Scala에 비해 실행 시간이 크게 길어질 수 있다.

Scala의 장점으로는Spark의 모체 언어로서 Spark API 지원이 가장 완벽하고, 성능 면에서 최적화되어 있다. JVM 위에서 실행되므로 메모리 관리와 연산 처리 속도가 빠르며, 코드가 컴파일되어 실행되므로 대규모 데이터 처리에 효율적이다. 실험에서도 Scala는 Python 대비 11~13배의 성능 우위를 보였다. 이를 통해 실시간 데이터 처리나 대용량 배치 작업에서 최대 성능을 끌어낼 수 있다.

반면 단점으로는 학습 곡선이 가파르다는 점이 가장 큰 단점으로 꼽힌다. Scala는 함수형 프로그래밍 개념과 복잡한 타입 시스템을 갖추고 있어 Python에 비해 코드 구현 난이도가 높고 개발 인력이 제한적일 수 있다. 데이터 분석가보다는 소프트웨어 엔지니어에게 친숙한 편이며, 코드 가독성이 Python보다 떨어진다는 의견도 있다. 또한 머신러닝/데이터 분석 분야에서는 Python 생태계에 비해 라이브러리나 툴 지원이 상대적으로 적거나 불편할 수 있다.

마지막으로 정리를 하자면, Spark에서 병렬 처리를 위해 Scala와 PySpark 중 선택하는 것은 프로젝트의 구체적인 요구사항과 우선순위에 따라 달라진다. Scala는 뛰어난 성능과 표현력을 제공하여 성능이 매우 중요한 애플리케이션에 적합한 선택이다. 반면 PySpark는 사용 편의성, Python 데이터 과학 생태계와의 통합성, 보다 큰 커뮤니티 지원 덕분에 데이터 과학 작업이나 프로토타입 작업에 매우 매력적인 옵션이다. 팀의 역량, 프로젝트의 요구사항 및 생태계 요소를 고려하여 여러분의 프로젝트에 가장 적합한 언어를 선택하면 될 것 같다.


출처

Scala vs PySpark: Choosing the Right Language for Parallel Processing in Spark

Performance Comparison of Python and Scala APIs in Spark Distributed Cluster Computing System

댓글

댓글을 불러오는 중...