我在如何在现实生产环境中使用spark的机器学习功能方面遇到了一些困难。
我想做的是以下内容:
假设ml训练过程由笔记本处理,一旦满足模型要求,它就会保存到hdfs文件中,稍后由火花应用程序加载
我知道我可以编写一个长期运行的spark应用程序来公开api并在我的spark集群上运行它,但我认为这不是一个可扩展的方法,因为即使数据转换和ml函数会运行在workers节点上,http / api相关的代码仍会在一个节点上运行,调用spark-submit上的一个节点(如果我错了,请纠正我)。
另一种方法是使用相同的长时间运行的应用程序,但是在本地独立的群集中。我可以根据需要多次部署相同的应用程序,并在其前面放置一个负载均衡器。使用这种方法,http / api部分处理得很好,但是火花部分根本没有使用集群功能(这可能不是问题,因为事实上它应该只对每个请求执行单个预测)
第三种方法是使用SparkLauncher,它将火花作业包装在一个单独的罐子里,但我真的不喜欢飞行罐子,而且很难找到预测的结果(队列可能,或者hdfs) )
基本上问题是:通过rest api消耗spark的ml模型的最佳方法是什么?
谢谢
答案 0 :(得分:1)
你有三个选择
DB
,通过休息向客户端公开DB
structured-streaming
/ recursive function
开启以扫描输入数据源,持续更新/追加DB
,通过休息将DB
公开给客户如果您有single prediction per request
,并且您的数据输入不断更新,我建议选项3,它将始终转换near-real-time
中的数据,并且客户端可以持续访问{{1您可以通过休息或sns发送output
来通知client
新数据,您可以保留非常小的notification
群集来处理数据提取,并且根据请求/数据量(负载均衡器)缩放spark
和rest service
如果您预计会定期更新数据源的罕见请求,请每天说一次,选项DB
或1
将是合适的,因为您可以启动更大的群集并在完成后将其关闭。
希望它有所帮助。
答案 1 :(得分:0)
问题是您不希望保持Spark群集运行并在其中部署REST API进行预测,因为它很慢。
因此,为了实现低延迟的实时预测,这里有一些解决方案。
我们正在做的是训练模型,导出模型并在Spark外部使用模型进行预测。
如果PMML标准支持使用的ML算法,则可以将模型导出为PMML文件。可以使用jpmml库将Spark ML模型导出为JPMML文件。然后,您可以创建REST API并使用JPMML Evaluator来预测使用Spark ML模型。
MLEAP MLeap是用于机器学习管道的通用序列化格式和执行引擎。它支持Spark,Scikit学习和Tensorflow来训练管道并将其导出到MLeap捆绑包。可以将序列化的管道(捆绑)反序列化回Spark,以进行批处理模式评分或MLeap运行时,以支持实时API服务。它支持多种平台,尽管我刚刚将其用于Spark ML模型,并且效果很好。