Spark에서 Python, Java, Scala 중 어떤 언어를 선택할지 고민해야 하는 이유는 각 언어마다 성능, 사용성, 기능 지원이 다르기 때문이다. Spark의 핵심은 Scala로 작성되었지만, Python과 Java도 지원되므로 상황에 맞게 선택해야 한다.
| 비교 항목 | Scala | Python (PySpark) | Java |
|---|---|---|---|
| 성능 | 가장 빠름 (Spark의 기본 언어) | 느림 (JVM과 통신 오버헤드) | 빠름 (Scala와 유사) |
| 사용 편의성 | 어려움 (언어 난이도 높음) | 쉬움 (가장 배우기 쉬움) | 중간 (코드가 장황함) |
| Spark API 지원 | 최상 (모든 기능 지원) | 제한적 (낮은 API 지원 수준) | 대부분 지원 |
| 유연성 & 생태계 | JVM 기반 (Scala 중심) | ML 라이브러리 풍부 (Pandas, NumPy, TensorFlow) | JVM 중심 (ML 환경 부족) |
| 배포 & 유지보수 | 어렵고 복잡함 | 쉬움 | 어렵고 복잡함 |
Spark 최적화가 필요한 엔지니어, 고성능 배치 처리에 사용한다.
장점
단점
데이터 분석, 머신러닝, 쉬운 Spark 개발이 필요한 경우 사용한다.
장점
단점
Java 기반 엔터프라이즈 환경, 기존 Java 프로젝트와 연동할 경우 사용한다.
장점
단점
| 비교 항목 | PySpark | Scala (Spark) |
|---|---|---|
| 실행 속도 | 느림 (약 2~5배 차이) | 빠름 |
| JVM 인터페이스 | Py4J (Python → JVM 호출) | 네이티브 JVM |
| 메모리 최적화 | Python 객체로 관리 (GC 영향) | JVM 내부 최적화 |
| 사용 편의성 | Python 친숙 (데이터 분석가 친화적) | 개발자가 최적화 가능 |
| ML 지원 | Pandas API, MLflow 연동 강점 | MLlib 지원 |
Spark 서버는 도커를 사용했다. 도커로 스파크 서버를 실행한다. (컨테이너 내부의 /workspace 폴더와 현재 작업 폴더 Mount)
docker run -d \
--name spark-master \
-p 8080:8080 \
-p 7077:7077 \
-p 4040:4040 \
-v $(pwd):/workspace \
bitnami/spark:latest
ubuntu@DESKTOP-SCOK45O:~/myspark/helloworld$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
696db11c4d6e bitnami/spark:latest "/opt/bitnami/script…" 3 hours ago Up 3 hours 0.0.0.0:4040->4040/tcp, [::]:4040->4040/tcp, 0.0.0.0:7077->7077/tcp, [::]:7077->7077/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp spark-master
vi hello.py
class Greeting:
def __init__(self):
self.greeting = "Hello, Spark!"
class Hello(Greeting):
def __init__(self):
super().__init__()
print(self.greeting)
if __name__ == "__main__":
Hello()
PySpark는 SBT와 달리 패키지 관리자를 사용하지 않는다. 이로 인해 실행 방법은 매우 간단하다.
ubuntu@DESKTOP-SCOK45O:~/myspark$ docker exec -it 383fd62c157d spark-submit /workspace/hello.py
Hello, Spark!
25/03/25 03:45:08 INFO ShutdownHookManager: Shutdown hook called
25/03/25 03:45:08 INFO ShutdownHookManager: Deleting directory /tmp/spark-174fd0e6-865e-4f53-8edc-39a397d63d5d
| 기능 | Scala (Spark) | Python (PySpark) |
|---|---|---|
| 패키지 관리자 | sbt, Maven, Gradle | pip, conda |
| 의존성 관리 | build.sbt | requirements.txt, pyproject.toml |
| 패키지 설치 방법 | libraryDependencies += | pip install |
| JAR 패키징 | sbt package / sbt assembly | zipapp 또는 PyPI 패키지 배포 |
| 실행 방식 | spark-submit --class MainClass myapp.jar | spark-submit myscript.py |