Flink 读取 Kafka 消息并批量写入到 MySQL实例

该博客实例演示了如何利用Flink从Kafka消费消息,然后将数据批量写入MySQL的过程。通过设置一分钟窗口进行数据聚合,适用于对实时性要求不高的场景,能有效提升批量写入的性能。

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

前言说明

环境搭建可参考 《kafka+flink集成实例》
本实例主要实现功能如下:
模拟消息生成->Kafka->Flink->Mysql
其中Flink做数据流收集并定时批量写入到Mysql
在某些应用场景里面可能会用到

环境依赖

本例使用Intellij IDEA作为项目开发的IDE。
首先创建Maven project,group为’com.zuoan’,artifact id为‘flink-kafka-mysql’,version为‘1.0-SNAPSHOT’。整个项目结构如图所示:
在这里插入图片描述
POM文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zuoan</groupId>
    <artifactId>flink-kafka-mysql</artifactId>
    <version>1.0-SNAPSHOT</version>
    <description>flink+kafka+mysql实例</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka-0.11_2.11</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.6.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
在Python中,我们可以使用Apache Flink与Apache Kafka集成,读取Kafka主题的数据,然后将这些数据流式地写入MySQL数据库。以下是一个基本的步骤指南: 1. **安装依赖库**: - Apache Flink:可以使用pip安装`apache-beam[flink]`(如果Flink SDK已包含) - Kafka Python客户端 (`confluent-kafka-python`) - MySQL连接库 (`pymysql`) ```bash pip install apache-beam[flink] confluent-kafka-python mysql-connector-python ``` 2. **创建Flink环境**: 首先,需要创建一个`DAGRunner`实例,指定运行模式(本地、YARN等)。 ```python from apache_beam.runners import FlinkRunner runner = FlinkRunner() pipeline = ... ``` 3. **设置Kafka消费者**: 使用`io.ReadFromKafka`从Kafka读取数据,配置相应的brokers地址和topic名。 ```python from apache_beam.io.kafka import ReadFromKafka consumer_config = { 'bootstrap.servers': 'localhost:9092', # 替换为你实际的Kafka集群地址 'group.id': 'your_group_id', } kafka_source = ReadFromKafka(consumer_config, topics=['your_topic']) ``` 4. **处理数据**: 这里假设你的数据是字典类型,需要转换成MySQL表结构。例如,你可以使用`beam.Map`对每个元素进行处理。 ```python def process_element(element): # 将Kafka消息转换成MySQL插入所需的格式 transformed_data = {...} return transformed_data transformed_data = kafka_source | 'Process elements' >> beam.Map(process_element) ``` 5. **写入MySQL**: 使用`beam.io.WriteToDatabase`将处理后的数据写入MySQL。你需要提供数据库连接信息和SQL插入语句。 ```python from apache_beam.io.jdbc import WriteToDatabase jdbc_sink_config = { 'url': 'jdbc:mysql://localhost:3306/your_database?useSSL=false', # 替换为你的数据库URL 'table_name': 'your_table', 'query': 'INSERT INTO {} VALUES (?, ?)'.format('your_table'), # 插入语法 'column_names': ['column1', 'column2'], # 应匹配字段名称 'column_types': [types.VARCHAR, types.INT], # 或者对应的数据库类型 } transformed_data | 'Write to MySQL' >> WriteToDatabase(**jdbc_sink_config) ``` 6. **运行管道**: 最后,执行`Pipeline.run(runner)`启动数据处理流程。 ```python if __name__ == '__main__': pipeline.run().wait_until_finish() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值