Flink指标名称冲突

时间:2018-10-30 11:26:32

标签: apache-flink flink-streaming

我的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

我解释这是因为我们已经在流中更早地创建了该量规,并且新值被忽略了。有办法克服吗?

谢谢

2 个答案:

答案 0 :(得分:0)

确定要在此处使用指标吗?指标通常用作查看工作绩效的一种手段。您想要使用指标的常用值是:

  • 每秒记录,
  • 晚会
  • 损坏事件的数量等

在您的情况下,我宁愿使用一些生成这些聚合的侧管道。

答案 1 :(得分:0)

您应该遵循documentation中显示的模式:

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键入您的视频流。

在考虑使用指标是否合适时要记住的另一个因素是指标没有检查点。