Apache spark 如何在spark流作业期间更新ML模型而不重新启动应用程序?

Apache spark 如何在spark流作业期间更新ML模型而不重新启动应用程序?,apache-spark,machine-learning,spark-streaming,Apache Spark,Machine Learning,Spark Streaming,我有一份Spark流媒体工作,目标是: 阅读一批消息 使用预先训练好的ML管道预测给定这些消息的变量Y 问题是,我希望能够在不重新启动应用程序的情况下更新执行者使用的模型 简单地说,它是这样的: model = #model initialization def preprocess(keyValueList): #do some preprocessing def predict(preprocessedRDD): if not preprocessedRDD.isEmpt

我有一份Spark流媒体工作,目标是:

阅读一批消息 使用预先训练好的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,因此不可能 有什么想法吗


非常感谢

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

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

我以前用两种不同的方法解决过这个问题:

模型上的TTL 重新阅读每个批次的模型
这两种解决方案都假设对您定期积累的数据进行额外的工作培训,例如每天一次。

我以前用两种不同的方法解决过这个问题:

模型上的TTL 重新阅读每个批次的模型
这两种解决方案都假设对您定期积累的数据进行额外的工作培训,例如每天一次。

您使用的是哪种ML算法?Spark中有两种面向流的算法。我猜你已经排除了这些可能性,但我想我会提到以防万一。嗨,目前我们正在考虑使用Word2Vec来构建功能。我们还没有选择一个模型,它必须是灵活的。在这种情况下,我将使用Flask构建一个REST API,它公开对train、update和predict的调用,您可以通过PredictPreprepreprocessedRDD函数的HTTP请求来调用它。这样的解耦将为您选择的模型、更新频率、存储位置以及如何升级模型和流作业的代码提供更大的灵活性。该模型在Spark群集上运行,而不是在独立的REST应用程序上运行。这是怎么回事?使用单独的Spark作业,一个用于流媒体,一个用于管理模型。问题是您尚未选择模型,并非所有Spark模型都支持保存/加载,也并非所有模型都支持流式更新,而且我们甚至还没有进入处理流式作业中的故障、重新启动和代码更改的操作复杂性。通过将模型作业与流式作业分离,您可以为自己购买更多的灵活性。恐怕你在这里处于最前沿,根据我的经验,这不是一个已解决的问题。你在使用哪种ML算法?Spark中有两种面向流的算法。我猜你已经排除了这些可能性,但我想我会提到以防万一。嗨,目前我们正在考虑使用Word2Vec来构建功能。我们还没有选择一个模型,它必须是灵活的。在这种情况下,我将使用Flask构建一个REST API,它公开对train、update和predict的调用,您可以通过PredictPreprepreprocessedRDD函数的HTTP请求来调用它。这样的解耦将为您选择的模型、更新频率、存储位置以及如何升级模型和流作业的代码提供更大的灵活性。该模型在Spark群集上运行,而不是在独立的REST应用程序上运行。这是怎么回事?使用单独的Spark作业,一个用于流媒体,一个用于管理模型。问题是您尚未选择模型,并非所有Spark模型都支持保存/加载,也并非所有模型都支持流式更新,而且我们甚至还没有进入处理流式作业中的故障、重新启动和代码更改的操作复杂性。通过将模型作业与流式作业分离,您可以为自己购买更多的灵活性。恐怕你在这里处于最前沿,根据我的经验,这不是一个已解决的问题。我在广播文档的任何地方都没有看到TTL。你能提供一个链接吗?此外,你是不是投了ImDarrenG的票?如果是这样的话,请注意解释一下?它不是内置API的一部分,而是您必须依靠外部配置机制(如Zookeeper或Concur)自行实现的,您可以在其中存储模型失效的时间。此外,我个人使用transform来进行批处理预测
在每个RDD上设置默认值,并保留foreachRDD以输出结果。我投了反对票,因为它没有提供问题的答案。顺便说一下,您可以在流式转换/foreachRDD期间访问SparkContext/SparkSession,cf您可以从transform/foreachRDD访问上下文,因为它是在驱动程序上执行的,因此不需要手动将模型分发给执行者,这是由Spark处理的-注意,在这些示例中,我们传递要转换的数据集,我们不需要对单个数据项进行操作,我在广播文档的任何地方都没有看到TTL。你能提供一个链接吗?此外,你是不是投了ImDarrenG的票?如果是这样的话,请解释一下?它不是内置API的一部分,而是您必须依靠外部配置机制(如Zookeeper或Concur)自行实现的,您可以在其中存储模型失效的时间。此外,我个人使用transform对每个RDD进行批处理预测,并保留foreachRDD以输出结果。我投了反对票,因为它没有提供问题的答案。顺便说一下,您可以在流式转换/foreachRDD期间访问SparkContext/SparkSession,cf您可以从transform/foreachRDD访问上下文,因为它是在驱动程序上执行的,因此不需要手动将模型分发给执行者,这是由Spark处理的——在这些示例中,我们传递要转换的数据集,不需要对单个数据项进行操作