2017-11-14 6 views
0

AWS EMR上でJava記述スパークアプリケーションを実行する際に問題があります。 ローカルでは、すべて正常に動作します。私がEMRに仕事を提出するとき、私は仕事が分を取るべきであるにもかかわらず、20秒でいつも "Completed"を得る。出力が生成されず、ログメッセージも印刷されません。AWS EMRでJava Sparkプログラムを実行しています

私はまだ天気がSparkアプリケーションまたはCUSTOM_JARタイプとして実行する必要があります混乱しています。

私の主な方法のルック:私はこれらを試してみた

public static void main(String[] args) throws Exception { 
    SparkSession spark = SparkSession 
      .builder() 
      .appName("RandomName") 
      .getOrCreate(); 

    //process stuff 
    String from_path = args[0]; 
    String to_path = args[1]; 
    Dataset<String> dataInput = spark.read().json(from_path).toJSON(); 
    JavaRDD<ResultingClass> map = dataInput.toJavaRDD().map(row -> convertData(row)); //provided function didn't include here 

    Dataset<Row> dataFrame = spark.createDataFrame(map, ResultingClass.class); 

    dataFrame 
      .repartition(1) 
      .write() 
      .mode(SaveMode.Append) 
      .partitionBy("year", "month", "day", "hour") 
      .parquet(to_path); 

    spark.stop(); 
} 

1)

aws emr add-steps --cluster-id j-XXXXXXXXX --steps \ 
Type=Spark,Name=MyApp,Args=[--deploy-mode,cluster,--master,yarn, \ 
--conf,spark.yarn.submit.waitAppCompletion=false, \ 
--class,com.my.class.with.main.Foo,s3://mybucket/script.jar, \ 
s3://partitioned-input-data/*/*/*/*/*.txt, \ 
s3://output-bucket/table-name], \ 
ActionOnFailure=CONTINUE --region us-west-2 --profile default 

エラーなしで15秒で完了し、出力結果やログI追加されました。 Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession

2)

aws emr add-steps --cluster-id j-XXXXXXXXX --steps \ 
Type=CUSTOM_JAR, \ 
Jar=s3://mybucket/script.jar, \ 
MainClass=com.my.class.with.main.Foo, \ 
Name=MyApp, \ 
Args=[--deploy-mode,cluster, \ 
--conf,spark.yarn.submit.waitAppCompletion=true, \ 
s3://partitioned-input-data/*/*/*/*/*.txt, \ 
s3://output-bucket/table-name], \ 
ActionOnFailure=CONTINUE \ 
--region us-west-2 --profile default 

代わりバケット

3)

aws emr add-steps --cluster-id j-XXXXXXXXX --steps \ 
Type=CUSTOM_JAR, \ 
Jar=s3://mybucket/script.jar, \ 
MainClass=com.my.class.with.main.Foo, \ 
Name=MyApp, \ 
Args=[s3://partitioned-input-data/*/*/*/*/*.txt, \ 
s3://output-bucket/table-name], \ 
ActionOnFailure=CONTINUE \ 
--region us-west-2 --profile default 

私はこれを取得する第二のように、第1のパラメータとして--deploy-modeclusterを見て、誤ったパラメータを読み込み

私は(私はローカルにする必要はありません)すべての依存関係

が含まれている場合、私は得る:Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration 私はアプリに"yarn"をハードコーディングする必要はありません。

AWSのドキュメントは、これを実行する適切な方法について非常に混乱しています。

更新:

は、サーバー上で直接コマンドを実行する作業を行います。だから問題は私がcliコマンドを定義する方法でなければならない。

spark-submit --class com.my.class.with.main.Foo \ 
    s3://mybucket/script.jar \ 
    "s3://partitioned-input-data/*/*/*/*/*.txt" \ 
    "s3://output-bucket/table-name" 
+0

EMRマシンへのSSH接続にアクセスできますか? –

+0

私は持っています。私は仕事のATMではない。 –

+0

私はあなたの 'Args'パラメータに' - master yarn'を使わないのが分かりません...この質問は混乱しています。 :/ – eliasah

答えて

1

1)が機能していました。

awsコンソールのステップ概要によると、タスクは15秒以内に完了しましたが、実際にはまだクラスタ上で実行されていました。仕事をするのに1時間かかりました。その結果を見ることができます。

なぜステップが結果を誤って報告しているのか分かりません。私はemr-5.9.0Ganglia 3.7.2, Spark 2.2.0, Zeppelin 0.7.2を使用しています。

+1

1)私は 'spark.yarn.submit.waitAppCompletion = false'を見ることができます - あなたは' true'に切り替えようとしましたか?または単にそれを削除する? –

+0

あなたは正しいです!それでおしまい。私は複数のジョブを提出するための例からそれを取ったが、私はそれがステップ実行の監視に影響するとは思わなかった... –

+0

素晴らしい!例2では実際に同じプロパティが「真」でした)、それがタイプミスかどうか疑問に思っていました –

関連する問題