1 package com; 2 import lombok.AllArgsConstructor; 3 import lombok.Data; 4 import lombok.NoArgsConstructor; 5 @Data 6 @AllArgsConstructor 7 @NoArgsConstructor 8 public class Sensor { 9 private String sensorId; 10 private Long sensorTime; 11 private Double sensorTemp; 12 }
1 package com; 2 3 4 import org.apache.flink.streaming.api.functions.source.SourceFunction; 5 import java.util.HashMap; 6 import java.util.Random; 7 8 public class MySource implements SourceFunction<Sensor> { 9 10 //基础温度 11 private Integer base; 12 //构造 13 public MySource(Integer base){ 14 this.base=base; 15 } 16 17 //开关 18 private Boolean running = true; 19 //随机数 20 private Random random = new Random(); 21 22 @Override 23 public void run(SourceContext<Sensor> sourceContext) throws Exception { 24 //stmap<sensorId,temperature> 25 HashMap<String, Double> stmap = new HashMap<>(); 26 //10个一组,初始化 27 for (int i = 0; i < 10; i++) { 28 stmap.put("sensor_"+(i+1),base*1.0) ; 29 } 30 31 while (running){ 32 for (String id : stmap.keySet()) { 33 //重新生成随机温度,满足正态分布 34 double newTemp = stmap.get(id) + random.nextGaussian()*20; 35 stmap.put(id,newTemp); 36 //封装成传感器对象 37 Sensor sensor = new Sensor(id, System.currentTimeMillis(), newTemp); 38 //进流 39 sourceContext.collect(sensor); 40 //每秒1个 41 Thread.sleep(1000); 42 } 43 } 44 } 45 46 @Override 47 public void cancel() { 48 //关停 49 running = false; 50 51 } 52 }
1 package com; 2 3 import org.apache.flink.streaming.api.functions.ProcessFunction; 4 import org.apache.flink.util.Collector; 5 import org.apache.flink.util.OutputTag; 6 7 //自定义process算子 8 public class MyProcess extends ProcessFunction<Sensor,Sensor> { 9 10 //分流依据 11 private Double temperature; 12 public MyProcess(Double temperature){ 13 this.temperature=temperature; 14 } 15 16 @Override 17 public void processElement(Sensor sensor, Context context, Collector<Sensor> collector) throws Exception { 18 if (sensor.getSensorTemp()>temperature){ 19 //主流 20 collector.collect(sensor); 21 }else { 22 //存入侧输出标签 23 context.output(new OutputTag<Sensor>("low"){},sensor); 24 } 25 26 } 27 }
1 package com; 2 3 import org.apache.flink.streaming.api.datastream.DataStream; 4 import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; 5 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; 6 import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor; 7 import org.apache.flink.streaming.api.windowing.time.Time; 8 import org.apache.flink.util.OutputTag; 9 //测试类 10 public class MyTest { 11 public static void main(String[] args) { 12 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 13 env.setParallelism(1); 14 //获取自定义类数据源,以60度正态分布 15 DataStream<Sensor> data = env.addSource(new MySource(60)); 16 //水位线允许1s延迟 17 SingleOutputStreamOperator<Sensor> datas = data.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Sensor>(Time.seconds(1)) { 18 @Override 19 public long extractTimestamp(Sensor sensor) { 20 return sensor.getSensorTime() * 1000; 21 } 22 }); 23 //自定义process,分流判断依据60.0摄氏度 24 SingleOutputStreamOperator<Sensor> res = datas.process(new MyProcess(60.0)); 25 //根据id:low获得侧输出流 26 DataStream<Sensor> sideOutput = res.getSideOutput(new OutputTag<Sensor>("low") {}); 27 //主流输出 28 res.print("high"); 29 //侧流输出 30 sideOutput.print("low"); 31 32 try { 33 env.execute(); 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } 37 } 38 }