Apache Spark 和机器学习 - 在生产中使用

问题描述 投票:0回答:2

我在弄清楚如何在现实生活生产环境中使用 Spark 的机器学习功能时遇到了一些困难。

我想做的是:

  • 使用笔记本开发新的机器学习模型
  • 使用 REST API 提供学习模型(例如 POST - /api/v1/mymodel/predict)

假设机器学习训练过程由笔记本处理,一旦满足模型要求,它就会保存到 hdfs 文件中,稍后由 Spark 应用程序加载

我知道我可以编写一个长时间运行的 Spark 应用程序来公开 API 并在我的 Spark 集群上运行它,但我不认为这实际上是一种可扩展的方法,因为即使数据转换和机器学习函数将在在workers节点上,与http/api相关的代码仍然会在一个节点上运行,即调用spark-submit的节点(如果我错了,请纠正我)。

另一种方法是使用相同的长时间运行的应用程序,但在本地独立集群中。我可以根据需要多次部署相同的应用程序,并在其前面放置一个负载均衡器。使用这种方法,http/api 部分处理得很好,但 Spark 部分根本不使用集群功能(这可能不是问题,因为它应该只对每个请求执行一次预测)

还有第三种方法,使用 SparkLauncher,它将 Spark 作业包装在一个单独的 jar 中,但我不太喜欢飞行 jar,并且很难检索预测结果(可能是队列,或 hdfs)

所以基本上问题是:通过 REST API 使用 Spark 的机器学习模型的最佳方法是什么?

谢谢你

apache-spark apache-spark-mllib
2个回答
1
投票

您有三个选择

  1. 根据客户端请求,通过 Spark api spark-jobserver 触发批量 ML 作业
  2. 通过调度程序airflow触发批量ML作业,将输出写入
    DB
    ,通过rest向客户端公开
    DB
  3. 保持
    structured-streaming
    /
    recursive function
    扫描输入数据源,连续更新/追加
    DB
    ,通过其余方式向客户端公开
    DB

如果您有

single prediction  per request
,并且您的数据输入不断更新,我建议使用选项3,该选项会始终转换
near-real-time
中的数据,并且客户端可以不断访问
output
,您可以通知
client 
当通过 Rest 或
sns
发送 notification 完成新数据时,您可以保持相当小的
spark
集群来处理数据摄取,并根据请求/数据量缩放
rest service
DB
(负载均衡器) )

如果您预计数据源定期更新的罕见请求(例如每天一次),则选项

1
2
将适合,因为您可以启动更大的集群并在完成后将其关闭。

希望有帮助。


0
投票

问题是您不想让 Spark 集群保持运行并在其中部署 REST API 来进行预测,因为它很慢。

因此,为了实现低延迟的实时预测,这里有一些解决方案。

我们正在做的是训练模型、导出模型并使用 Spark 外部的模型进行预测。

  1. 如果您使用的 ML 算法受 PMML 标准支持,您可以将模型导出为 PMML 文件。 Spark ML 模型可以使用 jpmml 库导出为 JPMML 文件。然后您可以创建 REST API 并使用 JPMML Evaluator 使用 Spark ML 模型进行预测。

  2. MLEAP MLeap 是机器学习管道的通用序列化格式和执行引擎。它支持 Spark、Scikit-learn 和 Tensorflow 来训练管道并将其导出到 MLeap Bundle。序列化管道(捆绑包)可以反序列化回 Spark 以进行批处理模式评分,或反序列化至 MLeap 运行时以支持实时 API 服务。它支持多个平台,尽管我刚刚将它用于 Spark ML 模型,而且效果非常好。

© www.soinside.com 2019 - 2024. All rights reserved.