我使用以下代码片段来训练Streaming K-Means。在完成rdd
一次的流式传输后,是否可以停止流式上下文?我怎么知道它是否完全完成了RDD?
ssc = StreamingContext(sc, 1)
streamingKMeansModel = StreamingKMeans(k=k, decayFactor=1.0).setInitialCenters(init_centers, [1.0] * len(init_centers))
streamingKMeansModel.trainOn(ssc.queueStream([rdd]))
ssc.start()
ssc.awaitTermination(timeout=30*60)
# What I want:
if processed_the_rdd_once:
ssc.stop()
在另一个论坛上,我得到了以下答案:"我认为你可以附加一个监听器,如果它检测到流的结束就可以关闭#34;。在 pyspark 中是否有示例代码?
答案 0 :(得分:2)
要在处理QueueDStream
的第一个RDD之后立即停止流式处理作业,在训练操作之后立即安排stop
就足够了。我们可以使用通用foreachRDD
来做到这一点。提供的lambda将在trainOn
调用(which is a foreachRDD
call on its own)
这样的事情可以解决问题:
...
dstream = ssc.queueStream([rdd])
streamingKMeansModel.trainOn(dstream)
dstream.foreachRDD(lambda rdd: ssc.stop(false))
#stop(false) lets the underlying spark context active, so that we can use the trained model further on.
ssc.start()
ssc.awaitTermination(timeout=30*60)