【问题标题】:Scalable invocation of Spark MLlib 1.6 predictive model w/a single data record具有单个数据记录的 Spark MLlib 1.6 预测模型的可扩展调用
【发布时间】:2017-01-15 04:38:00
【问题描述】:
我在 Spark 1.6 中构建了一个预测模型(逻辑回归),该模型已保存到磁盘中,以便以后在新数据记录中重复使用。我想用多个客户端调用它,每个客户端都传入单个数据记录。似乎使用 Spark 作业来运行单个记录会产生太多开销并且不会非常可扩展(每次调用只会传递一组 18 个值)。加载保存模型的 MLlib API 需要 Spark 上下文,因此我正在寻找有关如何以可扩展方式执行此操作的建议。想到了带有 Kafka 输入的 Spark Streaming(每个客户端请求都将写入一个 Kafka 主题)。对这个想法或替代建议有什么想法吗?
【问题讨论】:
标签:
apache-spark
apache-kafka
spark-streaming
apache-spark-mllib
【解决方案1】:
来自o.a.s.mllib 的非分布式(实际上是多数)模型不需要活动的SparkContext 来进行单项预测。如果您检查API docs,您会看到LogisticRegressionModel 提供了predict 方法和签名Vector => Double。这意味着您可以使用标准 Java 工具对模型进行序列化,稍后再阅读它并对本地 o.a.s.mllib.Vector 对象执行预测。
Spark 还提供a limited PMML support(不适用于逻辑回归),因此您可以与支持此格式的任何其他库共享您的模型。
最后,非分布式模型通常没有那么复杂。对于线性模型,您只需要截距、系数和一些基本的数学函数和线性代数库(如果您想要一个不错的性能)。
o.a.s.ml 模型稍微难以处理,但有一些外部工具试图解决这个问题。详情可以查看开发者列表(Deploying ML Pipeline Model)的相关讨论。
对于分布式模型,确实没有好的解决方法。您必须以一种或另一种方式在分布式数据集上开始一项完整的工作。