우선 로컬 환경에서 spark session을 생성하는 것부터 시작했다.
mvnrepository에서 spakr-sql dependency의 최신 버전을 가져와 무작정 빌드했더니 온갖 에러가 발생했다.
에러 1. Janino Version 관련 에러
** 에러메시지 : Exception in thread "main" java.lang.NoSuchMethodError: org.codehaus.commons.compiler.Location.<init>(Ljava/lang/String;SS)V
Spark sql의 여러 버전을 시도해보고 검색해본 결과 해당 에러는 build.gradle에 다음과 같이 설정함으로써 없앨 수 있었다.
// https://mvnrepository.com/artifact/janino/janino
implementation group: 'org.codehaus.janino', name: 'janino', version: '3.0.16'
// https://mvnrepository.com/artifact/org.codehaus.janino/commons-compiler
implementation group: 'org.codehaus.janino', name: 'commons-compiler', version: '3.0.16'
implementation (group: 'org.apache.spark', name: 'spark-sql_2.12', version: '3.0.0') {
// exclude transitive logging dependency from zookeeper
exclude group: 'org.slf4j'
exclude group: 'org.codehaus.janino'
}
// https://mvnrepository.com/artifact/org.apache.spark/spark-core
implementation (group: 'org.apache.spark', name: 'spark-core_2.12', version: '3.0.0'){
// exclude transitive logging dependency from zookeeper
exclude group: 'org.slf4j'
exclude group: 'org.codehaus.janino'
}
에러 2. NoSuchFieldException while creating a spark session using builder 에러
** 에러 메시지
java.lang.RuntimeException: java.lang.NoSuchFieldException: DEFAULT_TINY_CACHE_SIZE
at org.apache.spark.network.util.NettyUtils.getPrivateStaticField(NettyUtils.java:131) ~[spark-network-common_2.11-2.2.1.jar:2.2.1]
이 역시 netty 버전 관련 에러였다. 기존에 운영중인 프로젝트의 경우 다른 기능들에서 사용하는 라이브러리들을 spark에서 포함하는 경우들이 있어 빌드 과정에서 하나하나 확인한 후 조치를 취해야 하는 것 같았다. 내 경우엔 처음에 메이븐 리포지터리에서 io.netty를 가져와 빌드해봤다. 로컬 환경에서는 실행이 잘 됐지만 도커 컨테이너에 war 로 배포하여 서버에서 테스트 했을 땐 애플리케이션 구동 시 에러가 발생했다.
이 문제 또한 위의 build.gradle 일부 예시처럼 spark sql과 spark core 버전을 수정하니 해결되었다.
에러 3. java.lang.ClassNotFoundException: org.codehaus.janino.InternalCompilerException 에러
** 에러 메시지
java.lang.ClassNotFoundException: org.codehaus.janino.InternalCompilerException
이해하기로는 spark도 해당 dependency를 포함하고 있어 같은 dependency가 여러 번 참조되어 충돌이 발생한 것이다.
글 상단 build.gradle 예시와 같이 spark를 implementation 할 때 org.codehaus.janino를 exclude 해줌으로써 해당 에러를 해결했다. 다음 링크의 글을 참조하였다.
https://issues.apache.org/jira/browse/SPARK-23605
[SPARK-23605] Conflicting dependencies for janino in 2.3.0 - ASF JIRA
spark-catalyst_2.11 2.3.0 has both a janino 2.7.8 and a commons-compiler 3.0.8 dependency which are conflicting with one another resulting in ClassNotFoundExceptions. java.lang.ClassNotFoundException: org.codehaus.janino.InternalCompilerException at java.n
issues.apache.org
에러 4. 서버에서 spark session 생성 시 에러 발생
** 에러 메시지
ERROR 5533 — [ main] org.apache.spark.SparkContext : Error initializing SparkContext. org.apache.spark.SparkException: Invalid Spark URL: spark://HeartbeatReceiver@applicationName~~
해당 에러가 아마 제일 시간을 많이 잡아먹은 에러일 것이다. 구글에도 검색해보고 챗지피티에도 열심히 물어봐가며 수많은 방법들을 시도했지만 해결이 안됐다.
시도한 방법들
1. spark session 생성 시 master url을 spark://hostname:port로 설정 -> spark를 별도의 서버나 다른 컨테이너에서 사용하는 것이 아닌 같은 컨테이너 내애서 생성하여 사용하기 때문에 잘못된 접근
2. docker network 설정 -> docker network 역시 다른 컨테이너 간 통신에 사용. 내가 구현하고자 하는 구조와 다름
3. setMaster(local[*]) 이 아닌 "spark://your-spark-master:7077" 로 변경. -> 위의 두 방법과 같은 이유로 올바른 해결방법이 아님
4. SPARK_HOME 환경 변수 설정 - 그럴듯 했으나 해결에 도움이 안됨.
**리눅스 환경변수 설정 관련 링크
리눅스 환경변수 설정 및 해제하기
리눅스 bash 쉘에서 환경변수를 설정하고 해제하는 방법에 대한 정리이다. 1. 환경변수 임시 적용(export) $ export 환경변수명=값 예를들어 TOMCAT_HOME이라는 환경변수를 /usr/lib/tomcat/tomcat1.8/ 로 지정하
www.leafcats.com
https://gr-st-dev.tistory.com/266#google_vignette
[Linux] 리눅스에서 환경 변수를 설정하는 방법, export env 리눅스
Linux에서 환경 변수 설정하는 방법 환경 변수는 시스템의 동작을 제어하기 위해 사용되는 중요한 요소입니다. 리눅스 환경에서는 환경 변수를 설정하여 응용 프로그램의 동작을 조정하거나 시
gr-st-dev.tistory.com
이 외에도 구글에 검색했을 때 나오는 여러 방법들을 시도해보고, spark 버전도 바꿔 봤지만 같은 에러가 반복되었다.
그러던 중 아래 아주 간단한 설정을 통해 해당 문제를 해결할 수 있었다.
** 해결 방법
spark session 생성 시 spark.driver.host 의 값을 localhost로 설정하기.
다음은 애플리케이션 내에서 sparkSession을 생성할 때 사용하는 config 파일이다.
import org.apache.spark.SparkConf;
import org.apache.spark.sql.SparkSession;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SparkConfig {
public SparkSession sparkSession() {
SparkConf sparkConf = new SparkConf()
.setAppName("myApplication")
.setMaster("local[*]")
.set("spark.driver.host","localhost")
.set("spark.sql.caseSensitive", "false")
.set("spark.sql.adaptive.enabled", "true")
.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
.set("spark.sql.quotedIdentifiers", "false");
return SparkSession.builder()
.config(sparkConf)
.getOrCreate();
}
}
위의 설정에서 set("spark.driver.host","localhost") 이 설정이 Invalid Spark URL 에러의 해결 방법이었다.
참고
Spark on windows - Error initializing SparkContext, Invalid spark URL
I'm trying to run Apache Spark on Windows 8.1 When I call the spark-shell command, I get the following stack: C:\spark\spark-2.3.0-bin-hadoop2.7\bin>"C:\new\spark\spark-2.3.0-bin-hadoop2.7\bin\...
stackoverflow.com
https://issues.apache.org/jira/browse/SPARK-24192
[SPARK-24192] Invalid Spark URL in local spark session since upgrading from org.apache.spark:spark-sql_2.11:2.2.1 to org.apache.
since updating to Spark 2.3.0, tests which are run in my CI (Codeship) fail due to a allegedly invalid spark url when creating the (local) spark context. Here's a log from my mvn clean install command execution: 2018-05-03 13:18:47.668 ERROR 5533 — [ ma
issues.apache.org
build.gradle에서 spark 버전을 설정하고, dependency 충돌을 해결하고, spark session을 정상적으로 return하는 configuration을 만들어 마침내 애플리케이션 구동 시 내가 원하는 시점에 sparkSession을 생성할 수 있었다.
다음 포스팅에선 실제로 sparkSession을 통해 서버의 특정 경로에 있는 파일을 읽어와 처리하는 과정에 대해 다루고자 한다.
'Apache Spark' 카테고리의 다른 글
2. 스프링부트 프로젝트 내에서 spark session 사용 (0) | 2024.04.15 |
---|---|
0. Spring boot에서 SPARK 사용 (0) | 2024.04.03 |