Flink 1.13 消费 Kafka 写到 MySQL
1. 流程概述
在实现将 Kafka 消息写入 MySQL 的操作中,我们可以分为以下几个步骤:
- 创建 Flink 环境
- 设置 Kafka 数据源
- 数据转换和处理
- 创建 MySQL 数据汇
- 执行 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 作业,将整个流程串联起来。可以使用以下代码启动作业: