我在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"
答案 0 :(得分:1)
1)正在运作。
aws控制台上的步骤概述表示任务在15秒内完成,但实际上它仍在群集上运行。他花了一个小时完成工作,我可以看到结果。
我不知道为什么这一步误报了结果。我将emr-5.9.0
与Ganglia 3.7.2, Spark 2.2.0, Zeppelin 0.7.2
一起使用。