在Flink中实时更新序列化架构

时间:2020-09-24 21:35:18

标签: 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)

我们将数据表示为GenericRecords的原因是,运行中的Avro模式在运行时会有所不同。我们将模式描述写入一个单独的主题。我们知道向操作员/ kafka传递GenericRecords会降低性能,因此我们为GenericRecords编写了自己的Kafka序列化模式和Kryo​​序列化器。棘手的部分是我们的自定义序列化程序需要知道当前的模式列表是什么,以便它可以确定如何在消息通过图形时对消息进行序列化。

我一辈子都无法弄清楚如何以理智的方式将此信息传递给序列化器。我知道的方法是:

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

我知道这是一个复杂的情况,所以我希望它能清楚地遇到。我感到很沮丧,因为我认为没有一种解决方案是合适的。还有我没想到的其他选择吗?有没有更好的方法来管理动态的Avro模式集而无需重新启动?希望有任何建议!谢谢!

0 个答案:

没有答案