Scala 如何在Flink中使用多个计数器

Scala 如何在Flink中使用多个计数器,scala,apache-flink,metrics,Scala,Apache Flink,Metrics,(有点像) 我有一个事件流(someid:String,name:String),出于监控的原因,我需要一个计数器每个事件ID。 在所有的Flink文档和示例中,我可以看到计数器是用map函数的open中的名称初始化的 但在我的情况下,我不能初始化计数器,因为我需要每个eventId一个计数器,而且我事先不知道该值。此外,我理解每次在MapFunction的map()方法中通过偶数时创建一个新计数器的成本有多高。 最后,我不能保留计数器的“缓存”,因为它太大了 理想情况下,我想要这样的东西: c

(有点像)

我有一个
事件流(someid:String,name:String)
,出于监控的原因,我需要一个计数器每个事件ID。 在所有的Flink文档和示例中,我可以看到计数器是用map函数的
open
中的名称初始化的

但在我的情况下,我不能初始化计数器,因为我需要每个eventId一个计数器,而且我事先不知道该值。此外,我理解每次在MapFunction的
map()
方法中通过偶数时创建一个新计数器的成本有多高。 最后,我不能保留计数器的“缓存”,因为它太大了

理想情况下,我想要这样的东西:

class Event(id: String, name: String)

class ExampleMapFunction extends RichMapFunction[Event, Event] {
  @transient private var counter: Counter = _

  override def open(parameters: Configuration): Unit = {
    counter = new Counter()
  }

  override def map(event: Event): Event = {
    counter.inc(event.id)
    event
  }
}
或者基本上我可以实现我自己的计数器,让我通过一个维度?如果是,如何进行


对于这种用例有什么建议或最佳实践吗?

如果保留计数器的缓存太大,那么我认为使用度量不会以满足您需求的方式扩展

有几个备选方案:

  • 使用端输出在一些外部可查询/可视化数据存储中收集有意义的事件,例如XDB

  • 将信息保持在键控状态,并根据需要使用广播消息触发信息相关部分的输出(再次使用侧输出)

  • 将信息保持在键控状态,并定期获取保存点,然后使用状态处理器API通过查询进行分析


您能解释一下为什么要使用此度量而不是键控状态(这似乎是显而易见的答案)?指标并不能很好地扩展。出于监控的原因,我想检查拓扑结构的每个步骤。例如,由于我有许多流的连接,我想知道它在哪里不会连接。谢谢你的回答。当我说“它太大了”,主要是因为它永远不会停止增加(自动生成的ID)。我将深入研究这些命题,不过使用外部库(如?