使用Java从另一个应用程序部署Apache Spark应用程序,这是最佳实践

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

但是,我很好奇,当我的Web服务器(用Java编写)收到用户请求时,什么被认为是启动相应Spark应用程序的“最佳实践”方式? Spark的文档似乎是使用“spark-submit”但我宁愿不将命令输出到终端来执行此操作。 我看到了一个替代方案Spark-JobServer,它提供了一个RESTful接口来完成这个任务,但我的Spark应用程序是用Java或R编写的,它似乎与Spark-JobServer不能很好地连接。

还有另一种最佳做法是从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”我等到我的驱动程序和应用程序状态正在运行

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

这样做的好处是Spark执行程序是长寿命的。 您无需一直启动/停止它们,从而节省时间。 您可以在操作之间缓存RDD。

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

我们正在使用Spark Job-server,它可以正常使用Java,只需构建一些Java代码并用Scala包装它就可以使用Spark Job-Server。