2017-04-21 60 views
1

我在计算如何在现实生活环境中使用Spark的机器学习功能时遇到一些困难。Apache Spark和机器学习 - 在生产中使用

我想要做的是以下几点:

  • 使用笔记本
  • 使用REST API服务于学习的模型开发新毫升模式(类似POST -/API/V1 /为MyModel /预测)

咱们说毫升训练过程由笔记本电脑来处理,一旦模型的要求得到满足它保存到一个文件HDFS,通过火花应用程序加载后

我知道我可以编写一个长时间运行的spark应用程序,它暴露了api并在我的spark集群上运行它,但我不认为这是一种可伸缩的方法,因为即使数据转换和ml函数在worker节点中,http/api相关的代码仍然会在一个节点上运行,那么spark-submit中的代码将被调用(如果我错了,请纠正我)。

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

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

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

谢谢

回答

1

你有三个选择

通过火花API spark-jobserver
  1. 触发批ML工作,根据客户要求
  2. 通过调度 airflow
  3. 触发批ML工作,输出写到DB,暴露DB通过休息到客户端
  4. 保持structured-streaming/recursive function在扫描输入数据源,更新/追加DB不断,通过休息暴露DB客户

如果你有single prediction per request,你的数据输入是不断更新的,我建议选择3,这将在任何时候都变换near-real-time数据,和客户端将有持续访问到output,可以在新的数据是由经休息或sns发送notification完成通知client,你可以保持非常小spark集群,将处理数据采集和规模rest serviceDB根据请求/数据量(负载均衡)

如果y ou预计数据源定期更新的罕见请求让我们每天说一次,选项12将适用,因为您可以启动更大的群集并在完成时将其关闭。

希望它有帮助。

+0

选项1和2都需要预测作业捆绑在一个自包含的jar中。这种方法带回了旧的依赖性地狱,我想避免它,并且在部署和维护应用程序时引入了很多困难。 –

+0

选项2.你也可以通过'zeppelin.apache.org'启动调度程序,虽然笔记本通常对于'production'不可靠,但是你仍然需要管理依赖关系:不管是否使用笔记本,建立你自己的集群'dataproc如果你现在需要共享它,你总是可以到'databricks'来获得可靠和易于管理的''google'云'和'https:// github.com/InsightDataScience/pegasus'或'emr' noteboks,这将适用于您的公司调度程序 –

+0

我会使用笔记本电脑只用于模型开发,一旦模型已经过培训并导出到hdfs笔记本电脑的工作完成 –