第07章 流处理框架¶
📚 章节概述¶
本章将深入讲解流处理框架,包括Apache Beam、Apache Flink等。通过本章学习,你将能够设计和实现流处理应用。
🎯 学习目标¶
完成本章后,你将能够:
- 理解流处理的核心概念
- 掌握Apache Beam的使用
- 了解Apache Flink的高级特性
- 掌握流处理模式
- 能够设计和实现流处理应用
7.1 流处理概述¶
7.1.1 什么是流处理¶
流处理是对无界数据流进行实时处理和分析的技术。
流处理特点¶
- 无界数据
- 数据持续产生
- 无固定大小
-
需要窗口机制
-
实时处理
- 低延迟处理
- 实时反馈
-
快速决策
-
状态管理
- 状态维护
- 窗口操作
- 会话管理
7.1.2 流处理vs 批处理¶
| 特性 | 流处理 | 批处理 |
|---|---|---|
| 延迟 | 毫秒级 | 分钟/小时级 |
| 数据 | 无界 | 有界 |
| 处理 | 逐条 | 批量 |
| 成本 | 高 | 低 |
| 复杂度 | 高 | 中 |
7.2 Apache Beam¶
7.2.1 Beam概述¶
Apache Beam是统一的数据处理编程模型,支持批处理和流处理。
核心概念¶
- PCollection
- 数据集合
- 惰性/无界
-
分布式
-
Transform
- 数据转换
- 映射、过滤、聚合
-
组合操作
-
IO
- 数据源
- 数据汇
- 格式转换
7.2.2 Beam使用¶
Python
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
# 定义Pipeline
with beam.Pipeline(options=PipelineOptions()) as p:
# 读取数据
sales = p | 'ReadFromText' >> beam.io.ReadFromText('sales.csv')
# Beam管道语法:| 连接处理步骤,>> 命名步骤;每个lambda接收上一步输出(x依次为字符串→列表→字典→元组)
# 解析数据
parsed = sales | 'ParseCsv' >> beam.Map(lambda x: x.split(',')) # lambda匿名函数:简洁的单行函数
# 转换数据
transformed = parsed | 'Transform' >> beam.Map(lambda x: {
'product_id': int(x[0]),
'quantity': int(x[1]),
'amount': float(x[2])
})
# 过滤数据
filtered = transformed | 'Filter' >> beam.Filter(lambda x: x['amount'] > 100)
# 聚合数据
aggregated = (filtered
| 'PairWithKey' >> beam.Map(lambda x: (x['product_id'], x['amount']))
| 'Aggregate' >> beam.CombinePerKey(sum)
)
# 写入数据
aggregated | 'WriteToText' >> beam.io.WriteToText('output.txt')
7.3 Apache Flink¶
7.3.1 Flink概述¶
Apache Flink是分布式流处理引擎,支持有界和无界数据流。
核心特性¶
- 流批一体
- 统一API
- 相同语义
-
流批切换
-
状态管理
- Keyed State
- 窗口状态
-
Checkpoint
-
时间语义
- Event Time
- Processing Time
- Watermark
7.3.2 Flink使用¶
Python
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment, EnvironmentSettings, DataTypes
from pyflink.table.schema import Schema
from pyflink.common.types import Row
from pyflink.datastream.functions import MapFunction
# 创建执行环境
env = StreamExecutionEnvironment.get_execution_environment()
t_env = StreamTableEnvironment.create(env)
# 定义数据源
sales = env.from_collection([
(1, 'product1', 10, 100.0),
(2, 'product2', 20, 200.0),
(3, 'product1', 15, 150.0)
])
# 定义转换函数
class SalesMapper(MapFunction):
def map(self, value):
product_id, product_name, quantity, amount = value
return Row(product_id, product_name, quantity, amount, quantity * amount)
# 应用转换
mapped_sales = sales.map(SalesMapper())
# 转换为Table并注册
sales_table = t_env.from_data_stream(mapped_sales).alias(
'product_id', 'product_name', 'quantity', 'amount', 'total_amount'
)
t_env.create_temporary_view('sales_view', sales_table)
# 执行查询
result = t_env.sql_query("""
SELECT
product_id,
product_name,
SUM(quantity) as total_quantity,
SUM(amount) as total_amount,
SUM(total_amount) as total_revenue
FROM sales_view
GROUP BY product_id, product_name
""")
# 输出结果
result.execute().print()
7.4 练习题¶
基础题¶
- 选择题
-
流处理的核心特点不包括什么?
- A. 无界数据
- B. 实时处理
- C. 高成本
- D. 状态管理
-
简答题
- 解释流处理vs 批处理的区别。
- 说明Apache Beam的核心概念。
进阶题¶
- 实践题
- 使用Beam实现数据处理。
- 使用Flink实现流处理。
-
实现窗口聚合。
-
设计题
- 设计一个流处理架构。
- 设计一个实时分析系统。
答案¶
1. 选择题答案¶
- C(流处理的核心特点不包括高成本)
2. 简答题答案¶
流处理vs 批处理的区别: - 流处理:无界数据、实时处理、高成本 - 批处理:有界数据、批量处理、低成本
Apache Beam的核心概念: - PCollection、Transform、IO
3. 实践题答案¶
参见7.2-7.3节的示例。
4. 设计题答案¶
参见7.1-7.3节的架构设计。
7.5 面试准备¶
大厂面试题¶
字节跳动¶
- 解释流处理的核心概念。
- Beam和Flink的区别是什么?
- 如何设计流处理应用?
- 如何优化流处理性能?
腾讯¶
- 流处理的窗口类型有哪些?
- 如何实现状态管理?
- 如何处理流处理中的延迟?
- 如何设计流处理的容错?
阿里云¶
- 流处理的最佳实践是什么?
- 如何设计流处理的扩展性?
- 如何处理流处理的数据质量?
- 如何设计流处理的监控?
📚 参考资料¶
- Apache Beam文档:https://beam.apache.org/documentation/
- Apache Flink文档:https://flink.apache.org/
- 《Stream Processing with Apache Flink》
- 《Dataflow Patterns》
🎯 本章小结¶
本章深入讲解了流处理框架,包括:
- 流处理的核心概念
- Apache Beam的使用
- Apache Flink的高级特性
- 流处理模式
通过本章学习,你掌握了流处理的核心技术,能够设计和实现流处理应用。下一章将深入学习数据质量。