Confluent 源码学习 - SinkTask

本文解析了Kafka Connect中的SinkTask,它是负责接收Kafka数据并将其发送到外部系统的抽象类。讲解了SinkTask的生命周期、关键方法如put、flush和preCommit,以及分区管理和数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SinkTask 的源码实际位于Kafka项目中,主要用在 Kafka Connect 模块,它是一个接收 Kafka 数据,输出到外部系统的 Task 抽象类。其父类 Task 是个接口,只有三个方法:

public interface Task {
    /**
     * Get the version of this task. Usually this should be the same as the corresponding {@link Connector} class's version.
     *
     * @return the version, formatted as a String
     */
    String version();

    /**
     * Start the Task
     * @param props initial configuration
     */
    void start(Map<String, String> props);

    /**
     * Stop this task.
     */
    void stop();
}

简单明了,下面我们具体看下 SinkTask。

SinkTask is a Task that takes records loaded from Kafka and sends them to another system. Each task instance is assigned a set of partitions by the Connect framework and will handle all records received from those partitions. As records are fetched from Kafka, they will be passed to the sink task using the {@link #put(Collection)} API, which should either write them to the downstream system or batch them for later writing. Periodically, Connect will call {@link #flush(Map)} to ensure that batched records are actually pushed to the downstream system.

SinkTask是一个任务,它接收从Kafka加载的records,并将它们发送到另一个系统。Connect框架为每个 Task 实例分配一组分区,并将处理从这些分区收到的所有records。当从Kafka获取records时,它们将使用 `#put(Collection) ` API 把记录传递给 SinkTask,该API会将这些records写入下游系统或缓存下来(攒批)以供以后写出。Connect 框架会定期调用 `#flush(Map) `方法以确保攒批的records确实被推送到下游系统。

一个SinkTask的生命周期如下:

  1. 初始化:SinkTask 的初始化会调用两个方法。首先调用 `#initialize(SinkTaskContext)` 方法准备 task 的上下文(context),然后再调用 `#start(Map)` 接收配置,启动处理数据时用到的所有服务。
  2. 分区指派:初始化后,Connect 会通过 `#open(Collection)` 方法为每个task指派一组分区。这组分区只属于这个Task,直到 他们被`#close(Collection)` 方法关闭。
  3. 数据处理:一旦为写数据而打开了分区,Connect 将开始通过 `#put(Collection)` API  向Task传递数据。Connect 会周期性的使用 `#flush(Map)` 方法要求 task刷写数据。
  4. 分区再平衡:有时候,Connect 需要改该任务的分区分配。发生这种情况时,当前分配的分区将使用` #close(Collection)` API 关闭,新分配使用 `#open(Collection)`打开。
  5. 关闭:当task需要关闭时,Connect会关闭活动的分区(如果有的话),并使用`#stop()` 关闭task。

除了上面提到的7个方法外,SinkTask中还有 `#preCommit`(预提交) 以及另外两个过期方法:#onPartitionsAssigned 以及 #onPartitionsRevoked 两个方法,这两个方法已经分别被 open以及close取代。

public abstract class SinkTask implements Task {

    // 消费哪些 topic
    public static final String TOPICS_CONFIG = "topics";

    //  主题正则,用于过滤主题
    public static final String TOPICS_REGEX_CONFIG = "topics.regex";

    protected SinkTaskContext context;

    // 初始化,接收SinkTaskContext
    public void initialize(SinkTaskContext context) {
        this.context = context;
    }

    // 接收参数
    public abstract void start(Map<String, String> props);

    // 处理数据
    public abstract void put(Collection<SinkRecord> records);

    // 刷写数据
    public void flush(Map<TopicPartition, OffsetAndMetadata> currentOffsets) {
    }

    // commit之前的预提交
    public Map<TopicPartition, OffsetAndMetadata> preCommit(Map<TopicPartition, OffsetAndMetadata> currentOffsets) {
        flush(currentOffsets);
        return currentOffsets;
    }

    // 指派分区
    public void open(Collection<TopicPartition> partitions) {
        this.onPartitionsAssigned(partitions);
    }

    // 过期方法,作用同 open(Collection)
    @Deprecated
    public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
    }

    // 关闭分区
    public void close(Collection<TopicPartition> partitions) {
        this.onPartitionsRevoked(partitions);
    }

    // 过期方法 作用同 close(Collection)
    @Deprecated
    public void onPartitionsRevoked(Collection<TopicPartition> partitions) {
    }

    // 关闭 task
    @Override
    public abstract void stop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值