Flink kafka 数据汇不指定分区器导致的问题

背景

在flink中,我们经常使用kafka作为flink的数据汇,也就是目标数据的存储地,然而当我们使用FlinkKafkaProducer作为数据汇连接器时,我们需要注意一些注意事项,本文就来记录一下

使用kafka数据汇连接器

首先我们看一下常用的使用的情况:

    public FlinkKafkaProducer(
            String topicId,
            SerializationSchema<IN> serializationSchema,
            Properties producerConfig) {
        this(
                topicId,
                serializationSchema,
                producerConfig,
                //不指定分区器时,kafka默认使用FlinkFixedPartitioner分区器
                Optional.of(new FlinkFixedPartitioner<>()));
    }

可以看到在不指定分区器时,kafka默认使用FlinkFixedPartitioner作为分区器,我们查看一下FlinkFixedPartitioner的分区逻辑:

    public int partition(T record, byte[] key, byte[] value, String targetTopic, int[] partitions) {
        Preconditions.checkArgument(
                partitions != null && partitions.length > 0,
                "Partitions of the target topic is empty.");
		// 根据算子的任务索引号进行求余
        return partitions[parallelInstanceId % partitions.length];
    }

可以看到,同一个算子任务的记录都只会发送到同一个kafka分区上,当分区数大于算子任务数时,可以确定的是有一些分区是没有记录的,那你可能会问,有些分区没有记录有什么问题?

你可能感兴趣的:(flink,大数据,flink,kafka,大数据)