我想通过 REST API 运行 Spark 作业,并且我想使用 Scala for Spark。我有一个带有 Spring 框架的混合 Java 和 Scala 项目。我可以调用 Scala 方法来创建 SparkContext 并通过 REST API 执行一些工作。设置主 Remote 时出现问题,而不是本地设置时出现问题。
val conf = new SparkConf().setAppName("App").setMaster("local")
val sc = new SparkContext(conf)
很好,但是
val conf = new SparkConf().setAppName("App").setMaster(" spark://10.122.221.164:7077")
val sc = new SparkContext(conf)
导致java.lang.ClassNotFoundException
。
到目前为止我能找到的解决方案是创建一个 fat-jar 并执行 conf.setJars(...)
,或者通过 ProcessBuilder
等使用 spark-submit
脚本。
在我当前的设置中,我只有一个 Spring 项目,其中包含 Spark Scala 代码,该项目被打包到 war
文件中以在 Tomcat 等下运行,因此我没有 fat-jar。我不想有一个 Spring 项目和几个单独的 Scala 应用程序,每个应用程序都打包为一个 fat-jar。我怎样才能想出一个简单但合理的架构?
最佳答案
哪个类给出了 ClassNotFoundException ?由此应该清楚,您的 Spark 应用程序依赖于该类,并且需要与 Spark 应用程序一起打包。
它在本地工作,因为它拥有所有可用的 jar,但对于远程,需要将依赖项 jar 传输到驱动程序/执行程序。
如果运行 Spark-submit,您可以看到使用 --jars 指定的依赖项 jar 已传输。
您可以创建 uber jar 或使用 SparkConf.setJars 指定依赖项 jar。
Maven Shade 插件可用于创建 uber jar,并仅指定需要捆绑的 jar。
另外你为什么不使用 SparkLauncher启动 Spark 应用程序。
关于java - 从 Spring RESTful 服务运行 Spark 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38902544/