Flink 自定义数据源

前言

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():数据源关闭时执行,整个数据源从加载到销毁,只会执行一次

Guess you like

Origin blog.csdn.net/weixin_43975771/article/details/120065043