Flink计算(工作记录)-多流合并

该代码示例展示了如何使用Flink从RocketMQ源读取数据流,分别处理IM、ws_topic和用户行为流,通过设置并行度、checkpoint间隔,处理乱序事件,并将结果聚合后输出到控制台,最终将数据写入Elasticsearch索引。
摘要由CSDN通过智能技术生成
// 创建参数工具,用于从命令行参数中读取配置信息

public static void main(String[] args) throws Exception {


final ParameterTool parameterTool = ExecutionEnvUtil.createParameterTool(args);

// 1、创建流式执行环境
StreamExecutionEnvironment env = ExecutionEnvUtil.prepare(parameterTool);
env.setParallelism(1); // 设置并行度为1
env.enableCheckpointing(5 * 60 * 1000); // 每5分钟进行一次checkpoint

// 构建IM流,从RocketMQ中获取数据,并对数据进行处理
SingleOutputStreamOperator<A> imStream =
        env.addSource(AliRocketMQSource.createMQSource(parameterTool,
                new RocketMQConnectConfig(PropertiesConstants.ROCKET_LIVE_IM_TOPIC, PropertiesConstants.ROCKET_LIVE_IM_GROUP, PropertiesConstants.ROCKET_LIVE_IM_TAG)))
                .process(new ImStreamProcess(), TypeInformation.of(A.class))
                .name("imStream");

// 构建ws_topic数据流,从RocketMQ中获取数据,并对数据进行处理
SingleOutputStreamOperator<B> wsStream =
        env.addSource(AliRocketMQSource.createMQSource(parameterTool,
                new RocketMQConnectConfig(PropertiesConstants.ROCKET_LIVE_WS_TOPIC, PropertiesConstants.ROCKET_LIVE_WS_GROUP, PropertiesConstants.ROCKET_LIVE_WS_TAG)))
                .process(new WsStreamProcess(), TypeInformation.of(B.class))
                .name("wsStream");

// 构建用户行为流,从RocketMQ中获取数据,并对数据进行处理
SingleOutputStreamOperator<C> actionStream =
        env.addSource(AliRocketMQSource.createMQSource(parameterTool,
                new RocketMQConnectConfig(PropertiesConstants.ROCKET_LIVE_EVENT_TOPIC, PropertiesConstants.ROCKET_LIVE_EVENT_GROUP, PropertiesConstants.ROCKET_LIVE_EVENT_TAG)))
                .process(new ActionStreamProcess(), TypeInformation.of(C.class))
                .name("actionStream");

// 数据流连接:将三个数据流合并为一个流
SingleOutputStreamOperator<DIndex> reduceStream = imStream.union(wsStream, actionStream)
        .assignTimestampsAndWatermarks(WatermarkStrategy
                //乱序流 10s 延迟
                .<LiveRoomUnionInfo>forBoundedOutOfOrderness(Duration.ofSeconds(10))
                .withTimestampAssigner(new SerializableTimestampAssigner<LiveRoomUnionInfo>() {
                        @Override
                        public long extractTimestamp(LiveRoomUnionInfo element, long recordTimestamp) {
                            if (element == null) {
                                return System.currentTimeMillis();
                            }
                            // 提取 eventTime作为 watermark时间戳
                            return element.getEventTime();
                        }
                    })
                .withIdleness(Duration.ofSeconds(2))) // 允许迟到2s
        .keyBy(LiveRoomUnionInfo::getGroupId) // 按照groupId进行分组
        .window(TumblingEventTimeWindows.of(Time.minutes(5), Time.seconds(0))) // 定义窗口为5分钟滑动窗口
        .trigger(new LastWindowCloseTrigger(1200)) // 当窗口内的最后一个元素被处理时,触发新的窗口计算
        .reduce(new LiveRoomReduceFunction(), new LiveRoomReduceProcessWindowFun()); // 对窗口内的数据进行聚合操作

reduceStream.print("LiveRoomStatisticCountJob reduceStream"); // 将结果输出到控制台

ElasticSearch6SinkLiveActionIndex.addSink(1, 1, reduceStream, parameterTool); // 将结果写入Elasticsearch索引

// 同步执行,等待结果返回
env.execute(LiveRoomStatisticsJob.class.getSimpleName()); // 提交作业并开始执行

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值