spark on yarn運行時會加載的jar包有如下:
- spark-submit中指定的
--jars
$SPARK_HOME/jars
下的jar包- yarn提供的jar包
- spark-submit通過參數
spark.driver/executor.extraClassPath
指定的jar包
spark-submit指定的--jar
當使用如下的腳本提交應用時,會將應用本身的jar以及--jar
指定的jar包上傳到集群中。
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--jars a.jar,b.jar,c.jar \
http://path/to/examples.jar \
--jar
是以逗號分隔的jar包列表,不支持直接使用目錄。
--jar
上傳的包會包含在Driver和Executor的classpath中
$SPARK_HOME/jars
下的jar包
提交應用時,會將$SPARK_HOME/jars
下的所有jar包打成一個zip包,上傳到集群中。
“打zip上傳”這個操作會在每次提交應用時執行,會有一點的性能損耗。
spark提供了spark.yarn.archive
和spark.yarn.jars
兩個參數。可以將spark運行時需要的jar包緩存在HDFS上,無需每次運行任務的時候都進行分發。
如spark.yarn.archive=hdfs://cdh1/spark-jar.zip
,直接從對應路徑讀取spark運行時需要的包。
yarn提供的jar包
在yarn-site.xml中會配置yarn.application.classpath
,包含hadoop相關的一些包
<property>
<name>yarn.application.classpath</name>
<value> $HADOOP_CLIENT_CONF_DIR,$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*
</value>
</property>
這些包也會在應用提交的時候被加載。
通過參數指定的jar包
提供了以下4個相關參數:
spark.executor.extraClassPath顯式地將jar包注冊到executor的classpath中
spark.driver.extraClassPath與executor配置項同理
spark.driver.userClassPathFirst=true
spark.executor.userClassPathFirst=true
通過extraClassPath指定jar包的方式和之前通過--jars
差不多,只不過extraClassPath可以通過指定目錄的方式來指定,如/cdh1/jars/*
。
還有一點重要的是:extraClassPath可以通過配置userClassPathFirst
來保證用戶指定的jar包先被加載,這在解決沖突時是作用很大的。