[英]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.