Flink Sink Kafka 自定义Topic与自定义分区
需求背景:
Flink处理完成数据后,需要将消息传给Kafka,为了避免数据倾斜,根据消息的主键进行Hash取模,自定义输出到对应的Topic,为了提升从Kafka读取消息的速度,将相同主键的消息存放到同一分区。
解决方案:
Flink-Kafka连接器中有一个可以传递序列化类和分区器的构造方法,我们可以重写这两个方法实现自定义Topic和自定义分区,具体方法如下:
@Deprecated
public FlinkKafkaProducer010(
String topicId, //Topic名称
SerializationSchema<T> serializationSchema, //序列化类
Properties producerConfig, //kafka producer的属性
KafkaPartitioner<T> customPartitioner //自定义分区器
) {
this(topicId, new KeyedSerializationSchemaWrapper<>(serializationSchema), producerConfig, customPartitioner);
}
-
数据准备
主键
在消息字段中的下标- 自定义的Topic列表
-
代码实现
-
自定义序列化
- 实现KeyedSerializationSchema接口
- 构造传参的构造函数
- 重写serializeKey方法、serializeValue方法和getTargetTopic方法
public class MySchema implements KeyedSerializationSchema<String> { int primaryKeyIndex ;
-