Flink-如何跨多个任务槽聚合和查询丰富的接收器功能状态

时间:2018-11-29 15:03:33

标签: scala apache-kafka apache-flink kafka-consumer-api flink-streaming

我实现了一个丰富的接收器功能,该功能针对被调用的对象执行一些网络调用。我希望能够对这些事件中的一些元数据进行计数,这些元数据由事件中包含的某些上下文信息(事件的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处理了多少个事件的值

1 个答案:

答案 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或其他可查询的数据存储中,并让外部系统从那里获取此信息。