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

时间:2017-04-21 09:38:30

标签: apache-spark apache-spark-mllib

我在如何在现实生产环境中使用spark的机器学习功能方面遇到了一些困难。

我想做的是以下内容:

  • 使用笔记本开发新的ml模型
  • 使用REST api服务学习模型(类似POST - / api / v1 / mymodel / predict)

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

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

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

第三种方法是使用SparkLauncher,它将火花作业包装在一个单独的罐子里,但我真的不喜欢飞行罐子,而且很难找到预测的结果(队列可能,或者hdfs) )

基本上问题是:通过rest api消耗spark的ml模型的最佳方法是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

你有三个选择

  1. 根据客户要求,通过spark api spark-jobserver触发批量ML作业
  2. 通过调度程序airflow触发批量ML作业,将输出写入DB,通过休息向客户端公开DB
  3. 保持structured-streaming / recursive function开启以扫描输入数据源,持续更新/追加DB,通过休息将DB公开给客户
  4. 如果您有single prediction per request,并且您的数据输入不断更新,我建议选项3,它将始终转换near-real-time中的数据,并且客户端可以持续访问{{1您可以通过休息或sns发送output来通知client新数据,您可以保留非常小的notification群集来处理数据提取,并且根据请求/数据量(负载均衡器)缩放sparkrest service

    如果您预计会定期更新数据源的罕见请求,请每天说一次,选项DB1将是合适的,因为您可以启动更大的群集并在完成后将其关闭。

    希望它有所帮助。

答案 1 :(得分:0)

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

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

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

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

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