【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依赖配置示例如下:

XML 复制代码
<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作业实现
java 复制代码
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表、编写插入语句等步骤,成功实现了数据的接收和写入。在实际应用中,可以根据具体需求对代码进行调整和优化。

相关推荐
大金SEO13 分钟前
GEO启动的正确顺序:先做信源清理,再谈内容扩张
大数据·人工智能
醉颜凉42 分钟前
KingbaseES日期格式化:MySQL date_format函数的迁移指南
mysql·date_format·kingbasees·数据库兼容·函数迁移
醉颜凉44 分钟前
MySQL 8 忘记 root 密码?这两种方法帮你轻松解决
数据库·mysql·adb
刃神太酷啦1 小时前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
IT毕设实战小研1 小时前
基于安卓的空气质量查询系统
android·大数据·vue.js·爬虫·python·django·课程设计
Capricorn19881 小时前
个人知识库接入大模型频现“幻觉引用”?排查 RAG 溯源失效问题,解析知芽构建可信第三大脑的底层架构
大数据·论文阅读·人工智能·笔记·架构·论文笔记
DeepAgent1 小时前
AI Agent 工程实践(35):我的 AI Engineering OS 最终架构
大数据·人工智能·agent
xxwl5852 小时前
MySQL 基础学习笔记
数据库·mysql
Rain的Java大神之路2 小时前
PC版网站被狂刷怎么处理
java·数据库·redis·后端·mysql·web安全·运维开发
whcyhhh2 小时前
头歌实践教学平台:数据科学与大数据技术导论(十六)
大数据·开发语言·python