在Spark Streaming(PySpark)中,如何在完成RDD流式传输后停止一次?

时间:2017-06-24 01:51:55

标签: apache-spark pyspark spark-streaming

我使用以下代码片段来训练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 中是否有示例代码?

1 个答案:

答案 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)