在AWS EMR上运行Java Spark程序

在AWS EMR上运行Java Spark程序,java,apache-spark,aws-cli,amazon-emr,Java,Apache Spark,Aws Cli,Amazon Emr,我在AWS EMR上运行Java编写的spark应用程序时遇到问题。 在当地,一切正常。当我向EMR提交作业时,我总是在20秒内“完成”,即使作业需要几分钟。没有生成输出,也没有打印日志消息 我仍然对它应该作为Spark应用程序还是CUSTOM\u JAR类型运行感到困惑 我的主要方法如下: public static void main(String[] args) throws Exception { SparkSession spark = SparkSession

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

我仍然对它应该作为
Spark
应用程序还是
CUSTOM\u 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();
}
在15秒内完成,没有错误、输出结果或我添加的日志

2)

错误读取参数,将
--deploy mode
视为第一个参数,将
集群
视为第二个参数,而不是存储桶

(三)

我明白了:
是由以下原因引起的:java.lang.ClassNotFoundException:org.apache.spark.sql.SparkSession

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

我得到:
线程“main”org.apache.spark.sparkeexception中的异常:必须在配置中设置主URL
我不想将
“纱线”
硬编码到应用程序中

我发现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"
那辆车正在运转

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


我不知道为什么这一步骤会歪曲结果。我正在使用
emr-5.9.0
Ganglia 3.7.2、Spark 2.2.0、齐柏林飞艇0.7.2

您有权访问到emr机器的SSH连接吗?我有。但我不在ATM机上工作。我不确定我是否理解为什么不在
参数中使用
--master warn
。。。很抱歉,这个问题让人困惑!:/您在s3中找不到数据?@eliasah我没有放“-master”,因为我的参数被读取为“main”方法参数(参见第2点),而不是“spark submit”参数。在1)中,我可以看到
spark.warn.submit.waitAppCompletion=false
-您是否尝试将其切换为
true
?还是干脆把它拿走?你说得对!就这样。我举了一个提交多个作业的例子,但我认为这不会影响步骤执行监控…太棒了!实际上,在示例2中,相同的属性是
true
),所以我想知道它解决了这个问题是否是一个打字错误
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
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
spark-submit --class com.my.class.with.main.Foo \
    s3://mybucket/script.jar \
    "s3://partitioned-input-data/*/*/*/*/*.txt" \
    "s3://output-bucket/table-name"