从Java中的另一个应用程序部署Apache Spark应用程序,最佳实践



我是Spark的新用户。我有一个web服务,允许用户通过从数据库中读取并将结果推回到数据库来请求服务器执行复杂的数据分析。我已经将这些分析转移到各种Spark应用程序中。目前我使用spark-submit来部署这些应用程序。

然而,我很好奇,当我的web服务器(用Java编写)收到用户请求时,启动相应Spark应用程序的"最佳实践"方式是什么?Spark的文档似乎使用"Spark-submit",但我宁愿不将命令发送到终端来执行此操作。我看到了一个替代方案,Spark JobServer,它提供了一个RESTful接口来实现这一点,但我的Spark应用程序是用Java或R编写的,这似乎与Spark Job服务器的接口不好。

是否还有其他最佳实践可以从web服务器(Java)启动spark应用程序,并等待状态结果,无论作业成功还是失败?

任何关于其他人正在做什么来实现这一目标的想法都将非常有帮助!谢谢

我也有类似的需求。以下是我所做的:

  1. 为了提交应用程序,我使用隐藏的Spark REST提交API:http://arturmkrtchyan.com/apache-spark-hidden-rest-api

  2. 使用这个相同的API,你可以查询驱动程序的状态,或者你可以稍后杀死你的工作

  3. 还有另一个隐藏的UI Json API:http://[master-node]:[master-UI-port]/Json/,它以Json格式公开了主UI上可用的所有信息。

使用"提交API"提交驱动程序,使用"主UI API"等待驱动程序和应用程序状态为RUNNING

web服务器也可以充当Spark驱动程序。因此,它将有一个SparkContext实例,并包含使用RDD的代码。

这样做的优点是Spark执行器的寿命很长。您不必一直启动/停止它们,从而节省了时间。您可以在操作之间缓存RDD。

缺点是,由于执行器一直在运行,它们占用了集群中其他进程可能使用的内存。另一个问题是,您不能拥有多个web服务器实例,因为同一Spark应用程序不能有多个SparkContext

我们使用的是Spark Job服务器,它可以很好地与Java配合使用。我们只需构建Java代码的jar,并将其与Scala封装即可与Spark Job server配合使用。

最新更新