Apache Spark + Scala + MongoDB 버전 호환 이슈

오형택·2024년 3월 6일
0

Play-Spark

목록 보기
1/8
post-thumbnail

빅데이터 도메인 프로젝트로 추천 시스템을 구축해야했는데 Scala + Spark + MongoDB로 추천 시스템을 구축하는 중 버전 호환 문제가 발생했다.

최초에 선택한 각 소프트웨어 버전

SoftwareVersion
JDK17.0.10
Scala2.13.13
MongoDB7.0.6
Spark ( spark-core, spark-sql )3.5.0
mongo-spark-connector10.2.1

JDK 17을 사용할 경우, SparkSession 생성단계에서 IllegalAccessError가 발생한다.

( Spark가 java.base 모듈의 sun.nio.ch.DirectBuffer에 접근할 수 없다는 에러 )

→ Spark는 인메모리 최적화를 위해 sun.misc.Unsafe와 같은 native memory API를 사용하도록 구현되어있는데 Java 9 부터 도입된 모듈 시스템으로 인해 해당 API가 접근할 수 없도록 private으로 바뀌면서 문제 발생.

Scala 애플리케이션을 실행 할 때 --add-opens=java.base/sun.nio.ch=ALL-UNNAMED 실행 옵션을 추가함으로써 접근 제한을 우회할 수 있는데 이를 적용하기 위해 최초로 찾은 방법은 InetelliJ IDEA에서 VM Option을 추가하는 방식이였다. 그런데 이렇게 할 경우 이후 배포 환경에서 적용할 수 없는 방식이므로 근본적인 해결책이 될 수 없었고 다른 방법을 찾아야 했다.

따라서 애초에 문제가 생기지 않는 JDK 버전인 Java 8 버전으로 전환을 시도했다.

그런데 JDK 8 버전을 사용할 경우, 다른 프로그램들의 버전을 JDK과 호환되는 버전을 찾아서 변경해야 했고, 변경된 버전의 Docs를 찾아가며 지나간 버전의 코드로 전반적인 리팩토링이 필요했다. 그 과정에서 많이 만난 에러가 있는데 바로 java.lang.NoSuchMethodError..

MongoDB와 Spark를 연동하여 작업을 수행할 때, 버전 차이로 인해 내부적인 인터페이스가 달라짐에 따라 발생하는 문제였고, 호환 문제가 없는 버전 조합을 찾는 것도 번거로울 뿐더러 이후 추천 관련 Scala 코드를 Spring Boot 서버에서 올려서 실행할 수도 있는데, 이 경우 어차피 JDK 17을 사용해야 하기 때문에 다시 17버전으로 돌아가서 배포 환경에서의 우려 사항을 해결하는 방향으로 결정했다.

이후 찾아본 방법으로는 build.sbt 파일 (sbt: Scala 빌드 관리 툴, Java에서 Gradle)에 선언적으로 실행 옵션을 추가해주는 방식과 cli 환경에서 SBT_OPT 환경 변수를 추가해줌으로써 실행 옵션을 터미널 세션 단위로 적용한 뒤 sbt run 명령어를 통해 실행하는 방식이 있었는데, 전자(선언적 방식)은 왜인지 적용되지 않는다. 그래서 후자 방식으로 결정(배포 환경에서도 동일하게 적용할 수 있을 것으로 예상됨)

그렇게 어찌저찌 IllegalAccessError 를 뚫었더니 다시 java.lang.NoSuchMethodError 를 만났다..

공식문서를 통해 다시 찾아보니 mongo-spark-connector 10.2.1 버전은 Spark 3.1 ~ 3.2.4 버전까지와 호환되는 것으로 확인
(https://www.mongodb.com/docs/spark-connector/v10.2/)

그래서 Spark 관련 의존성을 모두 수정했고 최종적인 전체 버전은 아래와 같다.

( export 명령어를 통한 환경변수 설정 후 실행 방식은 하나의 터미널 세션에서만 유지되므로 이후 터미널 재실행 혹은 IDEA 재실행 시 재설정이 필요. 아예 로컬 PC 환경 변수에 해당 값을 등록하는 방식도 있지만 그것보다 로컬에서는 IDEA 설정을 통해 실행하기로 함 )

SoftwareVersion
JDK17.0.10
Scala2.13.13
sbt1.9.9
MongoDB7.0.6
Spark ( spark-core, spark-sql )3.2.2
mongo-spark-connector10.2.1

Scala+Spark+MongoDB_실행결과

profile
개발자 지망생

0개의 댓글