**
flink自定义source读取oracle,自定义sink写入mysql
**
在oracle和mysql数据库中创建相应的表
pom文件
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>1.12.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-runtime-web_2.11</artifactId>
<version>1.13.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-jdbc_2.11</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.13.0</version>
</dependency>
自定义source读取Oracle
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;
public class OracleSource extends RichSourceFunction<User> {
private Connection connection = null;
private PreparedStatement ps = null;
@Override
public void open(Configuration parameters){
System.out.println("OracleSource -- open --11-");
try{
super.open(parameters);
Class.forName("oracle.jdbc.OracleDriver");
connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "username", "pwd");//获取连接
ps = connection.prepareStatement("select * from SYS_USER");
}catch (Exception e){
System.out.println("OracleSource -- open --Exception-" + e.toString());
}
System.out.println("OracleSource -- open --22-");
}
@Override
public void run(SourceContext<User> sourceContext){
System.out.println("OracleSource -- run --33-");
ResultSet res = null;
try {
res = ps.executeQuery();
while(res.next()){
User user = new User();
user.setUserId(res.getNString("USER_ID"));
user.setUserName(res.getNString("USER_NAME"));
user.setUserNameCn(res.getNString("USER_NAME_CN"));
user.setTel(res.getNString("TEL"));
sourceContext.collect(user);
System.out.println("OracleSource -- run ---"+user.toString());
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("OracleSource -- run --Exception-" + e.toString());
}
System.out.println("OracleSource -- run --22-");
}
@Override
public void cancel() {
try {
super.close();
if (connection != null) {
connection.close();
}
if (ps != null) {
ps.close();
}
} catch (Exception e) {
logger.error("runException:{}", e);
}
}
}
自定义sink写入mysql
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class MysqlSink extends RichSinkFunction<User> {
private Connection connection = null;
private PreparedStatement ps = null;
@Override
public void invoke(User value, Context context) {
System.out.println("MysqlSink -- open --33-");
try {
ps.setString(1, value.getUserId());
ps.setString(2, value.getUserName());
ps.setString(3, value.getUserNameCn());
ps.setString(4, value.getTel());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("MysqlSink -- invoke ---"+value.toString());
}
@Override
public void open(Configuration parameters){
System.out.println("MysqlSink -- open --11-");
try {
super.open(parameters);
Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tableName?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false", "userNmae", "pwd");//获取连接
ps = connection.prepareStatement("insert into SYS_USER (USER_ID,USER_NAME,USER_NAME_CN,TEL) values(?,?,?,?)");
} catch (Exception e) {
e.printStackTrace();
System.out.println("MysqlSink -- open --Exception-" + e.toString());
}
System.out.println("MysqlSink -- open --22-");
}
@Override
public void close(){
try {
super.close();
if (connection != null) {
connection.close();
}
if (ps != null) {
ps.close();
}
} catch (Exception e) {
logger.error("runException:{}", e);
}
}
}
运行Job
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class DbJob {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment fsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<User> source = fsEnv.addSource(new OracleSource());
source.addSink(new MysqlSink());
fsEnv.execute();
}
}