1. 背景

Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架。其中 Apache Storm(以下简称“Storm”)在美团点评实时计算业务中已有较为成熟的运用(可参考 Storm 的可靠性保证测试:https://tech.meituan.com/test-of-storms-reliability.html),有管理平台、常用 API 和相应的文档,大量实时作业基于 Storm 构建。而 Apache Flink(以下简称“Flink”)在近期倍受关注,具有高吞吐、低延迟、高可靠和精确计算等特性,对事件窗口有很好的支持,目前在美团点评实时计算业务中也已有一定应用。

为深入熟悉了解 Flink 框架,验证其稳定性和可靠性,评估其实时处理性能,识别该体系中的缺点,找到其性能瓶颈并进行优化,给用户提供最适合的实时计算引擎,我们以实践经验丰富的 Storm 框架作为对照,进行了一系列实验测试 Flink 框架的性能,计算 Flink 作为确保“至少一次”和“恰好一次”语义的实时计算框架时对资源的消耗,为实时计算平台资源规划、框架选择、性能调优等决策及 Flink 平台的建设提出建议并提供数据支持,为后续的 SLA 建设提供一定参考。

Flink 与 Storm 两个框架对比:

Storm

Flink

状态管理

无状态

有状态

窗口支持

对事件窗口支持较弱

窗口支持较为完善

消息投递

At MOSt OnceAt Least Once

At Most OnceAt Least OnceExactly Once

容错方式

ACK机制 :消息失败重发机制

检查点机制 :分布式监测机制,错误回滚

应用现状

美团中大量实时作业基于 Storm 构建

美团点评中仍需进一步完善

2. 测试目标

评估不同场景、不同数据压力下 Flink 和 Storm 两个实时计算框架目前的性能表现,获取其详细性能数据并找到处理性能的极限;了解不同配置对 Flink 性能影响的程度,分析各种配置的适用场景,从而得出调优建议。

2.1 测试场景“输入-输出”简单处理场景

通过对“输入-输出”这样简单处理逻辑场景的测试,尽可能减少其它因素的干扰,反映两个框架本身的性能。同时测算框架处理能力的极限,处理更加复杂的逻辑的性能不会比纯粹“输入-输出”更高。

用户作业耗时较长的场景

如果用户的处理逻辑较为复杂,或是访问了数据库等外部组件,其执行时间会增大,作业的性能会受到影响。因此,我们测试了用户作业耗时较长的场景下两个框架的调度性能。

窗口统计场景

实时计算中常有对时间窗口或计数窗口进行统计的需求,例如一天中每五分钟的访问量,每 100 个订单中有多少个使用了优惠等。Flink 在窗口支持上的功能比 Storm 更加强大,API 更加完善,但是我们同时也想了解在窗口统计这个常用场景下两个框架的性能。

精确计算场景(即消息投递语义为“恰好一次”)

Storm 仅能保证“至多一次” (At Most Once) 和“至少一次” (At Least Once) 的消息投递语义,即可能存在重复发送的情况。有很多业务场景对数据的精确性要求较高,希望消息投递不重不漏。Flink 支持“恰好一次” (Exactly Once) 的语义,但是在限定的资源条件下,更加严格的精确度要求可能带来更高的代价,从而影响性能。因此,我们测试了在不同消息投递语义下两个框架的性能,希望为精确计算场景的资源规划提供数据参考。

2.2 性能指标

吞吐量(Throughput)

延迟(Latency)

3. 测试环境

为 Storm 和 Flink 分别搭建由 1 台主节点和 2 台从节点构成的 Standalone 集群进行本次测试。其中为了观察 Flink 在实际生产环境中的性能,对于部分测内容也进行了 on Yarn 环境的测试。

3.1 集群参数

参数项

参数值

CPU

QEMU Virtual CPU version 1.1.2 2.6GHz

Core

8

Memory

16GB

Disk

500G

OS

CentOS release 6.5 (Final)

3.2 框架参数

参数项

Storm 配置

Flink 配置

Version

Storm 1.1.0-mt002

Flink 1.3.0

Master Memory

2600M

2600M

Slave Memory

1600M * 16

12800M * 2

Parallelism

2 supervisor16 worker

2 Task Manager16 Task slots

4. 测试方法4.1 测试流程

storm为什么没有flink吞吐性好(Flink与Storm的对比)(1)

数据生产

Data Generator 按特定速率生成数据,带上自增的 id 和 eventTime 时间戳写入 Kafka 的一个 Topic(Topic Data)。

数据处理

Storm Task 和 Flink Task (每个测试用例不同)从 Kafka Topic Data 相同的 Offset 开始消费,并将结果及相应 inTime、outTime 时间戳分别写入两个 Topic(Topic Storm 和 Topic Flink)中。

指标统计

Metrics Collector 按 outTime 的时间窗口从这两个 Topic 中统计测试指标,每五分钟将相应的指标写入 MySQL 表中。

Metrics Collector 按 outTime 取五分钟的滚动时间窗口,计算五分钟的平均吞吐(输出数据的条数)、五分钟内的延迟(outTime - eventTime 或 outTime - inTime)的中位数及 99 线等指标,写入 MySQL 相应的数据表中。最后对 MySQL 表中的吞吐计算均值,延迟中位数及延迟 99 线选取中位数,绘制图像并分析。

4.2 默认参数4.3 测试用例Identity

storm为什么没有flink吞吐性好(Flink与Storm的对比)(2)

Sleep

storm为什么没有flink吞吐性好(Flink与Storm的对比)(3)

Windowed Word Count

storm为什么没有flink吞吐性好(Flink与Storm的对比)(4)

5. 测试结果5.1 Identity 单线程吞吐量

storm为什么没有flink吞吐性好(Flink与Storm的对比)(5)

5.2 Identity 单线程作业延迟

storm为什么没有flink吞吐性好(Flink与Storm的对比)(6)

5.3 Sleep 吞吐量

storm为什么没有flink吞吐性好(Flink与Storm的对比)(7)

5.4 Sleep 单线程作业延迟(中位数)

storm为什么没有flink吞吐性好(Flink与Storm的对比)(8)

5.5 Windowed Word Count 单线程吞吐量

storm为什么没有flink吞吐性好(Flink与Storm的对比)(9)

5.6 Windowed Word Count Flink At Least Once 与 Exactly Once 吞吐量对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(10)

5.7 Windowed Word Count Storm At Least Once 与 At Most Once 吞吐量对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(11)

5.8 Windowed Word Count 单线程作业延迟

storm为什么没有flink吞吐性好(Flink与Storm的对比)(12)

5.9 Windowed Word Count Flink At Least Once 与 Exactly Once 延迟对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(13)

5.10 Windowed Word Count Storm At Least Once 与 At Most Once 延迟对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(14)

5.11 Windowed Word Count Flink 不同 StateBackends 吞吐量对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(15)

5.12 Windowed Word Count Flink 不同 StateBackends 延迟对比

storm为什么没有flink吞吐性好(Flink与Storm的对比)(16)

6. 结论及建议6.1 框架本身性能6.2 复杂用户逻辑对框架差异的削弱6.3 不同消息投递语义的差异6.4 Flink 状态存储后端选择

StateBackend

过程状态存储

检查点存储

吞吐

推荐使用场景

Memory

TM Memory

JM Memory

高(3-5 倍 Storm)

调试、无状态或对数据是否丢失重复无要求

FileSystem

TM Memory

FS/HDFS

高(3-5 倍 Storm)

普通状态、窗口、KV 结构(建议作为默认 Backend)

RocksDB

RocksDB on TM

FS/HDFS

低(0.3-0.5 倍 Storm)

超大状态、超长窗口、大型 KV 结构

6.5 推荐使用 Flink 的场景

综合上述测试结果,以下实时计算场景建议考虑使用 Flink 框架进行计算:

7. 展望8. 参考内容,