Flink 1.13 消费 Kafka 写到 MySQL

1. 流程概述

在实现将 Kafka 消息写入 MySQL 的操作中,我们可以分为以下几个步骤:

  1. 创建 Flink 环境
  2. 设置 Kafka 数据源
  3. 数据转换和处理
  4. 创建 MySQL 数据汇
  5. 执行 Flink 作业

下面我们将详细介绍每个步骤需要做什么,并给出相应的代码示例。

2. 创建 Flink 环境

首先,我们需要创建一个 Flink 环境,这可以通过以下代码实现:

import org.apache.flink.api.java.ExecutionEnvironment;

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

3. 设置 Kafka 数据源

接下来,我们需要设置 Kafka 作为数据源,可以使用 Flink 提供的 flink-connector-kafka 库来实现。需要添加 Maven 依赖:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka_2.11</artifactId>
    <version>1.13.0</version>
</dependency>

然后,我们可以通过以下代码配置 Kafka 数据源:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "flink-consumer");

String topic = "your-topic-name";
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), properties);

DataStream<String> stream = env.addSource(consumer);

4. 数据转换和处理

在这一步,我们可以对接收到的 Kafka 消息进行相应的转换和处理操作。例如,我们可以将接收到的消息转换为 JSON 对象,然后从中提取需要的字段。代码示例如下:

import org.apache.flink.streaming.api.functions.ProcessFunction;
import org.apache.flink.util.Collector;

stream.process(new ProcessFunction<String, YourDataType>() {
    @Override
    public void processElement(String value, Context ctx, Collector<YourDataType> out) {
        // 将接收到的消息转换为 JSON 对象
        JSONObject jsonObject = new JSONObject(value);
        
        // 从 JSON 对象中提取需要的字段
        String field1 = jsonObject.getString("field1");
        int field2 = jsonObject.getInt("field2");

        // 创建 YourDataType 对象并发送给下游
        out.collect(new YourDataType(field1, field2));
    }
});

5. 创建 MySQL 数据汇

接下来,我们需要将处理后的数据写入 MySQL 数据库中。可以使用 Flink 提供的 flink-connector-jdbc 库来实现。需要添加 Maven 依赖:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-jdbc_2.11</artifactId>
    <version>1.13.0</version>
</dependency>

然后,我们可以通过以下代码创建一个 MySQL 数据汇:

import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.streaming.api.functions.sink.SinkFunction.Context;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;

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

stream.addSink(new RichSinkFunction<YourDataType>() {
    private Connection connection;
    private PreparedStatement preparedStatement;

    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);

        // 创建 MySQL 连接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/your-database", "your-username", "your-password");

        // 创建预处理语句
        preparedStatement = connection.prepareStatement("INSERT INTO your-table (field1, field2) VALUES (?, ?)");
    }

    @Override
    public void invoke(YourDataType value, Context context) throws Exception {
        // 设置预处理语句的参数
        preparedStatement.setString(1, value.getField1());
        preparedStatement.setInt(2, value.getField2());

        // 执行预处理语句
        preparedStatement.executeUpdate();
    }

    @Override
    public void close() throws Exception {
        super.close();

        // 关闭连接和预处理语句
        if (preparedStatement != null) {
            preparedStatement.close();
        }
        if (connection != null) {
            connection.close();
        }
    }
});

6. 执行 Flink 作业

最后,我们需要执行 Flink 作业,将整个流程串联起来。可以使用以下代码启动作业: