首页 文章

EMR上的Spark YARN - JavaSparkContext - IllegalStateException:库目录不存在

提问于
浏览
1

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

我是火花 - 使用YARN将此作业提交给主服务器上的EMR 5.3.0集群,但它失败了 .

Spark-submit系列是,

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

“yarn-client”是x.jar应用程序的第一个参数,并作为setMaster提供给SparkContext,

conf.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行,

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 回答

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

相关问题