Flink1.11 只写到kafka的第一个分区

Flink1.11.1采用以下代码出现Flink写到kafka第一个分区的现象:

speStream.addSink(new FlinkKafkaProducer(kafkaTopicName, new KafkaProducerSchema(), props, Optional.of(new FlinkFixedPartitioner())));

结论&解决方法:是1.11.1的bug,已在1.11.2中修复,可升级至1.11.2解决。或者传入空的partitioner,如果自定义的paritioner为空,则采用轮询(round-robin)的方式:

 
speStream.addSink(new FlinkKafkaProducer(kafkaTopicName,new SimpleStringSchema(), props), Optional.empty());

speStream.addSink(new FlinkKafkaProducer(kafkaTopicName,new SimpleStringSchema(), props), Optional.ofNullable(null));

Optitional.ofNullable(null) 其实是调用了emoty()方法,返回了空实例,跟上面的Option.empty()一个道理

 

 

出现原因:调用了以下的构造函数:

步骤1、进入FlinkKafkaProducer(注意:咱们上面传入的第二个参数new KafkaProducerSchema()是kafkaSchema。不是keyedSchema)

 

 

步骤2、继续进入上面调用的this,可以看到下图中this中的第四个参数,new KafkaSerializationSchemaWrapper:

 

步骤3、继续进入步骤2中的this函数,由于我们传入的kafkaSchema是new KafkaSerializationSchemaWrapper,不为null,所以执行红框中的代码。它将FlinkKafkaPartitioner置为null,之前在1中传入FlinkFixedPartitioner是不是就没用?那还传这个参数干啥?(肯定是哪里用到了))


 

 

步骤4、上面构造函数走完了,我们看下invoke()函数(invoke函数用于将给定值写入接收器。 每个记录都会调用此函数)。在invoke中,kafkaSchema不为null,但是还需要确认的是KafkaSerializationSchemaWrapper是不是KafkaContextAware的instance呢。所以再去步骤2中看看我们传入的KafkaSerializationSchemaWrapper这个包装类吧~

 

5、KafkaSerializationSchemaWrapper:如下图,可以看到KafkaSerializationSchemaWrapper是KafkaContextAware的instance,所以在上面的步骤4中,执行了红框中的代码。那我们是怎么分区的呢,再具体看下在KafkaSerializationSchemaWrapper中,我们传入的第二个参数是FlinkFixedPartitioner这个分区器,看下FlinkFixedPartitioner是怎么分区的吧~

 

6、FlinkFixedPartitioner,可以看到在FlinkFixedPartitioner中的open方法中调用了this.parallelInstanceId = parallelInstanceI,而这个open方法并没有在KafkaSerializationSchemaWrapper中被调用。所以 this.parallelInstanceId默认为0,

在步骤5中的图中,67行代码partitioner.partition实际调用的FlinkFixedPartitioner种的partitioner方法,return partitions[parallelInstanceId % partitions.length]; 因为parallelInstanceId为0所以全部都写到kafka的第一个分区了。造成这个的原因是FlinkFixedPartitioner中的open方法没有被调用,如果调用了是不是就可以了?可以看下1.11.2中的KafkaSerializationSchemaWrapper类

 

 

7、1.11.2中的KafkaSerializationSchemaWrapper,下图红框中,果然调用了partitioner.open()!搜了下,确实是bug

https://issues.apache.org/jira/browse/FLINK-19285?jql=project%20%3D%20FLINK%20AND%20text%20~%20%22kafka%20partitioner%22

 

 

 


 

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Apache Flink来读取Kafka消息并将其Kafka。以下是基本的代码示例: 首先,您需要在项目中添加FlinkKafka的依赖包。这里假设您已经设置好了Maven项目。 ```xml <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.12</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.12</artifactId> <version>${flink.version}</version> </dependency> </dependencies> ``` 确保`${flink.version}`是您要使用的Flink版本。 接下来,您可以使用以下代码片段来实现从Kafka读取消息并将其Kafka: ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; import org.apache.flink.streaming.util.serialization.SimpleStringSchema; import java.util.Properties; public class FlinkKafkaExample { public static void main(String[] args) throws Exception { // 设置执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 设置Kafka消费者的配置 Properties consumerProps = new Properties(); consumerProps.setProperty("bootstrap.servers", "localhost:9092"); consumerProps.setProperty("group.id", "flink-consumer"); // 从Kafka读取消息 FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("input-topic", new SimpleStringSchema(), consumerProps); DataStream<String> inputDataStream = env.addSource(kafkaConsumer); // 设置Kafka生产者的配置 Properties producerProps = new Properties(); producerProps.setProperty("bootstrap.servers", "localhost:9092"); // 将消息Kafka FlinkKafkaProducer<String> kafkaProducer = new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), producerProps); inputDataStream.addSink(kafkaProducer); // 执行任务 env.execute("Flink Kafka Example"); } } ``` 请注意,上述代码中的`input-topic`和`output-topic`需要替换为您实际使用的Kafka主题名称。您还可以根据需要调整其他KafkaFlink配置。 希望这能帮助您开始在Flink中读取Kafka消息并将其Kafka。如有任何问题,请随提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值