2016-08-01 18 views
0

私は関数型プログラミングにはかなり新しく、プログラミングの基本的なバックグラウンドはありません。いくつかの基本的なスカラ/スパークチュートリアルをオンラインで実行し、spark-submitを介してScalaアプリケーションを送信するのにいくつかの問題があります。スカラーでspark-submitにアプリケーション引数を渡すのに問題があります

特に私はjava.lang.ArrayIndexOutOfBounds 0 Exceptionを取得しています。これは、私が調査したところで、位置0の配列要素が原因であることがわかりました。それをさらに調べると、メインアプリケーションが実際に実行時に引数を取り上げているかどうかを示す基本的なデバッグがあることがわかりました。これはそうではありませんでした。ここでは、コードは次のようになります。

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 --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) 

私は、引数とハードコードへのパスを削除する場合は、アプリケーションが正常に動作することを指摘する価値がありますログファイル。私がここで紛失しているものを本当に知りません。いずれの方向にも感謝します。前もって感謝します!

+0

脚注:コマンドラインでファイル名を一重引用符で囲んでみましたが、無駄です。 – Jonathan

答えて

0

テキストファイルは、HDFS(HADOOPを使用している場合)またはSPARKをサポートするために使用している他のDFS(アプリケーションが相対パスを渡してデータを読み取る)にある必要があります。したがって、アプリケーションを動作させるにはDFSにファイルを置く必要があります。それ以外の場合は、OSファイルシステムの絶対パスのみを指定します。

ファイルをHDFSに追加する方法についてはhere、詳細についてはthisを参照してください。

また、あなたが二回アプリケーションが使用するクラスタを設定している:スパーク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 

あなたはそれを一度行うだけで、そのうちの一つを選んでください。

+1

私は、 - jarsフラグがいくつかの.jarファイルやディレクトリをカンマで区切って指定していると考えています。その後、spark-submitスクリプトはアプリケーションのjarを期待しています。この場合、NetSetup.logと考えられます。したがって、 " - jars"フラグを削除する必要があります。 – Marco

+0

spark-submit worksは、単一のjarが--jarsパラメータに渡されて罰金を受け、その引数の直後に引数が必要です。したがって、spark-submitは、上記の設定された複製クラスタを除いてOKです。 – andriosr

+1

--jarsフラグは、アプリケーションjarとともにクラスタに転送される追加のjarを追加するために使用されます。この場合の問題は、 "target \ scala-2.10 \ firstsparkapplication_2.10-1.0.jar"が余分なjarと解釈され、 "NetSetup.log"がアプリケーションjarとなります。アプリケーションの引数がありません – Marco

1

スパーク送信が間違っています。実際のコマンドは、あなたが外部依存関係がある場合のみ--jarsに合格する必要があり、すべてのexecutorにそのjarファイルを配布したい

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

です。

log4j.propertiesをINFO/WARNに設定していれば、簡単にそれをキャッチできました。

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

チップをありがとう。最終的に私はコマンドから ' - jars'を削除し、それは扱いになりました。 – Jonathan

+0

不思議ではない - 私はまだこれのすべてに慣れていないので、どのようにしてlog4j.propertiesをinfo/warnにすることができますか?私はlog4jがこれをプログラマチックに行うためのパッケージがあることを知っていますが、より簡単な方法はありますか? – Jonathan

0

- 問題を解決しました - 私はspark-submitコマンドを誤って使用していました。コマンドから '--jars'を削除することで、Scalaアプリケーション引数がspark-submitによって取得されました。

関連する問題