我想在一段时间内没有任何活动(即接收方未收到消息)时终止我的Spark Streaming工作。我尝试这样做
var counter = 0
myDStream.foreachRDD {
rdd =>
if (rdd.count() == 0L)
{
counter = counter + 1
if (counter == 40) {
ssc.stop(true, true)
}
} else {
counter = 0
}
}
是否有更好的方法?每当没有活动时,我如何使变量对所有接收者可用,并将变量更新为1?
答案 0 :(得分:1)
使用NoSQL表(例如Cassandra或HBase)来保持计数器。您无法在循环内处理流轮询。如果没有活动,则使用NoSQL或Maria DB实施相同的逻辑,并对流作业执行正常关机。 我这样做的方法是我在Maria DB中维护了一个表,该表用于流作业,轮询间隔为5分钟。它每5分钟访问一次数据库并写入消耗的记录计数,该方法还会返回最近时间戳记中零个记录行项目的计数。这帮助我极大地管理了流作业管理。此外,此表通常还可以帮助我o根据用shell脚本编写的逻辑
自动触发流作业。