• 练习: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 }
  • 相关阅读:
    DOM笔记(二):Node接口
    DOM笔记(一):HTMLDocument接口
    mysql_connect v/s mysql_pconnect
    HTML 5:绘制旋转的太极图
    HTML 5:你必须知道的data属性
    CSS:7个你可能不认识的单位
    CSS 3的display:盒类型详解
    PHP:6种GET和POST请求发送方法
    asp.net mvc生命周期学习
    关于sql row_number,rank,dense_rank,ntile函数
  • 原文地址:https://www.cnblogs.com/chang09/p/15966169.html
Copyright © 2020-2023  润新知