Flink自定义sink端SinkFunction的应用

本文介绍如何使用Apache Flink将数据从Kafka读取并写入MySQL。详细讲解了单条数据插入和批量数据插入的方法,并对比了它们在实际开发中的效率差异。

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

场景说明

从kafka里面读取数据,经过处理写入到mysql里面。在flink里面就是从source到sink的过程,那么本篇文章说明一下,mysqlsink的单条数据插入和批量数据插入操作。

1、先说明一下SinkFunction的继承关系

在这里插入图片描述
通过API我们可以看到sinkFunction接口的实现类有很多。比如常用的RichSinkFunction。

2、mysql单条数据插入

public class SinkToMysql extends RichSinkFunction<Tuple2<String, Integer>> {
public void invoke(Tuple2<String, Integer> value, Context context) throws Exception {
        conn = getConnection();
        String sql = "insert into dm_stu(stuname, stuaddr) values(?,?);";
        ps = this.conn.prepareStatement(sql);
        ps.setString(1, value.f0);
        ps.setString(2, value.f0 + "1");
//            ps.addBatch();
        int resultBatch = ps.executeUpdate();
        System.out.println("成功插入数据 " + resultBatch + "行");
        this.close();
    }
}	

上面的类实现RichSikFunction类,重写invoke方法,该方法用来执行与数据库的交互,插入数据 。该方法是上游有一条数据就会执行一次。实际开发的时候效率低。

3、MySQL 批量插入

当程序到sink的时候,我们可以把上游的数据先积攒一段时间,在按批一起发送到sink的下游。

public class SinkToMysqlBatch implements SinkFunction<ArrayList<String>> {
    PreparedStatement ps;
    Connection conn;

    @Override
    public void invoke(ArrayList<String> value, Context context) throws Exception {
        conn = SinkToMysql.getConnection();
        conn.setAutoCommit(false);
        String sql = "insert into dm_stu(stuname, stuaddr) values(?,?);";
        ps = this.conn.prepareStatement(sql);
        for (String s: value) {
            ps.setString(1, s);
            ps.setString(2,s+1);
            ps.addBatch();
        }
        int[] resultBatch = ps.executeBatch();
        System.out.println("当前窗口插入数据:" + resultBatch.length+ " 行");
        conn.commit();
        try {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}

上面的批量操作,自定义类实现了SinkFunction接口,重写了invoke方法。泛型是集合类型,表示上游传递过来的数据是一个集合。我们需要在invoke方法中去进行遍历。一个batch写入到mysql。

实际开发遇到的问题是

在这里插入图片描述
在这段代码中,addSink(中自定义的mysql批量类是继承了RichSinkFunction类,但是这边会报错说必须要实现了SinkFunction接口)。这边有疑问。

### 回答1: Flink自定义Sink和Source是指用户可以根据自己的需求,编写自己的数据源和数据输出方式。Flink提供了一些内置的Sink和Source,但是有时候用户需要根据自己的业务需求,自定义数据源和数据输出方式。 自定义Sink和Source需要实现Flink提供的接口,例如实现SinkFunction接口来自定义数据输出方式,实现SourceFunction接口来自定义数据源。用户可以根据自己的需求,实现这些接口,然后将自定义Sink和Source应用Flink程序中。 自定义Sink和Source可以帮助用户更好地满足自己的业务需求,提高数据处理的效率和准确性。 ### 回答2: Flink自定义Sink和Source方便开发人员根据特定业务需求定制化的数据输入和输出。这也是Flink作为DataStream处理引擎的一个强大特性。 自定义Sink的主要作用是将Flink处理的数据流输出到外部存储或处理系统中,如Kafka、Hadoop、Elasticsearch、MySQL等。通过自定义Sink,我们可以满足不同业务场景下,数据输出的不同需求。 自定义Sink的实现需要继承Flink提供的`RichSinkFunction`或者`SinkFunction`抽象类,并实现其抽象方法。`RichSinkFunction`中提供了一些状态管理的方法,如`open`、`close`等,我们可以在这些方法中添加额外的代码逻辑。自定义SinkFunction可以重写invoke方法,将不需要状态管理的代码集中在此方法中。 自定义Source的主要作用是将外部数据源中的数据读取并发送给Flink的DataStream处理模块。自定义Source可以读取各种类型的数据源,如Kafka、文件、Socket等。 自定义Source的实现需要继承Flink提供的`RichParallelSourceFunction`或者`SourceFunction`抽象类,并实现其抽象方法。`RichParallelSourceFunction`中支持在并行算子中运行,因此对于大规模数据的处理尤为适合。 在自定义Source中,需要实现一个`run`方法和一个`cancel`方法。`run`方法中是数据源处理逻辑的主要实现,`cancel`方法用于停止数据源的读取。我们还可以通过Flink提供的Checkpoint机制来管理数据源。 总之,自定义Sink和Source是Flink处理数据流的重要特性,使得开发人员可以根据业务需求灵活定制化的输入输出逻辑。 ### 回答3: Flink是一个开源流式处理框架,它提供了丰富的内置Sink和Source,同时也支持用户自定义Sink和Source,以便满足不同的业务需求。 自定义Sink可以用于将流式数据写入外部系统中,比如数据库、消息队列和文件系统等。Flink提供了一个简单的接口SinkFunction,通过实现该接口可以快速开发自己的SinkSinkFunction接口定义了一个抽象方法invoke(),该方法是在每个输入元素处理完成时被调用。开发者需要编写自己的业务逻辑,在invoke()中实现将数据写入目标系统的逻辑。 自定义Source可以用于从外部系统读取数据,并将其逐个交付给Flink程序进行处理。同样地,Flink也提供了一个简单的接口SourceFunction,通过实现该接口可以快速开发自己的Source。 SourceFunction接口定义了两个抽象方法:run()和cancel()。run()方法是在源自生命周期内调用的,它是源自执行主逻辑的地方。cancel()方法是用于清理资源的。开发者需要在run()方法中编写从外部系统读取数据的逻辑,并且能够异步地产生数据,最后将数据通过SourceContext将数据一条一条源源不断地输出。 自定义Sink和Source是Flink框架中非常常用的一个扩展方式,它可以满足用户自定义的需求,在具体的业务场景中,能够灵活的使用自定义Sink和Source对数据的处理进行个性化的定制化。同时,自定义Sink和Source的开发也相对简单,可以通过实现简单的接口,快速完成自定义Sink和Source的开发。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值