前言
Flink 官网接入数据源的类型是有限的,不满足自己业务需求需要自己来实现。
Flink还提供了数据源接口(抽象类),我们实现该接口(继承抽象类)就可以实现自定义数据源,不同的接口(抽象类)功能的丰富性与范围不同,分类如下
SourceFunction: 非并行数据源(并行度只能=1)
RichSourceFunction: 多功能非并行数据源(并行度只能=1)
ParallelSourceFunction: 并行数据源(并行度能够>=1)
RichParallelSourceFunction: 多功能并行数据源(并行度能够>=1)
1.自定义数据源
public class MysqlSource extends RichParallelSourceFunction<Row> {
PreparedStatement ps = null;
ResultSet result = null;
Connection conn = null;
private boolean flag = true;
@Override
public void open(Configuration parameters) throws Exception {
Connection conn = JdbcUtil.getConn();
String sql = "SELECT fund_code,underlying_security_id,component_share,creation_redemption_unit,estimate_cash_component," +
"creation_cash_substitute,substitute_flag,trading_day FROM dim_etf_info";
ps = conn.prepareStatement(sql);
super.open(parameters);
}
@Override
public void run(SourceContext<Row> ctx) throws Exception {
while (flag) {
result = ps.executeQuery();
while (result.next()) {
Row row = new Row(8);
row.setField(0, result.getString("fund_code"));
row.setField(1, result.getString("underlying_security_id"));
row.setField(2, result.getInt("component_share"));
row.setField(3, result.getBigDecimal("creation_redemption_unit"));
row.setField(4, result.getBigDecimal("estimate_cash_component"));
row.setField(5, result.getBigDecimal("creation_cash_substitute"));
row.setField(6, result.getString("substitute_flag"));
row.setField(7, result.getDate("trading_day"));
ctx.collect(row);
}
Thread.sleep(1000*60*10);
}
}
@SneakyThrows
@Override
public void cancel() {
flag = false;
}
@Override
public void close() throws Exception {
JdbcUtil.close(conn, ps, result);
}
}
2.测试
public class TestCustomSource {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
DataStreamSource<Row> streamSource = env.addSource(new MysqlSource());
streamSource.print();
env.execute("mysql-source");
}
}
方法描述
open():数据源最开始打开时执行,整个数据源从加载到销毁,只会执行一次
run(SourceContex):实现数据获取逻辑,并可以通过传入的参数ctx进行向下游节点的数据转发。
SourceContext:source函数用于发出元素和可能的watermark的接口,确定以及返回source生成的元素的类型。
cancel():用来取消数据源,一般在run方法中,会存在一个循环来持续产生数据,cancel方法则可以使该循环终止。
close():数据源关闭时执行,整个数据源从加载到销毁,只会执行一次