FLINK 1.12.2 jdbc读写mysql

FLINK读写MySQL的方式有三种,一种是直接使用flink自带的JDBCInputFormat和JDBCOutputFormat,另一种是自定义source和sink,第三种是通过DDL连接MySQL进行读写。第二种针对每个源表都要写自定义的source和sink类,不够灵活;第一种是通过DataSet API实现的;考虑到官网一直强调Table API的流批统一性,以及代码的简易程度,这里选择第三种方式DDL链接jdbc来读写mysql。

目录

1.添加依赖

2.实现过程

2.1创建源表和目标表

2.2Flink读写MYSQL

3 测试结果

4 一点说明


1.添加依赖

参照官网需要添加如下两个jar包mysql-connector-java.jar和flink-connector-jdbc_2.11.jar,在代码中引入依赖:



    org.apache.flink

    flink-connector-jdbc_2.11

    ${flink.version}





    mysql

    mysql-connector-java

    5.1.49

并将这两个jar包添加到到flink 的lib目录下,重启flink集群

2.实现过程

2.1创建源表和目标表

在mysql中创建源表student,并插入一条数据。sql如下:

DROP TABLE IF EXISTS student;

CREATE TABLE student (

id INT(11) AUTO_INCREMENT,

name varchar(25) DEFAULT '',

PRIMARY KEY (id)

) ;

INSERT INTO student (name) VALUES ('arwenlin');

在mysql中创建目标表studentcp,结构与student一致,空表无数据。

2.2Flink读写MYSQL

Flink代码调用DDL同步mysql的两个表。首先需要在flink中创建2个连接mysql的内存表,分别对应mysql中的源表和目标表,表结构要一致。然后执行insert语句。Flink1.12.2的DDL语句设置connector信息的参数与Flink1.11有所不同,更加简化了,具体参数说明可以参考官网。

整体代码如下:

public static void main(String[] args) throws Exception {

    String driverClass = "com.mysql.jdbc.Driver";

    String dbUrl = "jdbc:mysql://ip:port/testdb";

    String userNmae = "root";

    String passWord = "pw";



    //创建运行环境

    EnvironmentSettings settings = EnvironmentSettings.newInstance()

                            .useBlinkPlanner()

                            .inBatchMode() //可以不指定,默认也是批的模式,只有批的模式

                            .build();

    TableEnvironment tableEnvironment = TableEnvironment.create(settings);

    //指定方言

    tableEnvironment.getConfig().setSqlDialect(SqlDialect.DEFAULT);


    System.out.println("创建flink中临时的mysql table");

    String schema = "id INT ,name STRING";

    String source_table = "student"; //mysql中的源表名

    String sink_table = "studentcp"; //mysql中的目标表名

    String flink_source_table = "mysource_student"; //flink中用于连接mysql源表的内存表名

    String flink_sink_table = "mysink_studentcp"; //flink中用于连接mysql目标表的内存表名

    String base_sql = "CREATE TABLE IF NOT EXISTS %s (%s) " +

                        "WITH (" +

                        "'connector' = 'jdbc'," +

                        "'url' = '" + dbUrl + "'," +

                        "'table-name' = '%s'," +

                        " 'username' = '" + userNmae + "'," +

                        " 'password' = '" + passWord + "'" +

                    " )";

    String source_ddl = String.format(base_sql, flink_source_table, schema, source_table);

    String sink_ddl = String.format(base_sql, flink_sink_table, schema, sink_table);


    //执行创建flink中的两个表

    tableEnvironment.executeSql(source_ddl);

    tableEnvironment.executeSql(sink_ddl);


    //同步2个表的数据

    String insertsql = String.format("insert into %s select * from %s", flink_sink_table, flink_source_table);

    tableEnvironment.executeSql(insertsql);

    System.out.println("数据写入mysql成功");
}

3 测试结果

首先我进入Flink查看创建的Flink表,结果是没有的,因为两个Flink表都是内存表,不同session是看不到的。

 

进入mysql查看目标表数据,现在已经有2条数据了。同步成功!

 

4 一点说明

官网中说明看目前JdbcCatalog 只实现了PostgresCatalog,mysql 的JdbcCatalog 暂未实现,无法使用Catalog  把Mysql数据库中的表注册到Flink中查询。

 

你可能感兴趣的:(FLINK,1.12.2,学习实践记录,java,mysql,flink)