Apache spark EMR上的Spark-SparkContext-IllegalStateException:库目录不存在

Apache spark EMR上的Spark-SparkContext-IllegalStateException:库目录不存在,apache-spark,yarn,emr,Apache Spark,Yarn,Emr,我有一个Java Spark作业,它在EC2上以独立模式在手动部署的Spark 1.6.0上工作 我正在spark使用Thread将此作业提交给主机上的EMR 5.3.0群集,但失败了 火花线是 spark-submit --class <startclass> --master yarn --queue default --deploy-mode cluster --conf spark.eventLog.enabled=true --conf spark.eventLog.dir

我有一个Java Spark作业,它在EC2上以独立模式在手动部署的Spark 1.6.0上工作

我正在spark使用Thread将此作业提交给主机上的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
当我提交它时,它开始运行良好,直到我从SparkConf初始化JavaSparkContext

JavaSparkContext sc = new JavaSparkContext(conf);
。。。然后火花崩溃了

在纱线日志中,我可以看到以下内容:

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.WARN.jars标志丢失,我在中找到了一个spark-WARN-JAR文件

/usr/lib/spark/jars/
。。。并将其上传到HDFS per Cloudera关于如何在Spark上运行Thread应用程序的指南中,并尝试添加该配置,因此这成为我的Spark提交行

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
我真的很困惑这个库错误是由什么引起的,以及如何从这里继续下去。

您已经指定了“-deploy mode cluster”,但是正在从代码中调用conf.setMaster(“纱线客户端”)。使用“纱线客户端”的主URL意味着“使用纱线作为主URL,并使用客户端模式(而不是群集模式)”,因此,如果这让Spark感到困惑,我也不会感到惊讶,因为一方面你告诉它使用群集模式,另一方面你告诉它使用客户端模式

顺便说一句,使用像“纱线客户端”或“纱线集群”这样的主URL实际上是不推荐的,因为“-client”或“-cluster”部分实际上不是主URL的一部分,而是部署模式。也就是说,“--master warn client”实际上更像是--master warn--deploy mode client”的快捷方式/别名,同样--master warn cluster“只是指--master warn--deploy mode cluster”

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

最后,听起来您需要决定是真正使用客户机部署模式还是集群部署模式。在客户端部署模式下,驱动程序在主实例上运行;在集群部署模式下,驱动程序在一个核心/任务实例的容器中运行。有关更多信息,请参阅

如果要使用客户机部署模式,则不需要传递任何额外的内容,因为它已经是默认模式。如果要使用集群部署模式,请传递“--deploymodecluster”

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