Flink程序加载数据源(3)自定义数据源(2)从Mysql 加载数据源
上文引出了Flink程序自定义数据源的方法,我们来再次回顾下。
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();
}
}
}
结果展示:
方法以及特别属性解释说明:
- 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");