Flink 1.14.* 版本kafkaSink源码

通过Flink 1.14.*版本kafkaSource源码,了解了kafkaSource的源码,这里一起看一下kafkaSink的源码,

一、如何把sink加入到Flink中

首先先找一个类继承FlinkKafkaProducerBase这个抽象类,之后加入到dataStream中就可以了

如下:

java 复制代码
DataStream<Tuple2<String, Integer>> dataStream = source的数据
dataStream..addSink(继承了FlinkKafkaProducerBase的实现类)

二、FlinkKafkaProducerBase的源码

java 复制代码
@Internal
public abstract class FlinkKafkaProducerBase<IN> extends RichSinkFunction<IN> implements CheckpointedFunction {
    public FlinkKafkaProducerBase(String defaultTopicId, KeyedSerializationSchema<IN> serializationSchema, Properties producerConfig, FlinkKafkaPartitioner<IN> customPartitioner) {
        //省略
    }
    //这个是关键,这个是发送的执行逻辑
    public void invoke(IN next, Context context) throws Exception {
        byte[] serializedKey = this.schema.serializeKey(next);
        byte[] serializedValue = this.schema.serializeValue(next);
        String targetTopic = this.schema.getTargetTopic(next);

        if (this.flinkKafkaPartitioner == null) {
            record = new ProducerRecord(targetTopic, serializedKey, serializedValue);
        } else {
            record = new ProducerRecord(targetTopic, this.flinkKafkaPartitioner.partition(next, serializedKey, serializedValue, targetTopic, partitions), serializedKey, serializedValue);
        }

        this.producer.send(record, this.callback);
    }    
}    

其中invoke是父类RichSinkFunction实现的接口SinkFunction中的方法

三、调用SinkFunction的invoke的地方

java 复制代码
@Public
public class DataStream<T> {
    public DataStreamSink<T> addSink(SinkFunction<T> sinkFunction) {
        this.transformation.getOutputType();
        if (sinkFunction instanceof InputTypeConfigurable) {
            ((InputTypeConfigurable)sinkFunction).setInputType(this.getType(), this.getExecutionConfig());
        }
        //这个生成sink算子
        StreamSink<T> sinkOperator = new StreamSink((SinkFunction)this.clean(sinkFunction));
        DataStreamSink<T> sink = new DataStreamSink(this, sinkOperator);
        this.getExecutionEnvironment().addOperator(sink.getLegacyTransformation());
        return sink;
    }

} 

和kafkaSource一样,会把sinkFunction赋值给AbstractUdfStreamOperator的userFunction字段

java 复制代码
public class StreamSink<IN> extends AbstractUdfStreamOperator<Object, SinkFunction<IN>> implements OneInputStreamOperator<IN, Object> {
    public StreamSink(SinkFunction<IN> sinkFunction) {
        super(sinkFunction);
        this.chainingStrategy = ChainingStrategy.ALWAYS;
    }
    public void processElement(StreamRecord<IN> element) throws Exception {
        this.sinkContext.element = element;
        ((SinkFunction)this.userFunction).invoke(element.getValue(), this.sinkContext);
    }
}
java 复制代码
@PublicEvolving
public abstract class AbstractUdfStreamOperator<OUT, F extends Function> extends AbstractStreamOperator<OUT> implements OutputTypeConfigurable<OUT> {
    private static final long serialVersionUID = 1L;
    protected final F userFunction;

    public AbstractUdfStreamOperator(F userFunction) {
        this.userFunction = (Function)Objects.requireNonNull(userFunction);
        this.checkUdfCheckpointingPreconditions();
    }
}

这里StreamSink也是实现了implements OneInputStreamOperator接口,等Flink运行时调用StreamSink的processElement方法触发实现类的invoke方法,

下面是FlinkKafkaProducerBase类关系图

相关推荐
阿里云大数据AI技术1 天前
阿里云Flink + Fluss年度发布:Streaming Agent 与湖流一体
人工智能·flink·agent
用户3610588626123 天前
Flink Dispatcher启动流程源码深度剖析:从ClusterEntrypoint到JobMaster启动的完整链路
大数据·flink
用户3610588626124 天前
Flink ApplicationMaster启动流程源码深度剖析:从YARN提交到JobMaster启动的完整链路
大数据·flink
智码看视界4 天前
技术选型指南:Kafka Streams vs Flink:流处理框架选型实战对比与性能压测
flink·实时计算·状态管理·流处理·大数据架构·kafkastreams·流处理选型
用户3610588626125 天前
Flink 配置深度剖析:从配置加载到参数调优的完整指南
大数据·flink
Irene19916 天前
Flink 学习日志 01:前端转大数据的实战避坑指南
java·jvm·flink
Gl�ria7 天前
Flink Yarn-Session Job 相关常用脚本
flink
Norris Huang7 天前
Kafka Connect 与 Flink CDC 写入 Iceberg:Upsert 的代价,以及 S3 Tables 的真正价值
分布式·flink·kafka
用户3610588626128 天前
Flink 优化之 CheckPoint 优化及参数详解:从原理到生产环境调优的完整指南
大数据·flink
用户3610588626129 天前
Flink SQL 之 Flink SQL 企业级案例分析:从实时大屏到用户画像与风控告警的生产实践
大数据·flink