Apache kafka 实时更新Flink中的序列化模式

Apache kafka 实时更新Flink中的序列化模式,apache-kafka,apache-flink,avro,flink-streaming,Apache Kafka,Apache Flink,Avro,Flink Streaming,我有一大堆工作看起来像这张素描 Source<GenericRecord> kafkaSource; kafkaSource .map(function that takes generic record) .map( ... ) ... .sink(kafka sink that takes in generic records) 源卡夫卡索资源; 卡夫卡索 .map(获取通用记录的函数) .map(…) ... .sink(接受通用记录的卡夫卡接

我有一大堆工作看起来像这张素描

Source<GenericRecord> kafkaSource;
kafkaSource
    .map(function that takes generic record)
    .map( ... )
    ...
    .sink(kafka sink that takes in generic records)
源卡夫卡索资源;
卡夫卡索
.map(获取通用记录的函数)
.map(…)
...
.sink(接受通用记录的卡夫卡接收器)
我们将数据表示为GenericRecords的原因是,在运行时使用的Avro模式会有所不同。我们为一个单独的主题编写模式描述。我们知道向/从操作符/kafka传递GenericRecords会降低性能,因此我们为GenericRecords编写了自己的kafka序列化模式和Kryo序列化程序。棘手的部分是,我们的定制序列化程序需要知道当前模式列表是什么,这样它就可以知道如何在消息通过图时对其进行序列化/反序列化

我一辈子都搞不懂如何以理智的方式将这些信息传递到我们的序列化程序中。我知道的方法有:

  • 某个地方的静态字段,用于轮询外部系统中的记录列表。我们已经这样做了,但我们认为这会导致类加载器泄漏,因为轮询线程是在自定义序列化程序中创建的,我们不清楚应该在哪里取消它
  • 广播状态。我们可以尝试使用广播状态在图形周围流式传输模式,但这意味着编写这些作业将不符合人体工程学;图中的每个操作符都必须接收广播状态,并且必须在内部处理序列化,而不是使用自定义序列化程序
  • 由卡夫卡流填充的静态字段。这避免了(1)的线程泄漏,但我认为flink不能保证我们可以在每个任务槽中填充这个静态字段。很难控制卡夫卡流的处理位置

  • 我知道这是一个复杂的情况,所以我希望它能被清楚地理解。我觉得很困惑,因为我所考虑的解决方案似乎都不充分。还有其他我没有想到的选择吗?有没有更好的方法可以在不重新启动的情况下管理一组动态Avro模式?我想听听你的建议!谢谢

    您是否考虑过schema registry?希望不要引入其他服务来解决此问题。话虽如此,你的评论激励我尝试不同的解决方案;根据需要抓取模式+缓存,而不是在后台。我支持对模式注册表的建议。这是处理问题的标准方法。顺便说一句,如果您使用与卡夫卡相同的协议(模式id+有效负载),
    genericord
    应该比
    Kryo
    快。