我已经可以从我的Eclipse IDE提交local
spark作业(用Scala编写)。但是,我想修改我的 Spark 上下文(在我的应用程序内部),以便当我"运行"应用程序(在 Eclipse 内部)时,作业将使用 Yarn 作为资源管理器发送到我的远程集群。
使用 spark-submit
,我可以成功地将作业提交到集群,如下所示: spark-submit --class <main class> --master yarn-cluster <jar>
我想在 IDE 中实现相同的结果。我的 sbt 配置(应用程序根目录)如下所示:
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.1"
libraryDependencies += "org.apache.spark" %% "spark-yarn" % "1.5.1" % "provided"
在我的应用程序内:
val conf = new SparkConf().setAppName("xxx").setMaster("yarn-cluster")
但是,我收到以下错误:
Detected yarn-cluster mode, but isn't running on a cluster. Deployment to YARN is not supported directly by SparkContext. Please use spark-submit.
1) 根据我进行的研究,当从 Eclipse 远程提交时,您不能将yarn-cluster
用作代码中的主控,而应使用 spark-client
。
new SparkConf().setAppName("test-app").setMaster("yarn-client");
检查此Cloudera资源,他们正在粉碎一些关于阻止您在集群模式下运行"交互式"应用程序的约束
。2) 您可能会遇到资源未正确复制到群集的问题。在我的情况下解决问题的是将以下文件包含在项目的类路径中(没有任何幻想,现在我只是将它们复制到项目的 src/java 目录中):
- 核心站点.xml
- HDFS-site.xml
- 纱线网站.xml
确保 特别是核心站点.xml 在类路径中,因为我读过的教程都没有提到它。而且你会遇到麻烦,因为如果没有fs.defaultFS
配置,Spark 会认为目标目录与源目录(您的本地文件系统)相同,而不是远程 HDFS 文件系统。