【发布时间】:2020-10-05 19:47:15
【问题描述】:
我正在使用 Flink 处理来自 Kafka 的流数据。流程非常基础,从 Kafka 消费,数据丰富,然后下沉到 FS。
在我的例子中,分区的数量大于 Flink 的并行度。我注意到 Flink 不会从所有分区均匀消耗。
偶尔会在一些 Kafka 分区中创建滞后。 重新启动应用程序有助于 Flink “重新平衡”消耗并快速关闭滞后。但是,一段时间后,我看到其他分区出现滞后等情况。
看到这种行为,我尝试按照 Flink 文档中的建议使用 rebalance() 重新平衡消耗率:
“分区元素循环,为每个分区创建相等的负载。对于存在数据倾斜的性能优化很有用。”
dataStream.rebalance();
代码更改很小,只需将 rebalance() 添加到数据流源即可。 使用 rebalance() 运行应用程序会导致 Flink 出现非常奇怪的行为:
我将并行度设置为260并提交了一个作业,但是由于某种原因,作业管理器将槽数乘以4。查看执行计划图,我意识到现在所有数据都被260个核心消耗了,然后它被发送到 3 个接收器(希望是均匀的)。由于资源不足,作业失败。
由于我想使用 260 个内核,我尝试再次提交作业,这次的并行度为 65 (=260/4)。 作业运行良好,但处理率低。在 Web UI 中,我发现槽的总数不等于可用任务槽 + 正在运行的任务。但是,如果我将 rtbJsonRequest(我提交的作业)称为具有 65 (=260/4) 个任务槽的作业,而不是它所写的 260,它等于。
长话短说,我正在尝试找到一种方法来平衡 Kafka 分区的消耗。根据 Flink 文档 rebalance() 是我需要的,但显然我用错了。
添加更多输入。主题有520个partition,并行度为260(每个core有2个partition)。
【问题讨论】:
-
分区本身是否平衡? IE。分区之间的数据如何拆分?
-
是的,分区的传入速率看起来正常且均匀。
标签: apache-flink flink-streaming