2016-06-30 3 views
0

私はsparkでいくつかのロジックを実装しました。このロジックの実行は、Javaコードに渡されるパラメータによって異なります。私の主な方法では、私はスイッチケースを持っています。正しいパラメータを渡すと、すべて正常に動作します。スイッチのケースにないランダムなパラメータを渡すと、Spark Exceptionが発生します。失敗したステータスで終了しました。メインメソッドが何もしていないときにクラスターモードのSpark Submitが失敗する

クライアントモードで同じコードを実行すると、間違ったパラメータで例外がスローされることはありませんが、これは正しい動作だと思います。

パラメータが正しい場合にのみコンテキストを作成しています。したがって、基本的にクラスターモードで空のmainメソッドを与えると、例外が発生します。

誰かがこの仕組みを私に説明できますか?どうすればこの例外を回避できますか。

public class MyClass{ 
private JavaSparkContext context = null; 
private HiveContext hiveContext = null; 
public static void main(String[] args) { 


    MyClass obj = new MyClass(); 
    obj.startProcessing(args);  
} 

start処理方法にはスイッチケースが含まれています。

おかげ

スタックトレース:

Exception in thread "main" org.apache.spark.SparkException: Application application_1466638963111_3824 finished with failed status 
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:1036) 
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1083) 
    at org.apache.spark.deploy.yarn.Client.main(Client.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    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) 

答えて

3

あなたが「クライアント」モードでアプリケーションを実行し、あなたが直接(私はビン/を火花提出だと思うしている)アプリケーションを実行するために使用するスクリプトMainクラスを起動します。 MainクラスはSparkコンテキストを作成しなければならず、MesosやYarnのようなSparkコンテキストを使用する場合、SparkコンテキストはSparkクラスタまたはクラスタマネージャに接続します。この場合、Sparkコンテキストを作成しないとうまくいきます。メインクラスは何もせずに終了します。

クラスタモードでは、Sparkはメインクラスを直接実行せず、クライアントを作成してサブミット要求を作成し、この要求をクラスタに送信します。このサブミットリクエストは、メインクラス名をパラメータとして持ちます。クラスタがこのリクエストを受け取ると、メインクラスが起動します。この時点でクライアントは、Sparkコンテキストが正常に作成され、クライアントが作成されたコンテキストに関する情報を取得しなければならないというクラスタからの応答を待っています。

コンテキストを作成しないと、クライアントはそれに接続できません.cliendはコンテキストが正常に作成され、例外をスローしたという応答を受けません。

それは直接自分のメインクラスを起動し、クラスタモードでは、異なるメインを起動また、あなたの起動スクリプトに

--verbose

フラグを追加することができますし、クライアントモードと表示されますクラス。

+0

ありがとうございます。私は今その理由を理解しています。そのような詳細を説明してくれてありがとう。 – user1544460

関連する問題