1. 程式人生 > >spark on yarn任務提交緩慢解決

spark on yarn任務提交緩慢解決

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