【发布时间】:2016-05-04 06:25:42
【问题描述】:
我正在使用两个不同的窗口运行 Spark Streaming(一个窗口用于使用 SKLearn 训练模型,另一个用于基于该模型预测值),我想知道如何避免一个窗口(“慢”训练window) 来训练模型,而不会“阻塞”“快速”预测窗口。
我的简化代码如下所示:
conf = SparkConf()
conf.setMaster("local[4]")
sc = SparkContext(conf=conf)
ssc = StreamingContext(sc, 1)
stream = ssc.socketTextStream("localhost", 7000)
import Custom_ModelContainer
### Window 1 ###
### predict data based on model computed in window 2 ###
def predict(time, rdd):
try:
# ... rdd conversion to df, feature extraction etc...
# regular python code
X = np.array(df.map(lambda lp: lp.features.toArray()).collect())
pred = Custom_ModelContainer.getmodel().predict(X)
# send prediction to GUI
except Exception, e: print e
predictionStream = stream.window(60,60)
predictionStream.foreachRDD(predict)
### Window 2 ###
### fit new model ###
def trainModel(time, rdd):
try:
# ... rdd conversion to df, feature extraction etc...
X = np.array(df.map(lambda lp: lp.features.toArray()).collect())
y = np.array(df.map(lambda lp: lp.label).collect())
# train test split etc...
model = SVR().fit(X_train, y_train)
Custom_ModelContainer.setModel(model)
except Exception, e: print e
modelTrainingStream = stream.window(600,600)
modelTrainingStream.foreachRDD(trainModel)
(注意:Custom_ModelContainer是我写的一个类,用来保存和检索训练好的模型)
我的设置通常运行良好,但每次在第二个窗口中训练一个新模型时(大约需要一分钟),第一个窗口在模型训练完成之前不会计算预测。实际上,我想这是有道理的,因为模型拟合和预测都是在主节点上计算的(在非分布式设置中 - 由于 SKLearn)。
所以我的问题如下:是否可以在单个工作节点(而不是主节点)上训练模型?如果是这样,我怎样才能实现后者,这真的能解决我的问题吗?
如果没有,关于如何在不延迟窗口 1 中的计算的情况下进行此类设置的任何其他建议?
非常感谢任何帮助。
编辑:我想更普遍的问题是: 如何在两个不同的工作人员上并行运行两个不同的任务?
【问题讨论】:
标签: python apache-spark scikit-learn spark-streaming