一.代碼準備
org.flink.beans.SensorReading
package org.flink.beans;
/**
* @author 只是甲
* @date 2021-08-30
* @remark 傳感器溫度讀數的數據類型
*/
public class SensorReading {
// 屬性:id,時間戳,溫度值
private String id;
private Long timestamp;
private Double temperature;
public SensorReading() {
}
public SensorReading(String id, Long timestamp, Double temperature) {
this.id = id;
this.timestamp = timestamp;
this.temperature = temperature;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public Double getTemperature() {
return temperature;
}
public void setTemperature(Double temperature) {
this.temperature = temperature;
}
@Override
public String toString() {
return "SensorReading{" +
"id='" + id + '\'' +
", timestamp=" + timestamp +
", temperature=" + temperature +
'}';
}
}
SourceTest4_UDF
package org.example;
import org.flink.beans.SensorReading;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import java.util.HashMap;
import java.util.Random;
/**
* @author 只是甲
* @date 2021-08-31
* @remark Flink之自定義Source
*/
public class SourceTest4_UDF {
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 從文件讀取數據
DataStream<SensorReading> dataStream = env.addSource( new MySensorSource() );
// 打印輸出
dataStream.print();
env.execute();
}
// 實現自定義的SourceFunction
public static class MySensorSource implements SourceFunction<SensorReading>{
// 定義一個標識位,用來控制數據的產生
private boolean running = true;
@Override
public void run(SourceContext<SensorReading> ctx) throws Exception {
// 定義一個隨機數發生器
Random random = new Random();
// 設置10個傳感器的初始溫度
HashMap<String, Double> sensorTempMap = new HashMap<>();
for( int i = 0; i < 10; i++ ){
sensorTempMap.put("sensor_" + (i+1), 60 + random.nextGaussian() * 20);
}
while (running){
for( String sensorId: sensorTempMap.keySet() ){
// 在當前溫度基礎上隨機波動
Double newtemp = sensorTempMap.get(sensorId) + random.nextGaussian();
sensorTempMap.put(sensorId, newtemp);
ctx.collect(new SensorReading(sensorId, System.currentTimeMillis(), newtemp));
}
// 控制輸出頻率
Thread.sleep(2000L);
}
}
@Override
public void cancel() {
running = false;
}
}}
二.運行程序
運行程序截圖: