我有一个Java Spark作业,可以在EC2上以独立模式手动部署Spark 1.6.0。
我正在使用YARN将此作业提交到主服务器上的EMR 5.3.0群集,但它失败了。
Spark-submit line是,
spark-submit --class <startclass> --master yarn --queue default --deploy-mode cluster --conf spark.eventLog.enabled=true --conf spark.eventLog.dir=hdfs://`hostname -f`:8020/tmp/ourSparkLogs --driver-memory 4G --executor-memory 4G --executor-cores 2 hdfs://`hostname -f`:8020/data/x.jar yarn-client
&#34;纱线客户&#34;是x.jar应用程序的第一个参数,并作为setMaster,
提供给SparkContextconf.setMaster(args[0]);
当我提交它时,它开始运行正常,直到我从SparkConf初始化JavaSparkContext,
JavaSparkContext sc = new JavaSparkContext(conf);
......然后Spark崩溃了。
在YARN日志中,我可以看到以下内容,
yarn logs -applicationId application_1487325147456_0051
...
17/02/17 16:27:13 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
17/02/17 16:27:13 INFO Client: Deleted staging directory hdfs://ip-172-31-8-237.eu-west-1.compute.internal:8020/user/ec2-user/.sparkStaging/application_1487325147456_0052
17/02/17 16:27:13 ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalStateException: Library directory '/mnt/yarn/usercache/ec2-user/appcache/application_1487325147456_0051/container_1487325147456_0051_01_000001/assembly/target/scala-2.11/jars' does not exist; make sure Spark is built.
...
注意到spark.yarn.jars标志缺失的WARN,我在
中找到了一个火花纱JAR文件/usr/lib/spark/jars/
...并根据Cloudera的指南将其上传到HDFS,了解如何在Spark上运行YARN应用程序,并尝试添加该conf,这样就成了我的火花提交行,
spark-submit --class <startclass> --master yarn --queue default --deploy-mode cluster --conf spark.eventLog.enabled=true --conf spark.eventLog.dir=hdfs://`hostname -f`:8020/tmp/ourSparkLogs --conf spark.yarn.jars=hdfs://`hostname -f`:8020/sparkyarnlibs/spark-yarn_2.11-2.1.0.jar --driver-memory 4G --executor-memory 4G --executor-cores 2 hdfs://`hostname -f`:8020/data/x.jar yarn-client
但那不起作用并给出了这个:
Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster
我真的很困惑,因为库错误是由什么引起的,以及如何从这里开始。
答案 0 :(得分:1)
您已指定“--deploy-mode cluster”但尚未从代码中调用conf.setMaster(“yarn-client”)。使用“yarn-client”的主URL意味着“使用YARN作为主服务器,并使用客户端模式(不是集群模式)”,所以如果这在某种程度上混淆了Spark,我不会感到惊讶,因为一方面你说的是它使用集群模式,另一方面你告诉它使用客户端模式。
顺便说一句,使用像“yarn-client”或“yarn-cluster”这样的主URL实际上已被弃用,因为“-client”或“-cluster”部分实际上不是Master的一部分,而是部署模式。也就是说,“ - master yarn-client”实际上更像是“--master yarn --deploy-mode client”的快捷方式/别名,同样“--master yarn-cluster”只是意味着“--master yarn” --deploy-mode cluster“。
我的建议是不要从你的代码中调用conf.setMaster(),因为master已经在/etc/spark/conf/spark-defaults.conf中自动设置为“yarn”。因此,您也不需要将“--master yarn”传递给spark-submit。
最后,听起来您需要决定是否确实要使用客户端部署模式或群集部署模式。使用客户端部署模式,驱动程序在主实例上运行,并且在集群部署模式下,驱动程序在其中一个核心/任务实例上的YARN容器中运行。有关详细信息,请参阅https://spark.apache.org/docs/latest/running-on-yarn.html。
如果要使用客户端部署模式,则不需要传递任何额外的内容,因为它已经是默认设置。如果要使用集群部署模式,请传递“--deploy-mode cluster”。