一、Kafka:分布式消息队列
1. 核心概念
- 角色:Kafka 是一个分布式、高吞吐量的消息队列(Pub-Sub 模型),用于实时传输数据流。
- 关键术语:
- Producer(生产者):发送数据的客户端(如传感器、应用日志)。
- Consumer(消费者):接收和处理数据的客户端(如 Flink、Spark)。
- Broker:Kafka 集群中的单个节点,负责存储和转发消息。
- Topic:数据流的分类名称(如
user_click_events
)。 - Partition:Topic 的分区,每个分区是一个有序的、不可变的消息队列。
- Offset:消息在分区中的唯一位置标识。
- Consumer Group:一组消费者协同消费一个 Topic 的数据。
2. 核心特性
- 高吞吐:支持每秒百万级消息传输。
- 持久化:消息持久化存储(可配置保留时间)。
- 容错性:通过分区副本(Replication)防止数据丢失。
- 水平扩展:可通过增加 Broker 扩展集群。
3. 使用场景
- 实时数据管道:将数据从应用传输到数仓或流处理系统。
- 日志收集:集中收集微服务的日志。
- 事件驱动架构:如用户行为追踪、订单状态更新。
4. 简单示例
# 启动 Kafka(需先安装 ZooKeeper)
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties# 创建 Topic
bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 1 --bootstrap-server localhost:9092# 启动生产者发送消息
bin/kafka-console-producer.sh --topic test --bootstrap-server localhost:9092# 启动消费者接收消息
bin/kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092
二、Flink:分布式流处理框架
1. 核心概念
- 角色:Flink 是一个支持有状态计算的流处理框架,可处理无界(实时)和有界(离线)数据流。
- 关键术语:
- Stream:数据流(如 Kafka 中的消息流)。
- Operator:数据转换操作(如
map
、filter
、window
)。 - Window:将无界流划分为有限块(如按时间或数量)。
- State:计算过程中的状态(如统计累计值)。
- Checkpoint:定期保存状态,保证容错性(基于 Chandy-Lamport 算法)。
2. 核心特性
- 低延迟高吞吐:支持毫秒级延迟处理。
- 精确一次语义(Exactly-Once):确保数据不重复、不丢失。
- 事件时间处理:基于数据中的时间戳处理乱序事件。
- 灵活的 API:支持 Java/Scala/Python,提供 DataStream API(流处理)和 DataSet API(批处理)。
3. 使用场景
- 实时报表:如每分钟交易额统计。
- 异常检测:如实时监控服务器错误日志。
- 复杂事件处理:如用户行为模式识别。
4. 简单示例(Java)
// 从 Kafka 读取数据流,统计每5秒的单词数量
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();KafkaSource<String> source = KafkaSource.<String>builder().setBootstrapServers("localhost:9092").setTopics("test").setGroupId("flink-group").setValueOnlyDeserializer(new SimpleStringSchema()).build();DataStream<String> stream = env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");stream.flatMap((String line, Collector<Tuple2<String, Integer>> out) -> {for (String word : line.split(" ")) {out.collect(Tuple2.of(word, 1));}
})
.returns(Types.TUPLE(Types.STRING, Types.INT))
.keyBy(t -> t.f0)
.window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
.sum(1)
.print();env.execute("WordCount from Kafka");
三、Kafka + Flink 结合使用
1. 典型架构
Producer → Kafka Topic → Flink Job → Sink(数据库、另一个 Kafka Topic 等)
- Kafka 作为数据源(Source)或输出目标(Sink)。
- Flink 消费 Kafka 的数据流,处理后写入下游系统。
2. 优势
- 解耦:Kafka 缓冲数据,生产者和消费者速率可不同步。
- 实时性:Flink 提供低延迟处理能力。
- 容错:Kafka 持久化数据 + Flink Checkpoint 机制。
3. 示例场景:实时用户行为分析
- 数据采集:前端发送用户点击事件到 Kafka Topic
user_clicks
。 - Flink 处理:
- 过滤无效事件。
- 按用户 ID 分组,统计每5分钟的点击次数。
- 将结果写入另一个 Kafka Topic
user_click_stats
。
- 下游应用:实时大屏从
user_click_stats
读取数据展示。
四、Kafka vs Flink 对比
特性 | Kafka | Flink |
---|
核心功能 | 数据流传输(消息队列) | 数据流处理(实时计算) |
数据模型 | 持久化的流(按 Topic/Partition 存储) | 动态计算的流(处理中可转换、聚合) |
延迟 | 毫秒级(传输延迟) | 毫秒级(处理延迟) |
状态管理 | 无状态(仅存储数据) | 有状态(支持窗口、聚合) |
容错机制 | 副本(Replication) | Checkpoint + 状态快照 |
五、学习路径建议
- 先学 Kafka:
- 理解消息队列的基本概念(Producer/Consumer/Topic)。
- 部署 Kafka 集群,练习命令行操作。
- 用 Java 客户端编写生产者和消费者代码。
- 再学 Flink:
- 掌握 DataStream API 的常用操作(
map
、filter
、window
)。 - 从 Socket 或本地文件读取数据流,实现简单统计。
- 集成 Kafka 作为 Source/Sink。
- 结合项目实战:
- 用 Kafka + Flink 实现实时日志分析、用户行为追踪等场景。