簡體   English   中英

Flink Metrics 名稱沖突

[英]Flink Metrics name collision

我的 Flink (1.6) 作業偵聽流並執行一些聚合。 我想在聚合后收集指標,但遇到了一些困難。

我的指標如下所示:

id_1, 0.1
id_2, 0.3
...

id 將是可變的,並且值會隨着時間的推移而增加和減少,因此看起來Gauge是最合適的。

我創建了這個地圖函數來在儀表中捕獲這些指標:

class MetricsMapper extends RichMapFunction[MyObject, Double] {
  override def map(obj: MyObject): Double = {
    val metricVal = obj.metricVal
    getRuntimeContext.getMetricGroup.gauge[Double, ScalaGauge[Double]](obj.id, ScalaGauge[Double](() => metricVal))
    metricVal
  }
}

如圖所示,我使用對象的 id 屬性來注冊儀表。

我遇到的問題是我在運行作業時收到此警告:

Name collision: Group already contains a Metric with the name "x" Metric will not be reported

我將其解釋為我們已經在流中較早地創建了此儀表,並且忽略了新值。 有沒有辦法克服這個問題?

謝謝

您確定要在此處使用指標嗎? 指標通常用作查看工作執行情況的手段。 您要使用指標的通常值是:

  • 每秒記錄,
  • 遲到的事件
  • 損壞事件的數量等。

在你的情況下,我寧願使用一些生產這些聚合的輔助管道。

您應該遵循文檔中顯示的模式:

new class MyMapper extends RichMapFunction[MyObject, Double] {
  @transient private var valueToExpose = 0.0

  override def open(parameters: Configuration): Unit = {
    getRuntimeContext()
      .getMetricGroup()
      .gauge[Double, ScalaGauge[Double]]("MyGauge", ScalaGauge[Double]( () => valueToExpose ) )
  }

  override def map(obj: MyObject): String = {
    valueToExpose = obj.metricval
    valueToExpose
  }
}

換句話說,在 open() 方法中注冊一次儀表,並在每次調用 map() 時更新值。

在您的情況下,您需要為每個唯一的對象 ID 使用單獨的儀表。 如果你真的想用度量來做這件事,你必須保留一些像儀表的哈希圖,根據需要創建新的,並在 map() 函數中更新相關儀表的值。 或者更好的是,通過 id 來鍵入您的流。

在考慮使用指標是否合適時要記住的另一個因素是指標沒有設置檢查點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM