flink链接mysql_flink 将mysql作为Source和Sink的代码示例

本文提供了使用Flink连接MySQL作为数据源(SourceFromMySQL)和接收器(SinkToMySQL)的Java代码示例。在SourceFromMySQL中,通过open()方法建立连接,并从Student表中读取数据;在SinkToMySQL中,同样在open()方法中建立连接,用于将数据插入到Student表中。
摘要由CSDN通过智能技术生成

1.maven导入

mysql

mysql-connector-java

5.1.34

2.SourceFromMySQL工具类java代码

import org.apache.flink.configuration.Configuration;

import org.apache.flink.streaming.api.functions.source.RichSourceFunction;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

/**

* @Description TODO

* @Author zytshijack

* @Date 2019-05-14 08:32

* @Version 1.0

*/

public class SourceFromMySQL extends RichSourceFunction { //Student就是一个自定义类

PreparedStatement ps;

private Connection connection;

/**

* open() 方法中建立连接,这样不用每次 invoke 的时候都要建立连接和释放连接。

*

* @param parameters

* @throws Exception

*/

@Override

public void open(Configuration parameters) throws Exception {

super.open(parameters);

connection = getConnection();

String sql = "select * from Student;";

ps = this.connection.prepareStatement(sql);

}

/**

* 程序执行完毕就可以进行,关闭连接和释放资源的动作了

*

* @throws Exception

*/

@Override

public void close() throws Exception {

super.close();

if (connection != null) { //关闭连接和释放资源

connection.close();

}

if (ps != null) {

ps.close();

}

}

/**

* DataStream 调用一次 run() 方法用来获取数据

*

* @param ctx

* @throws Exception

*/

@Override

public void run(SourceContext ctx) throws Exception {

ResultSet resultSet = ps.executeQuery();

while (resultSet.next()) {

Student student = new Student(

resultSet.getInt("id"),

resultSet.getString("name").trim(),

resultSet.getString("password").trim(),

resultSet.getInt("age"));

ctx.collect(student);

}

}

@Override

public void cancel() {

}

private static Connection getConnection() {

Connection con = null;

try {

Class.forName("com.mysql.jdbc.Driver");

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/flink?useUnicode=true&characterEncoding=UTF-8", "root", "123");

} catch (Exception e) {

System.out.println("-----------mysql get connection has exception , msg = "+ e.getMessage());

}

return con;

}

}

3.SinkToMySQL工具类java代码

import org.apache.flink.configuration.Configuration;

import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

/**

* @Description TODO

* @Author zytshijack

* @Date 2019-05-14 09:10

* @Version 1.0

*/

public class SinkToMySQL extends RichSinkFunction {

PreparedStatement ps;

private Connection connection;

/**

* open() 方法中建立连接,这样不用每次 invoke 的时候都要建立连接和释放连接

*

* @param parameters

* @throws Exception

*/

@Override

public void open(Configuration parameters) throws Exception {

super.open(parameters);

connection = getConnection();

String sql = "insert into Student(id, name, password, age) values(?, ?, ?, ?);";

ps = this.connection.prepareStatement(sql);

}

@Override

public void close() throws Exception {

super.close();

//关闭连接和释放资源

if (connection != null) {

connection.close();

}

if (ps != null) {

ps.close();

}

}

/**

* 每条数据的插入都要调用一次 invoke() 方法

*

* @param value

* @param context

* @throws Exception

*/

@Override

public void invoke(Student value, Context context) throws Exception {

//组装数据,执行插入操作

ps.setInt(1, value.getId());

ps.setString(2, value.getName());

ps.setString(3, value.getPassword());

ps.setInt(4, value.getAge());

ps.executeUpdate();

}

private static Connection getConnection() {

Connection con = null;

try {

Class.forName("com.mysql.jdbc.Driver");

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/flink?useUnicode=true&characterEncoding=UTF-8&useSSL=false", "root", "123");

} catch (Exception e) {

System.out.println("-----------mysql get connection has exception , msg = "+ e.getMessage());

}

return con;

}

}

4.主函数使用工具类

env.addSource(new SourceFromMySQL())

...

stream.addSink(new SinkToMySQL())

Flink 中,Connector 是指用于与外部系统进行数据交互的组件。Connector 可以与各种外部系统进行交互,例如数据库、消息队列、文件系统等。Connector 的实现通常包括两个部分:SourceSink。 在 Flink SQL 中,Connector 的定义和实现通常需要通过以下方式: 1. 导入相关依赖库:在 Flink SQL 中,需要导入对应的 Connector 的相关依赖库,例如 flink-connector-jdbc、flink-connector-kafka、flink-connector-hive 等。 2. 创建 SourceSink:创建对应的 SourceSink 组件,并实现相关的接口。例如,如果需要读取从 MySQL 数据库中的数据,需要创建对应的 MySQLSource,并实现 Source 接口。 3. 配置 Connector:对于每个 Connector,都需要进行相应的配置,包括连接信息、数据格式、数据读取方式等。例如,对于 MySQLSource,需要配置 MySQL 的连接信息、表名、字段名等。 4. 注册 Connector:将创建好的 Connector 注册到 Flink 中,以便在 SQL 查询中使用。可以通过 Flink 的 TableEnvironment 注册 Connector。 5. 在 SQL 查询中使用 Connector:使用 Flink SQL 编写查询语句,通过 FROM 子句指定使用的 Connector,并通过 SELECT 子句定义需要查询的数据。例如: ``` SELECT name, age, gender FROM MyTable, MySQLSource WHERE MyTable.id = MySQLSource.id; ``` 上述 SQL 查询中使用了 MyTable 和 MySQLSource 两个 Connector,其中 MyTable 是 Flink 内部的 Table,MySQLSource 是自定义的 Connector。 总之,Flink SQL 中的 Connector 提供了一种便捷的方式,可以方便地与外部系统进行数据交互,并且可以通过 SQL 查询语句实现复杂的数据处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值