Spark on Yarn运行时加载的jar包
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包先被加载,这在解决冲突时是作用很大的。