大纲
关注公众号【Code视角】即可获取上百本前沿技术电子书、2021最新面试资料,助力职场无忧。
需求来源
由于生产业务数据比较大,为了提升吞吐量,所以为kafka建立多分区。 但随之带来的问题是:某些数据存在时序问题,需要保证数据有序消费。 这个时候我们就想到自定义发送kafka分区,来保证分区数据的黏着。
定制开发Flink-kakfa
点击阅读官网
遇到这种需求第一反应去看官网中对于自定义分区器是否支持。 然后根据官网进行自定义开发。 官网【连接器参数】中【sink.partitioner】是明确支持的。参看下图,只需要实现【FlinkKafkaPartitioner 即可】。
编写代码 通过阅读官网发现只要实现【FlinkKafkaPartitioner】就可以,那么就开始编码
FlinkKafkaPartitioner源码
package org.apache.flink.streaming.connectors.kafka.partitioner;
import org.apache.flink.annotation.PublicEvolving;
import java.io.Serializable;
@PublicEvolving
public abstract class FlinkKafkaPartitioner<T> implements Serializable {
private static final long serialVersionUID = -9086719227828020494L;
/**
* 初始化的时候会调用的
* @param parallelInstanceId Flink 实例id
* @param flink 并行实例数
*/
public void open(int parallelInstanceId, int parallelInstances) {
// overwrite this method if needed.
}
/**
* 每次发送时进行调用,所以吞吐量大的时候,这块代码必须保持高效
*
* @param 数据 这里是FlinkSql 自己创建的数据体
* @param key
* @param value 实际发送的数据
* @param targetTopic 主题
* @param partitions 分区集合
* @return 目标分区
*/
public abstract int partition(
T record, byte[] key, byte[] value, String targetTopic, int[] partitions);
}
可以看到 我们只要实现partition()方法就行, 自定义自己的发送规则。
package com.xia.flink.base.partitioner;
import org.apache.flink.streaming.connectors.kafka.partitioner.FlinkKafkaPartitioner;
public class MyFlinkPartitioner<T> extends