2017-02-17 66 views
1

我有一个Java Spark作业,它可以在EC2上以独立模式手动部署Spark 1.6.0。EMR上的Spark YARN - JavaSparkContext - IllegalStateException:库目录不存在

我正在使用YARN将此作业提交给主站上的EMR 5.3.0群集,但它失败。

火花提交线是,

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 

的“纱线的客户端”是第一个参数x.jar应用和被馈送到SparkContext作为setMaster,

conf.setMaster(args[0]); 

当我提交它,它开始运行良好,直到我从SparkConf初始化JavaSparkContext,

JavaSparkContext sc = new JavaSparkContext(conf); 

... an d然后Spark崩溃。

纱线日志,我可以看到下面,

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. 
... 

注意到WARN spark.yarn.jars标志缺失的,我在

/usr/lib/spark/jars/ 

发现火花纱JAR文件。并根据Cloudera的指南将其上传到HDFS,以便如何在Spark上运行YARN应用程序并尝试添加该配置文件,因此这成为我的火花提交线,

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 

我,什么是图书馆的错误是造成,以及如何从这里开始进行真正的疑惑。

回答

1

您已指定“--deploy-mode集群”,但尚未从代码调用conf.setMaster(“yarn-client”)。使用“yarn-client”的主URL意味着“使用YARN作为主服务器,并使用客户端模式(不是集群模式)”,所以我不会感到惊讶,因为一方面你告诉Spark它使用集群模式,另一个则告诉它使用客户端模式。

顺便说一句,使用像“yarn-client”或“yarn-cluster”这样的主URL实际上已经被弃用了,因为“-client”或“-cluster”部分并不是Master的组成部分,而是部署模式。也就是说,“ - 主纱纱线 - 客户”实际上更像是“主纱 - 部署模式客户”的捷径或别名,同样,“ - 主纱纱线”意味着“ - 主纱 - “部署模式集群”。

我的建议是不要在你的代码中调用conf.setMaster(),因为master已经在/etc/spark/conf/spark-defaults.conf中自动设置为“yarn”。出于这个原因,你也不需要通过“ - 主纱”来进行火花提交。

最后,听起来您需要决定是否真的想要使用客户端部署模式或集群部署模式。在客户端部署模式下,驱动程序在主实例上运行,并且在集群部署模式下,驱动程序在其中一个核心/任务实例的YARN容器中运行。有关更多信息,请参阅https://spark.apache.org/docs/latest/running-on-yarn.html

如果你想使用客户端部署模式,你不需要传递任何额外的东西,因为它已经是默认的了。如果要使用群集部署模式,请传递“--deploy-mode群集”。

相关问题