簡體   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