Flink-SQL upset-Kafka自定义分区器

本文介绍了在Flink中针对Kafka数据有序消费的需求,如何进行自定义Flink-Kafka分区器的开发,以及面对需求变更时,如何二次定制开发适用于Upsert-Kafka的解决方案,包括SPI注册和工厂类扩展。
摘要由CSDN通过智能技术生成
大纲

在这里插入图片描述
关注公众号【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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值