我实现了一个丰富的接收器功能,该功能针对被调用的对象执行一些网络调用。我希望能够对这些事件中的一些元数据进行计数,这些元数据由事件中包含的某些上下文信息(事件的batchID)来键入,并将此元数据公开给外部系统。
例如,一个事件如下所示:
case class MyEvent(batchId: String, eventId: String, moreInformation: ...)
class MySink(...) extends RichSinkFunction[MyEvent]
{
override def open(parameters: Configuration): Unit = {
...
}
override def close(): Unit = {
...
}
override def invoke(event: MyEvent) = {
// some processing is done here
....
//
...
if (success) {
I want to save the meta data here per event.batchId
state.count.number.of.events.processed.for.event.batchId
}
}
}
在另一个地方,我想以某种方式能够查询为batchId处理了多少个事件的值
答案 0 :(得分:0)
一些选项:
计划A:使用Metric对象和MetricReporter将数据公开给外部系统。这样做的缺点是,没有对指标进行检查,并且,如果有很多batchId,您可能最终会用很多无法GC的指标来污染指标系统。
计划B:将RichSinkFunction重写为RichFlatMap(或ProcessFunction),它发出Tuples持有流(batchId,number.of.events.in.batchId)。您可以通过batchId对该流进行键控,然后使用KeyedProcessFunction中的键控状态(例如)通过可查询状态存储和公开此状态。这样做的缺点是,可查询状态仅允许进行点查询(一次只能输入一个键)。
计划C:在此变体中,外部系统可以通过向流中注入查询来查询在计划B中创建的状态,该流将广播到保存有键state.count.number.of.events.processed.for的KeyedBroadcastProcessFunction中。 event.batchId数据。然后,您可以在KeyedBroadcastProcessFunction的processBroadcastElement方法中使用ctx.applyToKeyedState来响应这些查询。有关示例,请参见one of the Flink training exercises。
计划D:将B(或C)的结果写入redis,elasticsearch或其他可查询的数据存储中,并让外部系统从那里获取此信息。