【问题标题】:Apache Spark & Machine Learning - Using in productionApache Spark 和机器学习 - 在生产中使用
【发布时间】:2017-09-18 05:59:59
【问题描述】:

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

我想做的是:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:

    你有三个选择

    1. 根据客户请求通过 spark api spark-jobserver 触发批处理 ML 作业
    2. 通过调度程序 airflow 触发批处理 ML 作业,将输出写入 DB,通过 rest 向客户端公开 DB
    3. 保持structured-streaming / recursive functionon 扫描输入数据源,不断更新/追加DB,通过休息向客户端公开DB

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

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

    希望对你有帮助。

    【讨论】:

    • 选项 1 和 2 都需要将预测作业捆绑在一个独立的 jar 中。这种方法带回了旧的依赖地狱,这是我想避免的,它在部署和维护应用程序时引入了很多困难。
    • 对于选项 2。您也可以通过 zeppelin.apache.org 启动调度程序,但是对于 production,笔记本通常不可靠,无论如何您都需要管理依赖项:无论是否使用笔记本,构建您自己的在google cloud 中集群dataproc,在aws 中集群https://github.com/InsightDataScience/pegasusemr,如果您现在需要分享,您可以随时转到databricks 以获得可靠且易于管理的笔记本电脑,这对您来说很好公司调度程序
    • 我只会将笔记本用于模型开发,一旦模型经过训练并导出到 hdfs,笔记本的工作就完成了
    【解决方案2】:

    问题是您不想让 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 模型,而且效果非常好。

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多