Flink自定义数据源,模拟无界流随机生成数据

本文介绍了如何使用Java的ApacheFlinkStreamExecutionEnvironment处理流数据,创建了一个名为Demo1的实体类,并通过GeneratorFunction生成数据,应用WatermarkStrategy处理乱序事件,最后执行流处理操作并打印结果。
摘要由CSDN通过智能技术生成
创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Demo1 {
    private String user;
    private String url;
    private Long ts;
}
  //环境设置
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度
        env.setParallelism(1);
        //自定义数据源
        GeneratorFunction<Long, Demo1> generatorFunction = new GeneratorFunction<Long, Demo1>(){

            @Override
            public Demo1 map(Long aLong) throws Exception {
                String[]users="Mary,Alice,Bob,Cary".split(",");
                String[]urls="./home,./cart,./fav,./prod?id=1,./prod?id=2".split(",");
                //生成随机数
                Random random = new Random();
                Demo1 demo1 = new Demo1();
                demo1.setUser(users[random.nextInt(users.length)]);
                demo1.setUrl(urls[random.nextInt(urls.length)]);
                //System.currentTimeMillis():当前时间戳
                demo1.setTs(System.currentTimeMillis());
                return demo1;
            }
        };
        //模拟无界流
        long numberOfRecords = Long.MAX_VALUE;

        DataGeneratorSource<Demo1> source =
                new DataGeneratorSource<>(
                        generatorFunction,
                        numberOfRecords, //一共产生多少条
                        RateLimiterStrategy.perSecond(1),//每一秒产生一条数据
                        Types.POJO(Demo1.class));

        DataStreamSource<Demo1> stream =
                env.fromSource(source,
                        WatermarkStrategy
                        .<Demo1>forBoundedOutOfOrderness(Duration.ofSeconds(3))
                        .withTimestampAssigner((event, timestamp) ->
                                event.getTs()
                                ),
                        "Generator Source");
//        stream.print();
        //转换为二元组
        SingleOutputStreamOperator<Tuple2<String, Integer>> reduceTuple = stream.map(value -> Tuple2.of(value.getUser(), 1))
                .returns(Types.TUPLE(Types.STRING, Types.INT))//二元组的数据类型
                .keyBy(k -> k.f0)
                .reduce(new ReduceFunction<Tuple2<String, Integer>>() {
                    public Tuple2<String, Integer> reduce(Tuple2<String, Integer> v1, Tuple2<String, Integer> v2) {
                        return new Tuple2<>(v1.f0, v1.f1 + v2.f1);
                    }
                });
        reduceTuple.print();

        env.execute();

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值