如何在火花流工作期间更新ML模型而无需重新启动应用程序?

时间:2017-04-13 08:26:03

标签: apache-spark machine-learning spark-streaming

我有一个Spark Streaming工作,其目标是:

  • 阅读一批消息
  • 使用预先训练的ML管道预测给定这些消息的变量Y

问题是,我希望能够更新执行程序使用的模型,而无需重新启动应用程序。

简单地说,这就是它的样子:

model = #model initialization

def preprocess(keyValueList):
    #do some preprocessing

def predict(preprocessedRDD):
    if not preprocessedRDD.isEmpty():
        df = #create df from rdd
        df = model.transform(df)
        #more things to do

stream = KafkaUtils.createDirectStream(ssc, [kafkaTopic], kafkaParams)

stream.mapPartitions(preprocess).foreachRDD(predict)

在这种情况下,简单地使用模型。没有更新。

我已经考虑了几种可能性,但我现在已经把它们全部划掉了:

  • 每次更改时广播模型(无法更新,只读)
  • 在执行程序上从HDFS读取模型(它不需要SparkContext)

有什么想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

我之前以两种不同的方式解决了这个问题:

  • 模型上的TTL
  • 重新阅读每个批次的模型

这两种解决方案都假定您定期(例如每天一次)积累的数据进行额外的工作培训。

答案 1 :(得分:-1)

传递给foreachRDD的函数由驱动程序执行,它只是由执行程序执行的rdd操作本身,因此您不需要序列化模型 - 假设您使用的是运行的Spark ML管道RDD,据我所知,他们都这样做。 Spark为您处理培训/预测,您无需手动分发它。