Spark 오류 ‘Unsupported class file major version 55’ — Java 11 / Spark 2.4 버전 호환성 문제

검증 환경

본 절은 원문 사례·문서에 등장한 버전/도구를 정리한 것이다. 별도 실험실 재현이 명시되지 않은 항목은 일반화하지 않는다.

항목본문·원문에서 확인된 범위
런타임/도구Java 11
런타임/도구Java 8
런타임/도구Java 9
런타임/도구Java 10
런타임/도구Java 17
런타임/도구Python 2.7
런타임/도구Spark 2.4
런타임/도구Spark 2.4.
문서 정리일2026-08-31
  • OS/CI 세부 값은 프로젝트마다 다르므로, 적용 전 로컬에서 동일 오류 메시지를 재확인한다.

1. 문제 정의

Mac에서 Homebrew로 Spark 2.4.0과 Scala를 설치하고, Anaconda 환경에 PySpark를 설치한 뒤 rdd.collect()를 실행하면 다음과 같은 오류가 발생합니다.

1
2
3
py4j.protocol.Py4JJavaError: An error occurred while calling
z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.lang.IllegalArgumentException: Unsupported class file major version 55

에러 메시지에서 가장 중요한 단서는 **major version 55**입니다. 이 숫자 하나가 뒤에서 설명할 버전 충돌의 핵심 지표입니다.

발생 단계는 PySpark의 collect()처럼 JVM 쪽 작업(RDD 실행)을 호출하는 순간입니다. 즉 스파크 드라이버 JVM이 Spark 내부 클래스 파일을 로딩할 때 실패하며, 그 직전에 파이썬 레벨 오류는 보이지 않습니다.

2. 영향을 받는 버전

Spark 버전공식 지원 Java지원 Python
Spark 2.4.xJava 8Python 2.7 / 3.4+
Spark 3.0+Java 8 / 11Python 2.7+ / 3.4+
  • Spark 2.4.x는 공식적으로 Java 8만 지원합니다. (Scala API는 Spark 2.4.4 기준 Scala 2.12 사용, 호환 Scala 2.12.x가 필요)
  • Spark 3.0 이상에서 Java 11을 공식 지원합니다 (단, Java 8의 8u92 이전 버전은 Spark 3.0.0부터 deprecated).
  • 이 글의 원본 사례는 Java 11 + Spark 2.4.0 조합에서 발생했습니다.

3. 버전별 원인 차이 — 왜 major version 55가 문제인가

증상 fingerprint

  • 에러 메시지: java.lang.IllegalArgumentException: Unsupported class file major version 55
  • 발생 단계: PySpark의 collect(), count(), saveAs... 등 JVM 파이프라인으로 보내는 첫 실행 지점
  • 관련 도구: PySpark / Spark 2.4.x + Java 11(Mac 기준 Homebrew 기본 JDK가 Java 11인 경우 흔함)
  • 흔한 오해: “스파크나 PySpark를 다시 설치하면 되지 않을까?“라고 생각하지만, 문제는 소스도 파이썬 코드도 아닌 JVM의 Java 버전입니다.

Java의 major version은 각 Java 메이저 버전마다 하나씩 증가합니다.

Java 메이저 버전class 파일 major version
Java 852
Java 953
Java 1054
Java 1155
Java 1761

Java 컴파일러는 대상 버전의 major version으로 클래스 파일을 생성합니다. Java 11로 빌드된 클래스 파일은 major version이 55입니다. 하지만 Spark 2.4.x의 JVM은 Java 8 시절 규격(major 52)까지만 인식하므로, 55짜리 클래스를 만나면 “지원하지 않는 클래스 파일 major version"이라며 실행을 거부합니다.

즉 **표면 증상은 “지원 불가 클래스"지만 근본 원인은 “Java 런타임 버전이 Spark가 요구하는 버전보다 높다”**는 버전 호환성 문제입니다. 일반적으로 업그레이드가 해결이지만, 이 경우엔 Spark가 아닌 Java의 버전을 낮추거나(임시), Spark를 올리거나(장기) 둘 중 하나입니다.

4. 임시 해결책 — Java 8로 전환 (Spark 2.4.x 유지)

Spark를 그대로 두고 JVM만 Java 8로 맞추는 방법입니다. 프로젝트를 빠르게 살리기 좋지만, Java 8을 추가로 설치해야 합니다.

4.1 Mac에서 현재 Java 버전 확인

1
2
java -version          # 현재 기본 JVM 버전
/usr/libexec/java_home -V   # 설치된 모든 JDK 나열 (Mac 기준)

4.2 Java 8 설치 (asdf-java / Homebrew 예시)

버전 관리로 다양한 JDK를 설치·전환할 수 있습니다.

1
2
3
# asdf-java 사용 예
asdf install java openjdk-8
asdf local java openjdk-8

4.3 JAVA_HOME을 Java 8로 전환

.bashrc(또는 .zshrc)에 다음을 추가하거나 현재 세션에서 실행합니다.

1
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

주의: 이 설정은 JAVA_HOME을 전역 프로필에 남기므로, Java 11이 필요한 다른 프로젝트(예: 최신 Gradle/Spring)에 영향을 줄 수 있습니다. 환경이 섞여 있다면 전역 프로필 대신 spark-env.sh에서만 Java 버전을 바꾸는 것을 권장합니다. (일반적인 점검 기준이며, 프로젝트 환경에 따라 달라질 수 있습니다.)

5. 권장 해결책 — Spark 3.0+ 업그레이드

Java 11을 유지해야 하는 환경이라면 Spark를 Java 11을 공식 지원하는 3.0 이상으로 업그레이드하는 것이 안정장기 해결책입니다.

1
2
3
# Homebrew로 Spark 업그레이드 예시
brew update
brew upgrade apache-spark

업그레이드 후 spark-shell --version으로 버전을 확인합니다.

6. 검증 명령 (해결 후 성공 여부)

해결 후 실제로 Spark가 문제없이 동작하는지 아래로 확인합니다.

1
2
3
4
5
6
7
8
# 1) 실행 중인 JVM이 기대한 버전인지
java -version

# 2) JVM이 Spark가 요구하는 class 버전을 읽을 수 있는지
spark-shell --version

# 3) PySpark에서 실제 계산이 성공하는지 (중요)
spark-shell <<< 'sc.parallelize(1 to 5).sum'

또한 PySpark 환경에서는 아래 검증을 권합니다.

1
2
3
# SparkSession 생성과 간단한 transform/collect 성공 여부
spark-submit --master local your_job.py
python -c "import pyspark; print(pyspark.__version__)"

spark-submit로 로컬에서 실제 연산이 성공하면 클래스 major version 충돌이 해소된 것입니다.

7. 향후 예방 조치

  1. JDK 버전을 프로젝트 단위로 관리 : asdf, sdkman, 또는 프로젝트별 JAVA_HOME 스크립트로 관리합니다.
  2. Spark 버전과 Java 버전을 표로 명시 : 팀 문서 / README에 “이 프로젝트는 Spark 2.4.x + Java 8” 처럼 명시합니다.
  3. CI에서 Java 버전 고정 : actions/setup-java 또는 빌드 Matrix에서 Spark 지원 버전만 지정합니다.
  4. 업그레이드 시 호환성 확인 : Spark 메이저 업그레이드 전에 공식 문서의 지원 Java/Python/Scala 버전을 확인합니다.

8. DevTrace Verdict

이 문제의 핵심은 PySpark 코드도 Spark 소스도 아니라 JVM이 읽는 Java 버전과 Spark 2.4.x의 지원 버전 불일치다. Spark 2.4.x에는 Java 8(major 52)을, Java 11(major 55) 환경에는 Spark 3.0+을 쓰면 해결됩니다.

  • 증상 fingerprint: Unsupported class file major version 55 + collect() 호출 시점 실패
  • 검증 명령: java -version, spark-shell --version, spark-submit 실제 연산

DevTrace 결론

이 문제의 핵심은 소스 코드가 아니라 JVM의 Java 버전 불일치다. Spark 2.4.x에는 Java 8을, Java 11 환경에는 Spark 3.0+를 써야 한다.

원문 출처는 문제 발견의 단서이며, 위 판단과 점검 항목은 DevTrace의 독자 분석이다.

출처