【发布时间】: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 timeFlinkKafkaException: 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