使用Yarn客户端或任何其他方式从Spring Web应用程序运行Apache spark作业

Kri*_*sty 7 spring-mvc hadoop-yarn apache-spark

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

我有一种情况,我使用Spring boot在Tomcat服务器上运行Web应用程序.我的Web应用程序接收基于它的REST Web服务请求它需要在Yarn集群中触发spark计算作业.由于我的工作可能需要更长时间才能运行并且可以从HDFS访问数据,因此我想在纱线群集模式下运行spark作业,我不想在我的Web层中保持火花上下文的活动.另一个原因是我的应用程序是多租户,因此每个租户都可以运行它自己的工作,因此在纱线集群模式下,每个租户的工作可以启动它自己的驱动程序并运行在它自己的火花集群中.在Web应用程序JVM中,我假设我无法在一个JVM中运行多个spark上下文.

我想在我的Web应用程序中从java程序触发yarn-cluster模式的spark作业.实现这一目标的最佳方法是什么.我正在探索各种选择,并寻找关于哪一个最好的指导

1)我可以使用spark-submit命令行shell来提交我的工作.但要从我的Web应用程序触发它,我需要使用Java ProcessBuilder api或基于java ProcessBuilder构建的一些包.这有两个问题.首先,它听起来不像是一种干净的方式.我应该采用编程方式触发我的火花应用程序.第二个问题是我将失去监视提交的应用程序并获得它的状态的能力.只有粗略的做法是读取spark-submit shell的输出流,这听起来不是好方法.

2)我尝试使用Yarn客户端从spring应用程序提交作业.以下是我用于使用Yarn客户端提交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();
Run Code Online (Sandbox Code Playgroud)

但是当我运行上面的代码时,它只尝试在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)
Run Code Online (Sandbox Code Playgroud)

所以我不认为它可以连接到远程机器.

请建议,使用最新版本的spark,这是最好的方法.后来我计划在亚马逊EMR中部署整个应用程序.所以方法也应该在那里工作.

提前致谢

vic*_*888 0

Spark JobServer 可能会有所帮助:https://github.com/spark-jobserver/spark-jobserver,该项目接收 RESTful Web 请求并启动 Spark 作业。结果以 json 响应形式返回。