Flink程序加载数据源(3)自定义数据源(1)

flink 可以从我们常用的各种DB文件(HDFS/LOCAL)SCOKETMQ等等…中加载数据,Flink官方也提供了一些connectors(连接器 理解为springboot-start-xx即可),引入依赖后并进行配置后,可快速获取到数据源。

EX:

  • flink-connector-redis
  • flink-connector-kafka
  • flink-connector-jdbc

同时,Flink还提供了数据源接口(抽象类),我们实现该接口(继承抽象类)就可以实现自定义数据源,不同的接口(抽象类)功能的丰富性与范围不同,分类如下:

EX:

  • SourceFunction: 非并行数据源(并行度只能=1)

  • RichSourceFunction: 多功能非并行数据源(并行度只能=1)

  • ParallelSourceFunction: 并行数据源(并行度能够>=1)

  • RichParallelSourceFunction: 多功能并行数据源(并行度能够>=1)

代码实现

如上所说,实现flink为我们提供的一些数据源接口,即能够实现自定义数据源了!

env.addSource(自定义数据源类对象);

下边进行完整示例演示:

① 准备环境

//准备环境 env
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);

② 获取数据源

env.addSource(自定义数据源类对象);

③ 从Mysql中获取数据源示例

数据对象

@Data
@NoArgsConstructor
@AllArgsConstructor
public static class VehicleAlarm {
    private String id;
    private String licensePlate;
    private String plateColor;
    private Long deviceTime;
    private String zone;
}

自定义数据源类

public static class MysqlSource extends RichParallelSourceFunction<VehicleAlarm> {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet result = null;
    private boolean flag = true;
    String url = "jdbc:mysql://xxx:3306/alarm-sc?useUnicode=true&characterEncoding=utf-8&useSSL=false";
    @Override
    public void open(Configuration parameters) throws Exception {
        conn = DriverManager
            .getConnection(url, "root", "root");
        String sql = "select id,license_plate,plate_color,device_time,`zone` from vehicle_alarm_202103";
        ps = conn.prepareStatement(sql);
        super.open(parameters);
    }


    @Override
    public void run(SourceContext<VehicleAlarm> ctx) throws Exception {
        while (flag) {
            result = ps.executeQuery();
            while (result.next()) {
                String id = result.getString("id");
                String licensePlate = result.getString("license_plate");
                String plateColor = result.getString("plate_color");
                Long deviceTime = result.getLong("device_time");
                String zone = result.getString("zone");
                VehicleAlarm vehicleAlarm = new VehicleAlarm(id, licensePlate, plateColor, deviceTime, zone);
                ctx.collect(vehicleAlarm);
            }
            Thread.sleep(2000);
        }
    }

    @Override
    public void cancel() {
        flag = false;
    }


    @Override
    public void close() throws Exception {
        if (conn != null) {
            conn.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (result != null) {
            result.close();
        }
    }
}

结果展示:

image-20210405172056289

方法以及特别属性解释说明:

  • open():数据源最开始打开时执行,整个数据源从加载到销毁,只会执行一次
  • run(SourceContex):实现数据获取逻辑,并可以通过传入的参数ctx进行向下游节点的数据转发。
  • SourceContext:source函数用于发出元素和可能的watermark的接口,确定以及返回source生成的元素的类型。
  • cancel():用来取消数据源,一般在run方法中,会存在一个循环来持续产生数据,cancel方法则可以使该循环终止。
  • close():数据源关闭时执行,整个数据源从加载到销毁,只会执行一次

Flink完整流程代码:

//准备环境 env
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
env.setParallelism(2);
//获取数据源 source
DataStreamSource<VehicleAlarm> streamSource = env.addSource(new MysqlSource());
//数据处理 todo
streamSource.print();
//数据收集 sink
//程序执行 execute
env.execute("mysql-source");
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值