flink学习2:简单demo,随机5个流数据计算平方存Mysql。
单机非集群,flink版本1.16.2,地址https://archive.apache.org/dist/flink/。
注意远程连接到本机的数据库地址,首先保证虚拟机和本机的通信。
Connection conn = DriverManager.getConnection("jdbc:mysql://远程IP:3306/YourDataBase", "username", "password");
flink的web界面提交新Job,使用全类名,并行度设置为1。
完整代码
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 生成5个随机整数
DataStream<Integer> dataStream = env.addSource(new SourceFunction<Integer>() {
private boolean running = true;
@Override
public void run(SourceContext<Integer> ctx) throws Exception {
while (running) {
ctx.collect(new Random().nextInt(100));
Thread.sleep(1000); // 等待1秒
}
}
@Override
public void cancel() {
running = false;
}
});
// 计算平方
DataStream<Integer> squareStream = dataStream.map(new MapFunction<Integer, Integer>() {
@Override
public Integer map(Integer value) throws Exception {
return value * value;
}
});
squareStream.addSink(new SinkFunction<Integer>() {
@Override
public void invoke(Integer value, Context context) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://远程IP:3306/YourDataBase", "username", "password");
PreparedStatement stmt = conn.prepareStatement("INSERT INTO table (column) VALUES (?)");
stmt.setInt(1, value);
stmt.executeUpdate();
stmt.close();
conn.close();
}
});
env.execute("Flink Demo Job");}
提前结束任务,不然会持续写入数据库。