使用Spark - Spark JobServer实时基于请求的建议?

时间:2017-02-14 09:55:50

标签: apache-spark apache-spark-ml spark-jobserver

我们正在尝试找到一种加载Spark(2.x)ML训练模型的方法,以便根据请求(通过REST接口)我们可以查询它并获得预测,例如: http://predictor.com:8080/give/me/predictions?a=1,b=2,c=3

有一些开箱即用的库可以将模型加载到Spark中(假设它在使用MLWritable进行训练后存储在某处),然后将其用于预测,但是将它包装在作业中并按照请求运行它似乎有点过头了/由于SparkContext的初始化而调用。

但是,使用Spark的优势在于我们可以保存我们的Pipeline模型并执行相同的功能转换,而无需在SparkContext之外实现它。

经过一番挖掘后,我们发现spark-job-server可以帮助我们解决这个问题,因为我们可以让我们拥有一个热点"为作业服务器初始化的spark-context因此,我们可以通过使用spark-job-server的REST API在现有上下文中调用预测作业(并获取结果)来提供请求。

这是API-ify预测的最佳方法吗?由于特征空间,我们无法预先预测所有组合。

或者,我们考虑使用Spark Streaming并将预测持久化到消息队列。这允许我们不使用spark-job-server,但它不会简化整体流程。有没有人尝试过类似的方法?

2 个答案:

答案 0 :(得分:1)

另一种选择可能是cloudera的livy(http://livy.io/ | https://github.com/cloudera/livy#rest-api),它允许会话缓存,交互式查询,批处理作业等。我已经使用它并发现它非常有希望。

答案 1 :(得分:1)

<强>方案

  • 使用Spark Streaming进行预测 - 支持实时评分/预测,但需要基于流的流程(Push模型)。

    • 管道:score/predict on stream - &gt; store in a realtime store - &gt; serve data via REST or plug analytical toolkit for dashboards
    • 优点:实时评分,实时仪表板功能,如果与支持流写入的商店(例如德鲁伊)一起使用。
    • 缺点:评分所有事件,存储膨胀,保持仪表板轻量化所需的进一步数据存档策略
  • 基于REST的预测(PredictionIO,SJS) - 支持交互级别评分(请求 - 响应模型)。

    • 管道:deploy trained model in a SparkContext - &gt; Predict and return scores based on REST request
    • 优点:支持交互式评分,选择性事件评分,使WebApp的交互智能
    • 缺点:性能低于基于流的评分,更高的内存占用,Apache Spark所需的其他框架

答案

取决于在用例上。如果您具有基于流的数据流并需要对所有事件进行评分,请使用基于Spark Streaming的管道。现实生活中的例子是对欺诈检测的财务交易进行评分。如果您的需求是基于交互的,请使用基于REST的评分。例如,根据用户在网站/应用程序上的互动,向用户推荐类似的项目/产品。