Flink Kafka Patition 分配问题

当Flink消费多个Topic的时候,由于分配算法是针对单个Topic的分区数,因此在对多个Topic进行分配的时候会造成重复分配,就会有几个subtask处于空闲当中,造成subtask数据倾斜

相关的类

FlinkKafkaConsumerBase

FlinkKafkaConsumer

AbstractPartitionDiscoverer

KafkaPartitionDiscoverer

KafkaTopicPartitionAssigner

源码位置

FlinkKafkaConsumerBase的open方法

        subscribedPartitionsToStartOffsets = new HashMap<>();
        final List<KafkaTopicPartition> allPartitions = partitionDiscoverer.discoverPartitions();

discoverPartitions

                List<KafkaTopicPartition> newDiscoveredPartitions;
newDiscoveredPartitions =
                            getAllPartitionsForTopics(topicsDescriptor.getFixedTopics());
                            

getAllPartitionsForTopics

    for (String topic : topics) {
                final List<PartitionInfo> kafkaPartitions = kafkaConsumer.partitionsFor(topic);
                System.out.println("getAllPartitionsForTopics=" + kafkaPartitions);

                if (kafkaPartitions == null) {
                    throw new RuntimeException(
                            String.format(
                                    "Could not fetch partitions for %s. Make sure that the topic exists.",
                                    topic));
                }

                for (PartitionInfo partitionInfo : kafkaPartitions) {
                    partitions.add(
                            new KafkaTopicPartition(
                                    partitionInfo.topic(), partitionInfo.partition()));
                }
            }

还在discoverPartitions中

 if (newDiscoveredPartitions == null || newDiscoveredPartitions.isEmpty()) {
                    throw new RuntimeException(
                            "Unable to retrieve any partitions with KafkaTopicsDescriptor: "
                                    + topicsDescriptor);
                } else {
                    Iterator<KafkaTopicPartition> iter = newDiscoveredPartitions.iterator();
                    KafkaTopicPartition nextPartition;
                    while (iter.hasNext()) {
                        nextPartition = iter.next();
                        if (!setAndCheckDiscoveredPartition(nextPartition)) {
                            iter.remove();
                        }
                    }
                }

setAndCheckDiscoveredPartition

    public boolean setAndCheckDiscoveredPartition(KafkaTopicPartition partition) {
        if (isUndiscoveredPartition(partition)) {
            discoveredPartitions.add(partition);

            return KafkaTopicPartitionAssigner.assign(partition, numParallelSubtasks)
                    == indexOfThisSubtask;
        }

        return false;
    }

分配的算法在KafkaTopicPartitionAssigner

    public static int assign(KafkaTopicPartition partition, int numParallelSubtasks) {
        int startIndex =
                ((partition.getTopic().hashCode() * 31) & 0x7FFFFFFF) % numParallelSubtasks;
                
        // here, the assumption is that the id of Kafka partitions are always ascending
        // starting from 0, and therefore can be used directly as the offset clockwise from the
        // start index
        return (startIndex + partition.getPartition()) % numParallelSubtasks;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink中,设置Flink Kafka的并行度取决于所消费的Kafka主题的分区数。如果只消费一个主题,则可以将并行度设置为主题的分区数。例如,如果一个主题有4个分区,你可以将并行度设置为4。这样每个Flink任务将消费一个分区。 如果要消费多个主题,可以选择两种方式来设置并行度。第一种方式是将并行度设置为所有主题分区数的总和。比如,如果有两个主题,一个主题有4个分区,另一个主题有6个分区,那么可以将并行度设置为10。这样每个Flink任务将消费多个主题的分区。 另一种方式是使用Robin的方式将数据以round-robin的方式写入不同的Kafka分区。使用这种方式时,可以不用设置sink的并行度。Flink会自动将数据以round-robin的方式写入所有Kafka分区。 综上所述,Flink Kafka的并行度设置与所消费的Kafka主题的分区数有关。根据需要选择合适的并行度设置方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [flink kafka 消费以及生产并行度设置](https://blog.csdn.net/longlovefilm/article/details/117400809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【Flink实战系列】Flink 消费 kafka 并行度设置多少合理(kafkapartitionFlinksubtask 对应关系...](https://blog.csdn.net/xianpanjia4616/article/details/108983357)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值