Spark問題[一]:java.lang.ClassNotFoundException: org.apache.spark.launcher.Main
在開發中,需要使用crontab調度Shell腳本,來執行Spark任務。手動執行腳本沒有問題,但是放到crontab中執行,就報以下錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/launcher/Main
Caused by: java.lang.ClassNotFoundException: org.apache.spark.launcher.Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
經查得是crontab在運行過程中找不到當前的環境變量,解決方式有2種:
1:在crontab命令中,添加source命令,或在 shell 腳本中添加source命令:
# 在crontab命令行中添加
45 15 * * * source ~/.bash_profile;bash /home/test/test-etl/sbin/crontab_etl.sh
# 在shell腳本的最前面添加
#! /bin/sh
source ~/.bash_profile
2: 通過 which spark-submit 解決,我是通過第2種方式解決的:
SPARK_HOME=`which spark-submit`
$SPARK_HOME --class com.test.etl.job.scala.job.ETLJob