博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

练习:Flink 自定义 process 和 source

 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 }

 

posted @ 2022-03-04 21:19  CHANG_09  阅读(94)  评论(0)    收藏  举报