Windows系统安装Flink及实现MySQL之间数据同步

        Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink的设计目标是在所有常见的集群环境中运行,并以内存执行速度和任意规模来执行计算。它支持高吞吐、低延迟、高性能的流处理,并且是一个面向流处理和批处理的分布式计算框架,将批处理看作一种特殊的有界流。

Flink的主要特点包括:

  1. 事件驱动型:Flink是一个事件驱动型的应用,可以从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。
  2. 支持有状态计算:Flink提供了Extactor-once语义及checkpoint机制,支持带有事件操作的流处理和窗口处理,以及灵活的窗口处理(如时间窗口、大小窗口等)。
  3. 轻量级容错处理:Flink使用savepoint进行错误恢复,可以在出现故障时快速恢复任务。
  4. 高吞吐、低延迟、高性能:Flink的设计目标是在保证数据处理稳定性的同时,实现高吞吐、低延迟、高性能的流处理。
  5. 支持大规模集群模式:Flink支持在yarn、Mesos、k8s等大规模集群环境中运行。
  6. 支持多种编程语言:Flink对java、scala、python都提供支持,但最适合使用java进行开发。

        Flink的应用场景非常广泛,可以用于实时流数据的分析计算、实时数据与维表数据关联计算、实时数仓建设、ETL(提取-转换-加载)多存储系统之间进行数据转化和迁移等场景。同时,Flink也适用于事件驱动型应用场景,如以kafka为代表的消息队列等。

1.Winows系统安装Flink

下载地址:Downloads | Apache Flink

选择 Apache Flink 1.16.0 - 2022-10-28 (Binaries

下载 flink-1.16.0-bin-scala_2.12.tgz

使用CMD窗口,在Flink安装路径/bin目录下启动start-cluster.bat

访问http://localhost:8081,界面如下:

2.使用Flink实现MySQL数据库之间数据同步(JAVA)

<flink.version>1.16.0</flink.version>
<flink-cdc.version>2.3.0</flink-cdc.version>

1.创建Flink流处理运行环境。

2.设置流处理并发数。

3.设置Flink存档间隔时间,单位为ms,当同步发生异常时会恢复最近的checkpoint继续同步。

4.在Flink中创建中间同步数据库。

5.在Flink中创建中间表flink_source,来源于MySQL表source,(注意connector为mysql-cdc)。

6.在Flink中创建中间表flink_sink,来源于MySQL表sink。

7.将Flink中间表来源表数据写入flink_sink表,Flink会根据MySQL binlog中source表变化,动态更新flink_sink表,同时会将flink_sink表数据写入MySQL sink表,实现MySQL数据持续同步。

package com.demo.flink;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

public class FlinkCdcMySql {
    public static void main(String[] args) {
        System.out.println("==========start run FlinkCdcMySql#main.");

        // 创建Flink流处理运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

//        StreamExecutionEnvironment env = StreamExecutionEnvironment.createRemoteEnvironment("127.0.0.1", 8081);
        // 设置流处理并发数
        env.setParallelism(3);
        // 设置Flink存档间隔时间,单位为ms,当同步发生异常时会恢复最近的checkpoint继续同步
        env.enableCheckpointing(5000);

        final StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

        // 在Flink中创建中间同步数据库
        tEnv.executeSql("CREATE DATABASE IF NOT EXISTS flink_test");

        // 在Flink中创建中间表flink_source,来源于MySQL表source
        // 注意connector为mysql-cdc
        tEnv.executeSql("CREATE TABLE flink_test.flink_source (\n" +
                "    id int,\n" +
                "    name varchar(255),\n" +
                "    create_time TIMESTAMP\n," + // Flink不支持datetime格式
                "    PRIMARY KEY (id) NOT ENFORCED" + //主键必须标明NOT ENFORCED
                ") WITH (\n" +
                "  'connector'  = 'mysql-cdc',\n" +
                "  'hostname'   = '127.0.0.1',\n" +
                "  'database-name'   = 'flink-source',\n" +
                "  'table-name' = 'source',\n" +
                "  'username'   = 'root',\n" +
                "  'password'   = 'root'\n" +
                ")");

        // 在Flink中创建中间表flink_sink,来源于MySQL表sink
        tEnv.executeSql("CREATE TABLE flink_test.flink_sink (\n" +
                "    id int,\n" +
                "    name varchar(255),\n" +
                "    create_time TIMESTAMP\n," +
                "    PRIMARY KEY (id) NOT ENFORCED" +
                ") WITH (\n" +
                "  'connector'  = 'jdbc',\n" +
                "  'url'        = 'jdbc:mysql://127.0.0.1:3306/flink-sink',\n" +
                "  'table-name' = 'sink',\n" +
                "  'driver'     = 'com.mysql.jdbc.Driver',\n" +
                "  'username'   = 'root',\n" +
                "  'password'   = 'root'\n" +
                ")");

//        Table transactions = tEnv.from("flink_source");
//        transactions.executeInsert("flink_sink");

        System.out.println("==========begin Mysql data cdc.");

        // 将Flink中间表来源表数据写入flink_sink表
        // Flink会根据MySQL binlog中source表变化,动态更新flink_sink表,同时会将flink_sink表数据写入MySQL sink表,实现MySQL数据持续同步
        tEnv.executeSql("INSERT INTO flink_test.flink_sink(id, name, create_time)\n" +
                "select id, name, create_time\n" +
                "from flink_test.flink_source\n");

        System.out.println("==========continue Mysql data cdc.");
    }

}

git代码地址:

flink-cdc-MySQL: FlinkCDC实现MySQL之间数据同步

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 环境准备 - 安装 MySQL,创建测试数据库和表,并插入数据 - 安装 Kafka,并创建一个 topic - 安装 Flink 2. 创建 Flink 项目 - 在 Flink 的 bin 目录下执行 flink new myflinkproject 创建一个新的 Flink 项目 - 在 pom.xml 中添加以下依赖 ``` <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.11</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-json</artifactId> <version>${flink.version}</version> </dependency> ``` - 在 src/main/java 下创建一个 Java 类,例如 SyncMySQLToKafka.java 3. 编写 Flink SQL 在 SyncMySQLToKafka.java 中编写以下代码: ``` public class SyncMySQLToKafka { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings); tableEnv.executeSql("CREATE TABLE mysql_table (id INT, name STRING) " + "WITH (" + " 'connector.type' = 'jdbc'," + " 'connector.url' = 'jdbc:mysql://localhost:3306/test?characterEncoding=utf-8'," + " 'connector.table' = 'test_table'," + " 'connector.driver' = 'com.mysql.jdbc.Driver'," + " 'connector.username' = 'root'," + " 'connector.password' = 'root'" + ")"); tableEnv.executeSql("CREATE TABLE kafka_table (id INT, name STRING) " + "WITH (" + " 'connector.type' = 'kafka'," + " 'connector.version' = 'universal'," + " 'connector.topic' = 'test_topic'," + " 'connector.properties.bootstrap.servers' = 'localhost:9092'," + " 'connector.properties.group.id' = 'test_group'," + " 'format.type' = 'json'," + " 'update-mode' = 'append'" + ")"); tableEnv.executeSql("INSERT INTO kafka_table SELECT id, name FROM mysql_table"); env.execute(); } } ``` - 创建一个 MySQLmysql_table,指定连接信息和表名 - 创建一个 Kafka 表 kafka_table,指定连接信息、topic 和数据格式 - 将 mysql_table 中的数据插入到 kafka_table 中 4. 运行程序 - 在命令行中进入项目根目录,执行 mvn clean package 编译项目 - 执行以下命令运行程序 ``` ./bin/flink run -c SyncMySQLToKafka target/myflinkproject-1.0-SNAPSHOT.jar ``` 5. 验证结果 - 在 Kafka 中查看是否有数据写入到 test_topic 中 - 修改 MySQL 表中的数据,查看是否能同步到 Kafka 中 以上就是使用 Flink SQL 实现 MySQL 同步到 Kafka 的简单示例。需要注意的是,本示例仅供参考,实际应用中需要根据具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雪落夜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值