大数据之Flink 实时数据聚合 滚动聚合 / 会话聚合 实践

大数据阿木 发布于 2025-07-12 13 次阅读


摘要:

随着大数据时代的到来,实时数据处理成为企业决策和业务运营的关键。Apache Flink 作为一款强大的流处理框架,在实时数据聚合方面表现出色。本文将围绕 Flink 的实时数据聚合功能,详细介绍滚动聚合和会话聚合的实践方法,并通过实际代码示例进行演示。

一、

实时数据聚合是大数据处理中的重要环节,它能够帮助我们快速从海量数据中提取有价值的信息。Flink 提供了丰富的窗口函数和聚合函数,支持多种聚合操作,如滚动聚合和会话聚合。本文将深入探讨这两种聚合方法,并通过实际代码进行演示。

二、滚动聚合

滚动聚合(Tumbling Window Aggregation)是指对固定时间窗口内的数据进行聚合。在 Flink 中,可以使用 TumblingEventTimeWindows 或 TumblingProcessingTimeWindows 来创建滚动窗口。

1. 滚动聚合示例

以下是一个使用 Flink 进行滚动聚合的示例,假设我们有一个实时日志数据流,需要计算每5秒内每个用户的点击量。

java

import org.apache.flink.api.common.functions.MapFunction;


import org.apache.flink.api.java.tuple.Tuple2;


import org.apache.flink.streaming.api.datastream.DataStream;


import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class RollingAggregationExample {


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


// 创建 Flink 执行环境


final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 创建数据源


DataStream<String> inputStream = env.fromElements("Alice,1", "Bob,1", "Alice,1", "Bob,2", "Alice,1", "Bob,1");

// 将数据转换为二元组


DataStream<Tuple2<String, Integer>> dataStream = inputStream


.map(new MapFunction<String, Tuple2<String, Integer>>() {


@Override


public Tuple2<String, Integer> map(String value) throws Exception {


String[] fields = value.split(",");


return new Tuple2<>(fields[0], Integer.parseInt(fields[1]));


}


});

// 创建滚动窗口,窗口大小为5秒


DataStream<Tuple2<String, Integer>> rollingStream = dataStream


.keyBy(0)


.window(TumblingEventTimeWindows.of(Time.seconds(5)))


.aggregate(new AggregateFunction<Tuple2<String, Integer>, Integer, Integer>() {


@Override


public Integer createAccumulator() {


return 0;


}

@Override


public Integer add(Tuple2<String, Integer> value, Integer accumulator) {


return accumulator + value.f1;


}

@Override


public Integer getResult(Integer accumulator) {


return accumulator;


}

@Override


public Integer merge(Integer a, Integer b) {


return a + b;


}


});

// 打印结果


rollingStream.print();

// 执行 Flink 程序


env.execute("Flink Rolling Aggregation Example");


}


}


2. 滚动聚合总结

滚动聚合适用于对固定时间窗口内的数据进行实时分析,如实时监控、实时报表等。

三、会话聚合

会话聚合(Session Window Aggregation)是指将一段时间内没有发生任何事件的数据视为一个会话,并对每个会话内的数据进行聚合。在 Flink 中,可以使用 SessionWindows 来创建会话窗口。

1. 会话聚合示例

以下是一个使用 Flink 进行会话聚合的示例,假设我们有一个实时用户行为数据流,需要计算每个用户的活跃会话数。

java

import org.apache.flink.api.common.functions.MapFunction;


import org.apache.flink.api.java.tuple.Tuple2;


import org.apache.flink.streaming.api.datastream.DataStream;


import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class SessionAggregationExample {


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


// 创建 Flink 执行环境


final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 创建数据源


DataStream<String> inputStream = env.fromElements("Alice,1", "Bob,1", "Alice,2", "Bob,2", "Alice,1", "Bob,1", "Alice,1", "Bob,1");

// 将数据转换为二元组


DataStream<Tuple2<String, Integer>> dataStream = inputStream


.map(new MapFunction<String, Tuple2<String, Integer>>() {


@Override


public Tuple2<String, Integer> map(String value) throws Exception {


String[] fields = value.split(",");


return new Tuple2<>(fields[0], Integer.parseInt(fields[1]));


}


});

// 创建会话窗口,会话时间为10秒


DataStream<Tuple2<String, Integer>> sessionStream = dataStream


.keyBy(0)


.window(SessionWindows.withGap(Time.seconds(10)))


.aggregate(new AggregateFunction<Tuple2<String, Integer>, Integer, Integer>() {


@Override


public Integer createAccumulator() {


return 0;


}

@Override


public Integer add(Tuple2<String, Integer> value, Integer accumulator) {


return accumulator + 1;


}

@Override


public Integer getResult(Integer accumulator) {


return accumulator;


}

@Override


public Integer merge(Integer a, Integer b) {


return a + b;


}


});

// 打印结果


sessionStream.print();

// 执行 Flink 程序


env.execute("Flink Session Aggregation Example");


}


}


2. 会话聚合总结

会话聚合适用于分析用户行为、用户活跃度等场景,能够帮助我们更好地理解用户行为模式。

四、结论

本文详细介绍了 Flink 的滚动聚合和会话聚合方法,并通过实际代码示例进行了演示。这两种聚合方法在实时数据处理中具有广泛的应用,可以帮助我们快速从海量数据中提取有价值的信息。在实际应用中,可以根据具体需求选择合适的聚合方法,以实现高效的数据分析。