1.為什么要讓運行時Jar可以從yarn端訪問
spark2以后,原有lib目錄下的大JAR包被分散成多個小JAR包,原來的spark-assembly-*.jar已經不存在
每一次我們運行的時候,如果沒有指定
spark.yarn.archive or spark.yarn.jars
Spark將在安裝路徑下的Jar目錄,將其所有的Jar包打包然后將其上傳到分布式緩存(官網上的原話是:To make Spark runtime jars accessible from YARN side, you can specify spark.yarn.archive or spark.yarn.jars. For details please refer to Spark Properties. If neither spark.yarn.archive nor spark.yarn.jars is specified, Spark will create a zip file with all jars under $SPARK_HOME/jars and upload it to the distributed cache.)
這里以簡單地寫了一個wordcount.scala為例,將其打包然后部署到Spark集群上運行
object WordCount { def main(args: Array[String]): Unit = { if (args.length != 2) println("AppName + FilePath") val conf = new SparkConf() // .setMaster("local[4]") .setAppName(args(0)) val sc = new SparkContext(conf) val lines = sc.textFile(args(1)) val flatRDD = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect.foreach(println) } }
觀察日志:
yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
大致的意思說找不到spark.yarn.jars nor spark.yarn.archive,回到spark安裝目錄上傳運行時的Jar包
觀察一下SparkUI,這里以collect為例子
點進去。觀察他的Scheduler Delay
可以看到Scheduler Delay=557-457=100
2.調優辦法
- 首先將Spark安裝路徑下的所有jar包上傳到HDFS上,我是上傳到了
/system/sparkJar/jars
- 接着在spark的conf目錄下的
spark-defaults.conf
末尾添加上這一行spark.yarn.jars hdfs://172.17.11.85:9000/system/sparkJar/jars/*.jar
3.調優之后與調優之前的對比
- 調優之后日志變化:
可以看到它已經不用上傳Spark運行時Jar包到分布式緩存中了
- 看看UI
還是相同的界面:
還是看Scheduler Delay
發現Scheduler Delay=313-263=50
與調優之前時間整整縮短了一半,Scheduler Delay從100縮短到了50