Spring mvc 使用Thread客户端或任何其他方式从SpringWeb应用程序运行ApacheSpark作业

Spring mvc 使用Thread客户端或任何其他方式从SpringWeb应用程序运行ApacheSpark作业,spring-mvc,apache-spark,yarn,Spring Mvc,Apache Spark,Yarn,我最近开始使用spark,我想从SpringWeb应用程序运行spark作业 我的web应用程序在Tomcat服务器上使用Spring boot运行web应用程序。我的web应用程序收到一个REST web服务请求,因为它需要触发集群中的spark计算作业。因为我的作业可能需要更长的时间才能运行,并且可以从HDFS访问数据,所以我想在纱线集群模式下运行spark作业,并且我不想让spark上下文在我的web层中保持活动状态。另一个原因是我的应用程序是多租户的,所以每个租户都可以运行自己的作业,所

我最近开始使用spark,我想从SpringWeb应用程序运行spark作业

我的web应用程序在Tomcat服务器上使用Spring boot运行web应用程序。我的web应用程序收到一个REST web服务请求,因为它需要触发集群中的spark计算作业。因为我的作业可能需要更长的时间才能运行,并且可以从HDFS访问数据,所以我想在纱线集群模式下运行spark作业,并且我不想让spark上下文在我的web层中保持活动状态。另一个原因是我的应用程序是多租户的,所以每个租户都可以运行自己的作业,所以在纱线集群模式下,每个租户的作业都可以启动自己的驱动程序并在自己的spark集群中运行。在web应用程序JVM中,我假设不能在一个JVM中运行多个spark上下文

我想在my web应用程序中的java程序中以纱线集群模式触发spark作业。实现这一目标的最佳方式是什么。我正在探索各种选择,并期待您的指导哪一个是最好的

1) 我可以使用spark submit命令行shell提交作业。但要从我的web应用程序触发它,我需要使用Java ProcessBuilder api或基于Java ProcessBuilder构建的某些包。这有两个问题。首先,这听起来不是一个干净的方法。我应该有一个程序方式来触发我的spark应用程序。第二个问题是我将失去监控提交的应用程序并获取其状态的能力。。唯一粗略的方法是读取spark submit shell的输出流,这听起来也不是一个好方法

2) 我尝试使用Thread客户端提交spring应用程序中的作业。以下是我使用Thread Client提交spark作业时使用的代码:

Configuration config = new Configuration();
System.setProperty("SPARK_YARN_MODE", "true");        
SparkConf conf = new SparkConf();
ClientArguments cArgs = new ClientArguments(sparkArgs, conf);
Client client = new Client(cArgs, config, conf);
client.run();
但是当我运行上面的代码时,它只会尝试在localhost上连接。我得到这个错误:

5/08/05 14:06:10 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) 15/08/05 14:06:12 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
所以我认为它不能连接到远程机器

请建议,使用最新版本的spark进行此操作的最佳方法是什么。后来我计划在AmazonEMR中部署整个应用程序。所以,这种方法也应该在那个里起作用


提前感谢

Spark JobServer可能会有所帮助:,此项目接收RESTful web请求并启动Spark作业。结果作为json响应返回

我在尝试运行连接到YARN cluster的Spark应用程序时也遇到了类似的问题-没有群集配置,它试图连接到本地计算机,就像连接到群集的主节点一样,这显然失败了

当我将core-site.xml和warn-site.xml放入类路径(典型sbt或Maven项目结构中的src/main/resources)中时,它对我起到了作用——应用程序正确连接到集群


使用spark submit时,这些文件的位置通常由HADOOP_CONF_DIR环境变量指定,但对于独立应用程序,它不起作用。

您是否解决了问题?抱歉,我不再处理此问题。所以我还没有试着看哪种解决方案有效。这里不鼓励只使用链接的答案,因为链接将来可能会失效。我建议你用你引用的资料编辑你的答案。