我如何将Apache Spark与Play Framework集成以实时显示预测?

时间:2015-05-10 03:33:12

标签: scala apache-spark playframework-2.0 spark-streaming apache-spark-mllib

我正在用Apache Spark进行一些测试,这是我在大学的最后一个项目。我有一个数据集,用于生成决策树,并对新数据进行一些预测。

将来,我想将这个项目用于生产,在那里我将生成一个决策树(批处理),并通过Web界面或移动应用程序接收新数据,从而预测该条目的类,并立即将结果通知给用户。并且还会在一段时间后存储这些新条目,生成新的决策树(批处理),并连续重复此过程。

尽管Apache Spark的目的是执行批处理,但是有一个流API可以让您接收实时数据,而在我的应用程序中,这些数据只能由批量处理中构建的模型使用。决策树,以及预测如何快速,它允许用户快速得到答案。

我的问题是将Apache Spark与Web应用程序集成的最佳方法是什么(计划使用Play Framework scala版本)?

4 个答案:

答案 0 :(得分:4)

您将遇到Spark的一个问题是启动并构建SparkContext需要一些时间。如果你想通过网络电话进行Spark查询,那么每次启动spark-submit都是不切实际的。相反,您需要将驱动程序应用程序(这些术语稍后会更有意义)转换为RPC服务器。

在我的应用程序中,我嵌入了一个Web服务器(http4s),因此我可以在JavaScript中执行XmlHttpRequests直接查询我的应用程序,这将返回JSON对象。

答案 1 :(得分:3)

Spark是一个快速的大规模数据处理平台。这里的关键是大规模数据。在大多数情况下,处理该数据的时间不足以满足普通Web应用程序用户的期望。最好的做法是离线执行处理并将Spark处理的结果写入数据库。然后,您的Web应用程序可以通过查询该数据库来有效地检索这些结果。

话虽这么说,spark job server服务器提供了一个REST api来提交Spark作业。

答案 2 :(得分:1)

Spark(< v1.6)使用下面的Akka。 Play也是如此。您应该能够将Spark动作编写为与Play系统中的接收actor进行通信的actor(您也可以编写)。

你可以让Akka担心de / serialization,只要两个系统在类路径上都有相同的类定义,它就会起作用。

如果您想要更进一步,可以编写Akka Streams代码,将数据流发送到您的Play应用程序。

答案 3 :(得分:1)

检查此链接,您需要在本地模式下运行spark(在您的Web服务器上),并且离线ML模型应该保存在S3中,这样您就可以从Web应用程序访问该模型并缓存模型jut一次和您将持续以本地模式运行火花上下文。

https://commitlogs.com/2017/02/18/serve-spark-ml-model-using-play-framework-and-s3/

另一种方法是使用Livy(Spark API上的REST API调用)

https://index.scala-lang.org/luqmansahaf/play-livy-module/play-livy/1.0?target=_2.11

s3选项是前进的方式我想,如果批量模型发生变化,您需要刷新网站缓存(停机时间)几分钟。

查看这些链接

https://github.com/openforce/spark-mllib-scala-play/blob/master/app/modules/SparkUtil.scala

https://github.com/openforce/spark-mllib-scala-play

由于 斯