繁体   English   中英

监控结构化流

[英]Monitoring Structured Streaming

我有一个运行良好的结构化流设置,但我希望在它运行时监视它。

我已经构建了一个EventCollector

class EventCollector extends StreamingQueryListener{
  override def onQueryStarted(event: QueryStartedEvent): Unit = {
    println("Start")
  }

  override def onQueryProgress(event: QueryProgressEvent): Unit = {
    println(event.queryStatus.prettyJson)
  }

  override def onQueryTerminated(event: QueryTerminatedEvent): Unit = {
    println("Term")
  }

我已经构建了一个EventCollector并将监听器添加到我的spark会话中

val listener = new EventCollector()
spark.streams.addListener(listener)

然后我解除了查询

val query = inputDF.writeStream
  //.format("console")
  .queryName("Stream")
  .foreach(writer)
  .start()

query.awaitTermination()

但是,onQueryProgress永远不会被击中。 onQueryStarted确实如此,但我希望以一定的时间间隔获取查询的进度,以监控查询的执行情况。 任何人都可以协助吗?

经过对这个主题的大量研究,这就是我发现的......

OnQueryProgress在查询之间受到影响。 我不确定这是否有意,但是当我们从文件中传输数据时,OnQueryProgress不会启动。

我发现的解决方案是依靠foreach writer接收器并在过程函数中执行我自己的性能分析。 遗憾的是,我们无法访问有关正在运行的查询的特定信息。 或者,我还没想出怎么做。 这是我在沙箱中实现的分析性能的方法:

val writer = new ForeachWriter[rawDataRow] {
    def open(partitionId: Long, version: Long):Boolean = {
        //We end up here in between files
        true
    }
    def process(value: rawDataRow) = {
        counter += 1

        if(counter % 1000 == 0) {
            val currentTime = System.nanoTime()
            val elapsedTime = (currentTime - startTime)/1000000000.0

            println(s"Records Written:  $counter")
            println(s"Time Elapsed: $elapsedTime seconds")
        }
     }
}

获取指标的另一种方法:

获取有关正在运行的查询的信息的另一种方法是点击spark为我们提供的GET端点。

HTTP://本地主机:4040 /指标

要么

HTTP://本地主机:4040 / API / V1 /

这里的文档: http//spark.apache.org/docs/latest/monitoring.html

2017年9月2日更新: 测试常规火花流,而非结构化流媒体

免责声明,这可能不适用于结构化流媒体,我需要设置一个测试床来确认。 但是,它确实适用于常规火花流(在此示例中从Kafka消费)。

我相信,由于Spark streaming 2.2已经发布,新的端点可以检索更多关于流性能的指标。 这可能已经存在于以前的版本中,我只是错过了它,但我想确保它是为其他任何搜索此信息的人记录的。

http:// localhost:4040 / api / v1 / applications / {applicationIdHere} / streaming / statistics

这是看起来像是在2.2中添加的端点(或者它已经存在并且刚刚添加了文档,我不确定,我还没有检查过)。

无论如何,它为指定的流应用程序添加了这种格式的指标:

{
  "startTime" : "2017-09-13T14:02:28.883GMT",
  "batchDuration" : 1000,
  "numReceivers" : 0,
  "numActiveReceivers" : 0,
  "numInactiveReceivers" : 0,
  "numTotalCompletedBatches" : 90379,
  "numRetainedCompletedBatches" : 1000,
  "numActiveBatches" : 0,
  "numProcessedRecords" : 39652167,
  "numReceivedRecords" : 39652167,
  "avgInputRate" : 771.722,
  "avgSchedulingDelay" : 2,
  "avgProcessingTime" : 85,
  "avgTotalDelay" : 87
}

这使我们能够使用Spark公开的REST端点构建我们自己的自定义度量/监视应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM