【flink】之sink到mysql

一、概述

本文介绍了如何使用Apache Flink从Kafka接收数据流,并将处理后的数据写入MySQL数据库。Apache Flink是一个开源的流处理框架,支持高吞吐量的数据处理,并且具备低延迟的特性。本文将详细讲解如何通过Flink连接Kafka和MySQL,以及实现数据流的接收和写入。

二、环境准备
  1. Flink环境:确保已经安装并配置好Apache Flink。
  2. Kafka环境:确保Kafka已经安装并运行,且有一个可用的topic。
  3. MySQL环境:确保MySQL数据库已经安装并运行,且有一个可用的数据库和表。
三、依赖配置

在Flink项目中,需要引入以下依赖:

  • Flink的核心依赖
  • Flink的Table API依赖
  • Kafka连接器依赖
  • JDBC连接器依赖
  • MySQL的JDBC驱动依赖

Maven依赖配置示例如下:

<dependencies>  
    <!-- Flink核心依赖 -->  
    <dependency>  
        <groupId>org.apache.flink</groupId>  
        <artifactId>flink-streaming-java_2.12</artifactId>  
        <version>1.19.0</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.flink</groupId>  
        <artifactId>flink-table-api-java-bridge_2.12</artifactId>  
        <version>1.19.0</version>  
    </dependency>  
    <!-- Kafka连接器依赖 -->  
    <dependency>  
        <groupId>org.apache.flink</groupId>  
        <artifactId>flink-connector-kafka_2.12</artifactId>  
        <version>1.19.0</version>  
    </dependency>  
    <!-- JDBC连接器依赖 -->  
    <dependency>  
        <groupId>org.apache.flink</groupId>  
        <artifactId>flink-connector-jdbc_2.12</artifactId>  
        <version>1.19.0</version>  
    </dependency>  
    <!-- MySQL JDBC驱动依赖 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>8.0.22</version>  
    </dependency>  
</dependencies>
四、Flink作业实现
package com.iterge.flink.job;


import com.alibaba.fastjson2.JSONObject;
import com.iterge.flink.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @author iterge
 * @version 1.0
 * @date 2024/10/29 17:15
 * @description mysql示例
 */

@Slf4j
public class FlinkMysqlDemo {
    private static final String sql = "insert into t_user(name) values(?)";
    private static Connection connection;
    private static PreparedStatement preparedStatement;

    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        KafkaSource<String> source = KafkaSource.<String>builder()
                .setBootstrapServers("localhost:9092")
                .setTopics("it.erge.test.topic")
                .setGroupId("it.erge.test.topic.1")
                .setStartingOffsets(OffsetsInitializer.latest())
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .build();
        DataStreamSource<String> stringDataStreamSource = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");

        DataStream<User> map = stringDataStreamSource.map(x -> {
            User user = new User();
            user.setName(x);
            System.out.println(JSONObject.toJSONString(user));
            return user;
        });
        map.addSink(new RichSinkFunction<User>() {
            @Override
            public void invoke(User value, Context context) throws Exception {
                super.invoke(value, context);
                try {
                    // 设置 PreparedStatement 的参数
                    //preparedStatement.setInt(1, value.getId());
                    preparedStatement.setString(1, value.getName());
                    // 执行插入操作
                    preparedStatement.executeUpdate();
                } catch (SQLException e) {
                    // 处理 SQL 异常,例如记录日志或抛出运行时异常
                    System.err.println("Failed to insert data into the database: " + e.getMessage());
                    // 可以选择重新抛出异常以停止作业,或者记录并忽略它
                    // throw new RuntimeException("Database write failed", e);
                }
            }

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                // 初始化数据库连接和 PreparedStatement
                String url = "jdbc:mysql://localhost:3306/test";
                String user = "root";
                //String password = "mypassword";
                connection = DriverManager.getConnection(url, user,null);
                preparedStatement = connection.prepareStatement(sql);
            }

            @Override
            public void close() throws Exception {
                super.close();
                // 关闭 PreparedStatement 和 Connection
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }
        });
        map.print();
        env.execute("mysql-demo");
    }
}
五、总结

本文详细介绍了如何使用Apache Flink从Kafka接收数据流,并将处理后的数据写入MySQL数据库。通过配置依赖、创建Flink执行环境、定义Kafka和MySQL表、编写插入语句等步骤,成功实现了数据的接收和写入。在实际应用中,可以根据具体需求对代码进行调整和优化。

### 回答1: Apache Flink 是一个分布式计算框架,可以用于实时流处理和批处理。Flink 提供了许多内置的 Sink,其中包括将数据写入 MySQL 数据库的 Sink。下面是使用 Flink 将数据写入 MySQL 的示例代码: ```java DataStream<Tuple2<String, Integer>> dataStream = ...; // 从某个地方获取数据流 // 将数据写入 MySQL dataStream.addSink(new JdbcSink<>(getConnection(), // 获取数据库连接 "INSERT INTO my_table (name, count) VALUES (?, ?)", // 插入语句 new JdbcStatementBuilder<Tuple2<String, Integer>>() { // 用于构建 PreparedStatement 的类 @Override public void accept(PreparedStatement preparedStatement, Tuple2<String, Integer> t) throws SQLException { // 设置参数 preparedStatement.setString(1, t.f0); preparedStatement.setInt(2, t.f1); } })); ``` 在上面的代码中,我们使用了 Flink 提供的 JdbcSink,将数据流中的 Tuple2<String, Integer> 类型的数据写入 MySQL 数据库。我们需要提供数据库连接、插入语句和用于构建 PreparedStatement 的类。在 accept 方法中,我们设置了 PreparedStatement 的参数,将数据写入数据库。 需要注意的是,我们需要在项目中添加 MySQL JDBC 驱动程序的依赖,以便在代码中使用。 ### 回答2: flink是一个用于数据流处理和批处理的开源框架,而MySQL是一个流行的关系型数据库管理系统。在flink中,可以使用sink来将数据流或批处理结果输出到MySQL中。 要实现flink sinkMySQL,首先需要创建一个StreamingExecutionEnvironment或ExecutionEnvironment对象,然后根据需要定义数据源和转换操作。接下来,通过定义一个JDBCOutputFormat,将转换后的数据流或批处理结果写入MySQL数据库。JDBCOutputFormat是flink提供的用于将数据写入关系型数据库的输出格式。 在JDBCOutputFormat的构造函数中,需要提供MySQL数据库的连接信息,例如URL、用户名和密码。然后,可以使用writeRecord方法将转换后的数据写入MySQL数据库。在写入数据之前,还可以使用setBatchInterval方法设置批量提交的间隔时间,以减少数据库的压力。 除了使用JDBCOutputFormat,还可以使用flink提供的Table API或SQL API来将数据写入MySQL。通过将MySQL作为一个外部系统注册到flink中,并定义一个INSERT INTO语句,可以直接将数据流或批处理结果插入到MySQL表中。 总之,flink可以通过使用JDBCOutputFormat、Table API或SQL API来将数据流或批处理结果输出到MySQL数据库中。这样可以方便地将flink处理的数据持久化到关系型数据库中,以供后续的分析和应用程序使用。 ### 回答3: Flink是一种开源的流式处理引擎,可以用来实现实时数据流处理。而MySQL是一个关系型数据库管理系统,它可以用来存储和管理结构化数据。 在Flink中,可以使用JDBC Sink将数据流输出到MySQL数据库中。首先,我们需要在Flink的配置文件中添加相应的依赖,以便能够与MySQL进行连接。 接下来,我们需要创建一个自定义的Sink函数,用来将数据流写入MySQL数据库。这个Sink函数需要继承自RichSinkFunction类,并实现其invoke方法。在invoke方法中,我们可以通过JDBC连接将数据写入MySQL数据库。 在Sink函数中,我们需要在open方法中获取MySQL数据库的连接,并在invoke方法中执行插入操作。同时,我们还可以在Sink函数中实现其他的数据处理逻辑,比如数据转换、筛选等。 最后,我们将Sink函数与Flink的DataStream进行关联,即可将数据流输出到MySQL数据库中。在使用Flink的execute方法执行任务时,数据流会经过Sink函数,并将结果写入MySQL数据库。 总结来说,Flink可以通过JDBC Sink将数据流输出到MySQL数据库中,我们只需要编写相应的Sink函数,并将其与DataStream关联起来即可实现。 需要注意的是,在使用Flink Sink写入MySQL数据库时,要确保数据库连接的可靠性和性能。可以考虑使用连接池来管理数据库连接,以提高系统的稳定性和吞吐量。同时,还要注意处理可能出现的异常情况,比如数据写入失败等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空、大师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值