2017-11-14 2 views
0

AWS EMR에서 Java 작성 스파크 애플리케이션을 실행하는 데 문제가 있습니다. 로컬에서는 모든 것이 정상적으로 실행됩니다. EMR에 일자리를 제출할 때, 일자리가 수 분이 걸릴지라도 항상 20 초 동안 "완료"됩니다. 출력이 생성되지 않고 로그 메시지가 인쇄되지 않습니다.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) 오류, 출력 결과 나 로그 I없이

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 초 추가되었습니다. 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 

가 I이 얻을의 제 첫째 파라미터로서 --deploy-modecluster을보고, 잘못 파라미터를 읽어 ,451,515,

나는 (I 로컬 할 필요가 없습니다) 모든 종속성

내가 얻을 포함 할 때 : 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 초 내에 완료되었지만 실제로는 클러스터에서 계속 실행 중입니다. 일을하는 데 한 시간이 걸렸고 그 결과를 볼 수 있습니다.

왜 단계가 결과를 잘못보고하고 있는지 알 수 없습니다. 나는 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에서 실제로 같은 속성이 '사실'이었습니다. 그래서 오타가 아닌지 궁금합니다 - 문제가 해결되었습니다. –

관련 문제