Scala 如果在过去1小时内未推送任何记录,如何设置spark streaming作业警报?

Scala 如果在过去1小时内未推送任何记录,如何设置spark streaming作业警报?,scala,apache-spark,spark-streaming,solace,Scala,Apache Spark,Spark Streaming,Solace,我有一个spark流媒体工作,可以读取和处理solace队列中的数据。如果在过去一小时内没有数据被消耗,我想设置一个警报。目前,我已将批处理窗口设置为1分钟。如果连续一小时未消耗任何数据,如何添加警报以通知来源 您有几种选择: 将StreamListener()的实现添加到订阅的流中。然后,覆盖onBatchCompleted以访问将为您提供批处理时间和大小的BatchInfo。有了这些信息,您可以跟踪发生的情况,并在特定时间段内未收到任何数据时发出警报 您还可以使用为监视提供的RESTAPI

我有一个spark流媒体工作,可以读取和处理solace队列中的数据。如果在过去一小时内没有数据被消耗,我想设置一个警报。目前,我已将批处理窗口设置为1分钟。如果连续一小时未消耗任何数据,如何添加警报以通知来源


您有几种选择:

  • StreamListener
    ()的实现添加到订阅的流中。然后,覆盖
    onBatchCompleted
    以访问将为您提供批处理时间和大小的
    BatchInfo
    。有了这些信息,您可以跟踪发生的情况,并在特定时间段内未收到任何数据时发出警报

  • 您还可以使用为监视提供的RESTAPI,如所述。您可以从外部进行检查,如果需要,可以发出警报。例如,检查
    /applications/[app id]/streaming/batches


您可以通过将上次接收记录的时间戳保存在hdfs文件中来跟踪它。然后在处理微批处理时,如果rdd为空,并且当前时间戳和hdfs中的时间戳的差异超过一个小时,则可以使用邮件服务发送邮件。如果在微批处理中收到一些记录,则可以相应地更新hdfs文件中的时间戳。 您的代码如下所示,您需要实现
getTimeStampFromHDFS()
,它将在您的hdfs文件中返回时间戳;
updateTimestampHDFS(currentTimestamp)
,您将在微批处理中收到记录时更新时间戳

dstream.foreachRDD{rdd => 
    if(rdd.isEmpty) {
        if((System.currentTimeMillis - getTimeStampFromHDFS()) / (1000 * 60 * 60) >= 1) sendMailAlert()
    }
    else {
        updateTimestampHDFS(System.currentTimeMillis)
    }
}


你想用Pyspark还是Solace?我想用我的spark代码来处理。我有一个可以发送通知的邮寄服务,我只需要知道我什么时候可以发送通知?我应该在foreachRDD中编写什么来处理没有报告的数据?您可以执行类似以下伪代码
stream\rdd.foreach(lambda x:do\u something(),如果x.isEmpty()否则通过)
。我不确定它是否有效,但我认为答案是这样的this@pissall如果我在isEmpty()上添加一个检查,它将只检查当前批次(1分钟)中的行数是否为空,而不是连续一小时?