目錄
一、問題重現
使用Spark on YARN運行自帶的SparkPi作業
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/opt/app/spark-2.4.5-bin-2.6.0-cdh5.16.2/examples/jars/spark-examples_2.12-2.4.5.jar \
2
輸出日誌
WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
INFO yarn.Client: Uploading resource file:/tmp/spark-a7f4a566-9d21-43cf-8388-41698316838e/__spark_libs__855332709144911684.zip -> hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_libs__855332709144911684.zip
INFO yarn.Client: Uploading resource file:/tmp/spark-a7f4a566-9d21-43cf-8388-41698316838e/__spark_conf__9173892461601825482.zip -> hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_conf__.zip
提示我們既沒有設置spark.yarn.archive也沒有設置spark.yarn.jars,所以spark自己把所有jar包打成zip包上傳到hdfs上(用完後又刪掉了)
我們查看這兩個文件大小
hadoop fs -du -s -h hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_libs__855332709144911684.zip
246.6 M 739.7 M hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_libs__855332709144911684.zip
hadoop fs -du -s -h hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_conf__.zip
228.7 K 686.0 K hdfs://mycluster/user/root/.sparkStaging/application_1588347637771_0011/__spark_conf__.zip
二、解決方法
日誌都已經提示,那我們就幫下spark,替它把sparkjar包上傳到hdfs上。
1、把spark/jars下的jar包打成zip包(打包目的:防止小文件過多,影響hdfs)
#此方式不行,把jars目錄打進去了,spark找不到jar包。
zip -r sparkjars.zip jars/*
# 使用此方式直接在jars下打。
cd jars
zip sparkjars.zip *.jar
2、上傳到hdfs
hadoop fs -put sparkjars.zip /lib
3、在spark-default配置中指定jar包的地址
vi spark-default.conf
#spark.yarn.jars hdfs://mycluster/lib/spark-yarn-jars/*.jar
spark.yarn.archive hdfs://mycluster/lib/sparkjars.zip
需要注意的是,
1)如果打成zip包,一定要是用spark.yarn.archive。
2)如果使用spark.yarn.jars參數,後面用zip是不行的,需要把所有jar包直接傳到hdfs上,這種方式不推薦,小文件太多,系統提供這個參數應該是針對單一jar包用的,就不用再解壓了。
3)一開沒注意,使用spark.yarn.jars+zip作業運行不成功。其實看名字的話,也猜出來了。
三、結果驗證
重新運行項目,查看日誌
INFO yarn.Client: Source and destination file systems are the same. Not copying hdfs://mycluster/lib/sparkjars.zip
可以發現spark已經從我們配置的目錄讀取了jar包