在AWS EMR上运行Java Spark程序

时间:2017-11-14 04:54:53

标签: java apache-spark aws-cli amazon-emr

我在AWS EMR上运行Java编写的spark应用程序时遇到问题。 在当地,一切都运行良好。当我向EMR提交工作时,即使工作需要几分钟,我仍然会在20秒内完成“完成”。没有产生输出,也没有打印日志消息。

我仍然感到困惑,因为它应该以{{1​​}}应用程序或Spark类型运行。

看看我的主要方法:

CUSTOM_JAR

我试过这些:

1)

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();
}

在15秒内完成,没有错误,输出结果或我添加的日志。

2)

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

错误地读取参数,将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 视为第一个参数,将--deploy-mode视为第二参数而不是存储桶

3)

cluster

我明白了: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

当我包含所有依赖项(我不需要在本地)

我得到:Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession 我不想将Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration硬编码到应用中。

我发现AWS文档非常混乱,关于运行它的正确方法是什么。

更新

直接在服务器上运行命令确实有效。所以问题必须在于我定义cli命令的方式。

"yarn"

1 个答案:

答案 0 :(得分:1)

1)正在运作。

aws控制台上的步骤概述表示任务在15秒内完成,但实际上它仍在群集上运行。他花了一个小时完成工作,我可以看到结果。

我不知道为什么这一步误报了结果。我将emr-5.9.0Ganglia 3.7.2, Spark 2.2.0, Zeppelin 0.7.2一起使用。