Flink程序加载数据源(3)自定义数据源(2)从Mysql 加载数据源

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();
        }
    }
}

结果展示:

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");
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
为了使用MySQL数据源作为FlinkML的KNN模型处理,需要进行以下步骤: 1. 安装MySQL数据库,并创建一个表格,用于存储训练数据。表格应该包含所有特征和目标变量。 2. 将数据加载MySQL表格中。 3. 在Flink程序中,使用MySQL数据源连接到表格。可以使用Flink的JDBC连接器或者自定义MySQL连接器。 4. 使用FlinkML的KNN算法训练模型。KNN算法需要指定K值和距离度量方法。 5. 使用训练好的模型对测试数据进行预测,并计算预测结果的准确性。 6. 可以使用Flink的流处理功能将预测结果发送到其他系统或者存储到另一个数据源中。 下面是一个使用Flink的JDBC连接器连接到MySQL数据源并训练KNN模型的示例代码: ``` // 导入必要的包 import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.io.jdbc.JDBCInputFormat; import org.apache.flink.api.java.io.jdbc.JDBCOutputFormat; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.api.java.tuple.Tuple3; import org.apache.flink.ml.classification.KNN; import org.apache.flink.ml.math.DenseVector; import org.apache.flink.ml.math.Vector; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.types.Row; // 创建Flink执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 创建MySQL连接器 String username = "root"; String password = "password"; String dbURL = "jdbc:mysql://localhost:3306/test"; JDBCInputFormat inputFormat = JDBCInputFormat.buildJDBCInputFormat() .setDrivername("com.mysql.jdbc.Driver") .setDBUrl(dbURL) .setUsername(username) .setPassword(password) .setQuery("SELECT feature1, feature2, feature3, target FROM training_data") .finish(); // 读取MySQL中的数据 DataSet<Row> data = env.createInput(inputFormat); // 转换数据格式 DataSet<Tuple3<Vector, Vector, Double>> trainingData = data.map(row -> { double[] features = new double[3]; features[0] = row.getField(0); features[1] = row.getField(1); features[2] = row.getField(2); double target = row.getField(3); DenseVector featureVector = new DenseVector(features); DenseVector targetVector = new DenseVector(new double[]{target}); return new Tuple3<>(featureVector, targetVector, target); }); // 训练KNN模型 int k = 3; KNN knn = new KNN() .setK(k) .setDistanceMetric(new EuclideanDistance()) .setBlocks(10); knn.fit(trainingData); // 使用模型进行预测 DenseVector testFeatureVector = new DenseVector(new double[]{1.2, 2.3, 3.4}); Vector predictedTarget = knn.predict(testFeatureVector); // 输出预测结果 System.out.println("Predicted target: " + predictedTarget); ``` 注意,此示例代码仅用于说明如何使用MySQL数据源作为FlinkML的KNN模型处理。实际使用时,需要根据具体需求进行适当修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值