转: https://www.iteblog.com/archives/1173.html
每次当你在Yarn上以Cluster模式提交Spark应用程序的时候,通过日志我们总可以看到下面的信息:
21
Oct
2014
14
:
23
:
22
,
006
INFO [main] (org.apache.spark.Logging$
class
.logInfo:
59
) -
Uploading file:/home/spark-
1.1
.
0
-bin-
2.2
.
0
/lib/spark-assembly-
1.1
.
0
-hadoop2.
2.0
.jar to
hdfs:
//my/user/iteblog/...../spark-assembly-1.1.0-hadoop2.2.0.jar
21
Oct
2014
14
:
23
:
23
,
465
INFO [main] (org.apache.spark.Logging$
class
.logInfo:
59
) -
Uploading file:/export1/spark/spark-
1.0
.
1
-bin-hadoop2/spark-
1.0
-SNAPSHOT.jar to
hdfs:
//my/user/iteblog/.sparkStaging/application_1413861490879_0010/spark-1.0-SNAPSHOT.jar
|
这是Spark自己将运行时候需要依赖的Java包上传到HDFS上,而且每次运行Spark Application的时候都会上传,这时候你会发现你的hdfs://mycluster/user/iteblog/.sparkStaging目录下面存在了大量的Jar文件,这最少存在两个不好的地方:
1、每次上传Jar文件,多少也会影响到程序的运行速度;
2、当在HDFS中上传了大量的Jar文件,这会产生大量的小文件,会对HDFS有影响。
所以我们想是否可以在HDFS上面建立一个公共的lib库存放目录,每次运行Spark的时候,只要我们程序依赖的Jar包存在HDFS中的lib库中,那么这时候我们就不上传该Jar。其实是可以的。我们可以通过配置相应的环境变量实现,步骤如下:
bin/hadoop fs -mkdir /home/iteblog/spark_lib
bin/hadoop fs -put spark-assembly-
1.1
.
0
-hadoop2.
2.0
.jar
/home/iteblog/spark_lib/spark-assembly-
1.1
.
0
-hadoop2.
2.0
.jar
|
然后编辑spark-default.conf文件,添加以下内容:
spark.yarn.jar=hdfs:
//my/home/iteblog/spark_lib/spark-assembly-1.1.0-hadoop2.2.0.jar
以上配置为原文,下面是自己给出的
|
也就是使得spark.yarn.jar指向我们HDFS上的Spark lib库。
然后你再去提交应用程序
./bin/spark-submit --
class
org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--num-executors
3
\
--driver-memory 512m \
--executor-memory 2g \
--executor-cores
1
\
lib/spark-examples*.jar \
10
|
你可以看到日志里面已经不需要上传spark-assembly-1.1.0-hadoop2.2.0.jar文件了。
根据Cloudera 官方博客说明,如果你用的是Cloudera Manager,那么Spark assembly JAR 会自动地上传到HDFS,比如上面的hdfs://my/home/iteblog/spark_lib/目录。但是我没安装那个,如果你安装了可以试试。