Я запускаю Spark Streaming с двумя разными окнами (в окне для обучения модели с SKLearn, а другой для прогнозирования значений на основе этой модели), и мне интересно, как я могу избежать одного окна ( "медленное" обучение окно) для обучения модели без "блокировки" окна "быстрого" прогноза.
Мой упрощенный код выглядит следующим образом:
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 - это класс, который я написал для сохранения и получения обучаемой модели)
Моя настройка работает нормально, за исключением того, что каждый раз, когда новая модель обучается во втором окне (что занимает около минуты), первые окна не вычисляют прогнозы до завершения обучения модели. Фактически, я предполагаю, что это имеет смысл, поскольку подгонка моделей и предсказания вычисляются на главном node (в нераспределенной настройке - из-за SKLearn).
Итак, мой вопрос заключается в следующем: можно ли подготовить модель для одного рабочего node (вместо мастера node)? Если да, то как я мог бы достичь последнего и действительно ли разрешил бы мою проблему?
Если нет, любое другое предложение о том, как я мог бы выполнить такую настройку, без задержки вычислений в окне 1?
Любая помощь очень ценится.
EDIT: Я думаю, что более общий вопрос: Как я могу запустить две разные задачи для двух разных рабочих параллельно?