본문 바로가기
Bigdata Components/SPARK

[SPARK] java.io.FileNotFoundException: {file_name}.conf ERROR 해결 방법

by Blue____ 2024. 1. 8.

이번 글에서는 spark-submit으로 Application을 제출하는 과정에서 java.io.FileNotFoundException 에러가 발생하는 경우의 해결 방법을 정리할 예정입니다. 


우선, java.io.FileNotFoundException 에러가 발생한 spark-submit의 제출 코드를 확인할 필요가 있습니다. 아래는 실제 에러가 발생시켰던 spark-submit 제출 코드입니다. 

 spark-submit \
 --class com.example.MySparkApp \
 --master yarn \
 --deploy-mode cluster \ 
 --driver-cores 1 --driver-memory 5G --num-executors 60 --executorcores 5 --executor-memory 25G \
 --conf "spark.dynamicAllocation.enabled=false" \
 --conf "spark.memory.storageFraction=0.2" \
 --conf "spark.memory.fraction=0.9" \
 --driver-java-options="-Dconfig.file=spark_driver.conf"
 mysparkapp.jar

 

위의 코드의 설정 값을 확인해보면, --class에는 spark의 Main class가 들어가고, --master는 cluster master로 yarn을 활용하기에 yarn으로 명시합니다. --deploy-mode는 cluster 모드로 사용합니다. (deploy-mode에 대한 내용은 이전의 [SPARK] spark job과 partition의 개념 글을 참조 바랍니다)

 

추가로 --driver-cores, --driver-memory, --num-executors, --executorcores, --executor-memory 등의 리소스 설정이 되어있습니다. --conf 에는 "dynamicAllocation", "memory.fraction", "memory.storageFraction" 등의 옵션을 추가했습니다. (이전 글 참고)

 

마지막으로 --driver-java-options으로 "spark_driver.conf" 라는 driver 환경 변수 파일을 지정했습니다. 

 

별 문제없는 코드로 보이지만, submit을 진행하면 아래와 같은 에러가 발생합니다. 

Container exited with a non-zero exit code 13. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
ls.scala:226)
 at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:468)
 at org.apache.spark.deploy.yarn.ApplicationMaster.org$apache$spark$deploy$yarn$ApplicationMaster$$runImpl(ApplicationMaster.scala:305)
...

Caused by: com.typesafe.config.ConfigException$IO: spark_driver.conf: java.io.FileNotFoundException: spark_driver.conf ( )
 at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:190)
...

 

에러 내용을 확인해보면, spark의 Driver가 올라오는데, 에러가 발생했고 에러의 내용은

"spark_driver.conf: java.io.FileNotFoundException"로 --driver-java-options에 지정했던, spark_driver.conf 파일을 찾을 수 없다는 내용이었습니다. 

 

spark_driver.conf 파일이 있는 path에서 spark-submit 코드를 제출했기에 코드 상의 path 지정에는 문제가 없었습니다. 

 

이유는 "deoploy-mode cluster"에 있었습니다. cluster mode의 가장 큰 특징은 spark의 driver가 코드를 제출한 곳이 아닌 Worker node들 중, 한 곳에서 컨테이너를 할당받아 올라오게 됩니다.(client mode에서는 정상 제출됨) 즉, spark-submit 코드를 Master node에서 제출했다 하더라도, driver는 Worker node들 중, 한 곳에 컨테이너를 할당 받습니다 (yarn으로 부터). 

 

결과적으로, Worker node 1번에 할당된 spark의 driver는 conf 파일이 있는, Master node의 로컬 path를 찾을 수가 없습니다. 이런 경우, 가장 간단하고 지속 관리하기 효율적인 방법은 Storage 영역에 파일을 올려놓는 방법입니다. 

 

아래는 HDFS에 conf 파일을 load한 후, --driver-java-options의 path를 수정한, spark-submit 제출 코드입니다.

 spark-submit \
 --class com.example.MySparkApp \
 --master yarn \
 --deploy-mode cluster \ 
 --driver-cores 1 --driver-memory 5G --num-executors 60 --executorcores 5 --executor-memory 25G \
 --conf "spark.dynamicAllocation.enabled=false" \
 --conf "spark.memory.storageFraction=0.2" \
 --conf "spark.memory.fraction=0.9" \
 --driver-java-options="-Dconfig.file=spark_driver.conf"
 --files "hdfs:///user/blue/conf/spark_driver.conf" \
 mysparkapp.jar

 

위의 코드처럼 hdfs의 /user/blue/conf/ 경로에 올린, conf 파일의 path를 추가해 주었습니다.

--files "hdfs:///user/blue/conf/spark_driver.conf

 

결과적으로, cluster 모드에서도 정상적으로 App이 제출됩니다.