【问题标题】:Flink Kafka producer throws exceptions when publishing a keyed streamFlink Kafka 生产者在发布键控流时抛出异常
【发布时间】:2019-10-11 18:28:04
【问题描述】:

我在将密钥流从接收器子任务写入输出 kafka 主题时遇到问题。

作业的形式为:source -> filter -> keyby(id) -> flatmap -> sink

异常来自 kafka 生产者并导致检查点超时:

  • FlinkKafkaException: Failed to send data to Kafka: Failed to allocate memory within the configured max blocking time

  • FlinkKafkaException: Failed to send data to Kafka: Expiring 16 record(s) for mytopic-11:120000 ms has passed since batch creation

除了上述异常,作业进入崩溃循环,偶尔会在再次崩溃循环之前暂时恢复。我相信这里的问题是我正在使用键来确定输出分区,这导致 P sink 子任务将每个扇出写入 N 个输出分区。理想情况下,每个子任务只会写入单个分区。

作业具有以下约束/属性:

1:一旦一个key被写入一个输出的kafka topic partition,以后需要一直写入同一个kafka partition

2:sink 子任务的并行度最初将等于输出分区的数量

3:我以后应该可以在不违反#1的情况下增加并行度

4:我永远不会在输出的 kafka 主题中添加新分区

如果parallelism == partitions,那么我相信 FlinkFixedPartitioner 会是一个很好的解决方案。但是,如果我以后增加并行性,我认为它不会尊重原始键->分区映射,因为它使用此方案选择输出分区。

我可以在这里使用一种技术来满足这些限制吗?可能是对 kafka 生产者的设置进行调整,另一种分区键控流的方法,还是其他什么?

【问题讨论】:

    标签: apache-flink


    【解决方案1】:

    您假设 Flink 使用的分区逻辑与 Kafka 使用的分区逻辑相同。给定 4 个键 A、B、C 和 D,Flink 将 A 和 B 发送到一个接收器实例,而 C 和 D 将发送到另一个接收器实例,这是完全有可能的(这就是我怀疑正在发生的事情)。然后,Kafka 可能使用了不同的分区逻辑,将 A 和 C 发送到一个分区,而 B 和 D 写入另一个分区。

    Flink 似乎不想公开给定 key 的 key group,但如果你对 sink 的并行度与 Kafka 分区的数量相同,那么你应该可以使用 sink 实例的 task_id在自定义 Kafka 分区逻辑中。这有点蛮力,但它应该做你想做的事。

    我想多了,您还可以为 Flink 编写一个自定义分区器,它使用与您的 Kafka 主题的自定义分区器相同的逻辑。这将处理扩展到更多接收器实例。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 2016-09-30
      • 2021-06-18
      • 1970-01-01
      • 2018-11-16
      • 2020-08-22
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多