什么是Flink?
Apache Flink是一个用于分布式流式处理和批处理的开源实时计算引擎。它具备低延迟、高吞吐量和 exactly-once 语义的特点,适用于各种实时数据处理场景。
Flink的核心概念
作业(Job):Flink程序的执行单元。
数据流(DataStream):表示连续的数据流,可以进行转换和计算。
窗口(Window):用于对无限数据流进行有界的数据切片处理。
状态(State):用于保存和管理中间计算结果。
时间语义(Event Time、Processing Time、Ingestion Time):用于确定事件发生的时间。
我在 实时攻击行为分析模块 中,使用 Apache Flink 的滑动窗口流式计算如下:
1. 滑动窗口定义与数据源接入
-
数据源:
- 攻防引擎产生的攻击日志通过 Kafka 实时推送,每条日志包含字段:攻击时间戳、攻击类型(如 SQL 注入、XSS)、攻击结果(成功/失败)、目标 IP、攻击者 ID 等。
- Flink 通过
FlinkKafkaConsumer
订阅 Kafka 的attack-log
Topic,反序列化为AttackEvent
对象。
-
窗口配置:
- 窗口类型:滑动窗口(Sliding Window),窗口大小 5秒,滑动间隔 1秒(每 1 秒输出一次过去 5 秒的统计结果)。
- 时间语义:采用 Event Time(以攻击日志中的时间戳为准),通过
Watermark
处理乱序事件(允许最大延迟 2 秒)。
DataStream<AttackEvent> attackStream = env
.addSource(new FlinkKafkaConsumer<>("attack-log", new AttackEventDeserializer(), properties))
.assignTimestampsAndWatermarks(WatermarkStrategy
.<AttackEvent>forBoundedOutOfOrderness(Duration.ofSeconds(2))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp()));
// 按攻击类型分组,开滑动窗口
DataStream<AttackStat> windowedStat = attackStream
.keyBy(AttackEvent::getAttackType