开发者社区> 问答> 正文

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

我实现了一个rich sink函数,它根据调用的对象执行一些网络调用。我希望能够计算这些事件的一些元数据,这些事件由事件中包含的某些上下文信息(事件的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处理的事件数量的值

展开
收起
flink小助手 2018-12-11 16:45:51 2510 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    计划A:使用Metric对象和MetricReporter将数据公开给外部系统。这样做的缺点是指标不是检查点,如果有很多batchIds,你可能最终会用许多无法获得GC的指标污染指标系统。

    计划B:将RichSinkFunction重写为RichFlatMap(或ProcessFunction),它发出一个元组流(batchId,number.of.events.in.batchId)。您可以通过batchId键入此流,然后在KeyedProcessFunction(例如)中使用键控状态来通过可查询状态存储和公开此状态。这具有以下缺点:可查询状态仅允许点查询(一次一个键)。

    计划C:在此变体中,外部系统可以通过将查询注入到广播到KeyedBroadcastProcessFunction的流中来查询在计划B中创建的状态,该KeyedBroadcastProcessFunction保存有键的state.count.number.of.events.processed.for.event.batchId数据。然后,您可以在KeyedBroadcastProcessFunction的processBroadcastElement方法中使用ctx.applyToKeyedState来响应这些查询。

    计划D:将结果从B(或C)写入redis,elasticsearch或其他一些可查询数据存储,并让外部系统从那里获取此信息。

    2019-07-17 23:19:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载