簡體   English   中英

無法通過Scala將應用程序參數傳遞給spark-submit

[英]Trouble passing application argument to spark-submit with scala

我對函數式編程非常陌生,沒有強制性的編程背景。 在線運行一些基本的scala / spark教程,並且在通過spark-submit提交Scala應用程序時遇到一些困難。

特別是,我得到了一個java.lang.ArrayIndexOutOfBounds 0異常,該異常已經研究並發現位置0處的數組元素是罪魁禍首。 進一步研究它,我發現一些基本的調試可以告訴我Main應用程序是否實際上在運行時獲取了參數-事實並非如此。 這是代碼:

import org.apache.spark.{SparkConf, SparkContext}

object SparkMeApp {
  def main(args: Array[String]) {

    try {
      //program works fine if path to file is hardcoded
      //val logfile = "C:\\Users\\garveyj\\Desktop\\NetSetup.log"
      val logfile = args(0)
      val conf = new SparkConf().setAppName("SparkMe Application").setMaster("local[*]")
      val sc = new SparkContext(conf)
      val logdata = sc.textFile(logfile, 2).cache()
      val numFound = logdata.filter(line => line.contains("found")).count()
      val numData = logdata.filter(line => line.contains("data")).count()
      println("")
      println("Lines with found: %s, Lines with data: %s".format(numFound, numData))
      println("")
    }
    catch {
      case aoub: ArrayIndexOutOfBoundsException => println(args.length)
    }
  }
}

要使用spark-submit提交應用程序,請使用:

spark-submit --class SparkMeApp --master "local[*]" --jars target\scala-2.10\firstsparkapplication_2.10-1.0.jar NetSetup.log

...其中NetSetup.log與我提交應用程序的目錄位於同一目錄中。 該應用程序的輸出很簡單:0。如果刪除try / catch,則輸出為:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at SparkMeApp$.main(SparkMeApp.scala:12)
        at SparkMeApp.main(SparkMeApp.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

值得指出的是,如果刪除參數並硬編碼日志文件的路徑,則應用程序運行良好。 真的不知道我在這里想念的是什么。 任何方向將不勝感激。 提前致謝!

您做錯了火花提交。 實際命令是

./spark-submit --class SparkMeApp --master "local[*]" \
example.jar examplefile.txt

僅當存在外部依賴項並且要將該jar分發給所有執行者時,才需要傳遞--jars。

如果您已將log4j.properties啟用為INFO / WARN,則可以輕松捕獲它。

Warning: Local jar /home/user/Downloads/spark-1.4.0/bin/NetSetup.log does not exist, skipping.

文本文件應位於HDFS(如果使用HADOOP)中或要用於支持SPARK的任何其他DFS中,以便為應用程序傳遞相對路徑以讀取數據。 因此,應將文件放入DFS中以使應用程序正常工作,否則僅給出OS文件系統的絕對路徑。

在此處查找有關如何將文件添加到HDFS的說明,以及相關討論可能會對您有所幫助。

另外,您還要設置兩次要由應用程序使用的集群:在Spark conf( setMaster("local[*]") )中:

val conf = new SparkConf().setAppName("SparkMe Application").setMaster("local[*]")

並在提交( --master "local[*]" )中:

spark-submit --class SparkMeApp --master "local[*]" --jars target\scala-2.10\firstsparkapplication_2.10-1.0.jar NetSetup.log

您只需要執行一次,選擇其中之一即可。

-問題解決了-我沒有正確使用spark-submit命令。 通過從命令中刪除“ --jars”,Spark-submit接收了Scala應用程序參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM