Flink程序经过reduce聚合后不输出sink的问题

Flink程序经过reduce聚合后不输出sink的问题

一、最近提交的一版flink流式计算程序,经过EventTimeSessionWindows后进行了reduce聚合,完成计算完成后迟迟不sink输出结果。

记录下踩过的坑

程序很简单,直接上代码:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(5);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

//模拟socket数据流
DataStream<String> kafkaDataStreamSource = env.socketTextStream("localhost", 9999, "\n");

kafkaDataStreamSource
        .filter((FilterFunction<String>) s -> {
            if (s.trim().equals("")) {
                return false;
            }
            return true;
        })
        .map((MapFunction<String, CarInfo>) s -> JSON.parseObject(s, CarInfo.class))
        //设置数据的eventtime作为watermark,代码略
        .assignTimestampsAndWatermarks(new ADPunctuatedWatermarks<CarInfo>())
        //设置聚合key
        .keyBy(CarInfo::getPhoneUID)
        //设置Session Window 200s
        .window(EventTimeSessionWindows.withGap(Time.seconds(200)))
        //聚合
        .reduce(new CarInfoReduceFunction<CarInfo>())
        //输出打印
        .addSink(new SinkFunction<CarInfo>() {
            @Override
            public void invoke(CarInfo value, Context context) throws Exception {
                System.out.println(JSON.toJSONString(value));
            }
        });
        

测试发现reduce函数输出正常,可以正常聚合,但就是不走sink;

最终发现是因为并发度大于1的问题,多个并发时不同的数据可能走到了不同的数据通道,导致无法触发session window 的条件,故无法输出。

解决方案
1、可以设置全局并发度为1:
env.setParallelism(1);

2、设置watermark并行度为1:在assignTimestampsAndWatermarks后面添加

...
.assignTimestampsAndWatermarks(new ADPunctuatedWatermarks<CarInfo>())
.setParallelism(1)
...

这一就OK了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值