作者:梦瑶
1. 背景
Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架。其中 Apache Storm(以下简称“Storm”)在美团点评实时计算业务中已有较为成熟的运用(可参考 Storm 的可靠性保证测试),有管理平台、常用 API 和相应的文档,大量实时作业基于 Storm 构建。而 Apache Flink(以下简称“Flink”)在近期倍受关注,具有高吞吐、低延迟、高可靠和精确计算等特性,对事件窗口有很好的支持,目前在美团点评实时计算业务中也已有一定应用。
为深入熟悉了解 Flink 框架,验证其稳定性和可靠性,评估其实时处理性能,识别该体系中的缺点,找到其性能瓶颈并进行优化,给用户提供最适合的实时计算引擎,我们以实践经验丰富的 Storm 框架作为对照,进行了一系列实验测试 Flink 框架的性能,计算 Flink 作为确保“至少一次”和“恰好一次”语义的实时计算框架时对资源的消耗,为实时计算平台资源规划、框架选择、性能调优等决策及 Flink 平台的建设提出建议并提供数据支持,为后续的 SLA 建设提供一定参考。
Flink 与 Storm 两个框架对比:
2. 测试目标
评估不同场景、不同数据压力下 Flink 和 Storm 两个实时计算框架目前的性能表现,获取其详细性能数据并找到处理性能的极限;了解不同配置对 Flink 性能影响的程度,分析各种配置的适用场景,从而得出调优建议。
2.1 测试场景
“输入-输出”简单处理场景
通过对“输入-输出”这样简单处理逻辑场景的测试,尽可能减少其它因素的干扰,反映两个框架本身的性能。
同时测算框架处理能力的极限,处理更加复杂的逻辑的性能不会比纯粹“输入-输出”更高。
用户作业耗时较长的场景
如果用户的处理逻辑较为复杂,或是访问了数据库等外部组件,其执行时间会增大,作业的性能会受到影响。因此,我们测试了用户作业耗时较长的场景下两个框架的调度性能。
窗口统计场景
实时计算中常有对时间窗口或计数窗口进行统计的需求,例如一天中每五分钟的访问量,每 100 个订单中有多少个使用了优惠等。Flink 在窗口支持上的功能比 Storm 更加强大,API 更加完善,但是我们同时也想了解在窗口统计这个常用场景下两个框架的性能。
精确计算场景(即消息投递语义为“恰好一次”)
Storm 仅能保证“至多一次” (At Most Once) 和“至少一次” (At Least Once) 的消息投递语义,即可能存在重复发送的情况。有很多业务场景对数据的精确性要求较高,希望消息投递不重不漏。Flink 支持“恰好一次” (Exactly Once) 的语义,但是在限定的资源条件下,更加严格的精确度要求可能带来更高的代价,从而影响性能。因此,我们测试了在不同消息投递语义下两个框架的性能,希望为精确计算场景的资源规划提供数据参考。
2.2 性能指标
吞吐量(Throughput)
单位时间内由计算框架成功地传送数据的数量,本次测试吞吐量的单位为:条/秒。反映了系统的负载能力,在相应的资源条件下,单位时间内系统能处理多少数据。吞吐量常用于资源规划,同时也用于协助分析系统性能瓶颈,从而进行相应的资源调整以保证系统能达到用户所要求的处理能力。假设商家每小时能做二十份午餐(吞吐量 20 份/小时),一个外卖小哥每小时只能送两份(吞吐量 2 份/小时),这个系统的瓶颈就在小哥配送这个环节,可以给该商家安排十个外卖小哥配送。延迟(Latency)
数据从进入系统到流出系统所用的时间,本次测试延迟的单位为:毫秒。反映了系统处理的实时性。金融交易分析等大量实时计算业务对延迟有较高要求,延迟越低,数据实时性越强。假设商家做一份午餐需要 5 分钟,小哥配送需要 25 分钟,这个流程中用户感受到了 30 分钟的延迟。如果更换配送方案后延迟变成了 60 分钟,等送到了饭菜都凉了,这个新的方案就是无法接受的。3. 测试环境
为 Storm 和 Flink 分别搭建由 1 台主节点和 2 台从节点构成的 Standalone 集群进行本次测试。其中为了观察 Flink 在实际生产环境中的性能,对于部分测内容也进行了 on Yarn 环境的测试。
3.1 集群参数
3.2 框架参数
4. 测试方法
4.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 默认参数
Storm 和 Flink 默认均为 At Least Once 语义。Storm 开启 ACK,ACKer 数量为 1。Flink 的 Checkpoint 时间间隔为 30 秒,默认 StateBackend 为 Memory。保证 Kafka 不是性能瓶颈,尽可能排除 Kafka 对测试结果的影响。测试延迟时数据生产速率小于数据处理能力,假设数据被写入 Kafka 后立刻被读取,即 eventTime 等于数据进入系统的时间。测试吞吐量时从 Kafka Topic 的最旧开始读取,假设该 Topic 中的测试数据量充足。4.3 测试用例
Identity
Identity 用例主要模拟“输入-输出”简单处理场景,反映两个框架本身的性能。输入数据为“msgId, eventTime”,其中 eventTime 视为数据生成时间。单条输入数据约 20 B。进入作业处理流程时记录 inTime,作业处理完成后(准备输出时)记录 outTime。作业从 Kafka Topic Data 中读取数据后,在字符串末尾追加时间戳,然后直接输出到 Kafka。输出数据为“msgId, eventTime, inTime, outTime”。单条输出数据约 50 B。Sleep
Sleep 用例主要模拟用户作业耗时较长的场景,反映复杂用户逻辑对框架差异的削弱,比较两个框架的调度性能。输入数据和输出数据均与 Identity 相同。读入数据后,等待一定时长(1 ms)后在字符串末尾追加时间戳后输出Windowed Word Count
Windowed Word Count 用例主要模拟窗口统计场景,反映两个框架在进行窗口统计时性能的差异。此外,还用其进行了精确计算场景的测试,反映 Flink 恰好一次投递的性能。输入为 JSON 格式,包含 msgId、eventTime 和一个由若干单词组成的句子,单词之间由空格分隔。单条输入数据约 150 B。读入数据后解析 JSON,然后将句子分割为相应单词,带 eventTime 和 inTime 时间戳发给 CountWindow 进行单词计数,同时记录一个窗口中最大最小的 eventTime 和 inTime,最后带 outTime 时间戳输出到 Kafka 相应的 Topic。Spout/Source 及 OutputBolt/Output/Sink 并发度恒为 1,增大并发度时仅增大 JSONParser、CountWindow 的并发度。由于 Storm 对 window 的支持较弱,CountWindow 使用一个 HashMap 手动实现,Flink 用了原生的 CountWindow 和相应的 Reduce 函数。5. 测试结果5.1 Identity 单线程吞吐量
5.2 Identity 单线程作业延迟
5.3 Sleep 吞吐量
5.4 Sleep 单线程作业延迟(中位数)
5.5 Windowed Word Count 单线程吞吐量

5.6 Windowed Word Count Flink At Least Once 与 Exactly Once 吞吐量对比
5.7 Windowed Word Count Storm At Least Once 与 At Most Once 吞吐量对比
5.8 Windowed Word Count 单线程作业延迟
5.9 Windowed Word Count Flink At Least Once 与 Exactly Once 延迟对比
5.10 Windowed Word Count Storm At Least Once 与 At Most Once 延迟对比
5.11 Windowed Word Count Flink 不同 StateBackends 吞吐量对比
5.12 Windowed Word Count Flink 不同 StateBackends 延迟对比
6. 结论及建议6.1 框架本身性能
由 5.1、5.5 的测试结果可以看出,Storm 单线程吞吐约为 8.7 万条/秒,Flink 单线程吞吐可达 35 万条/秒。Flink 吞吐约为 Storm 的 3-5 倍。由 5.2、5.8 的测试结果可以看出,Storm QPS 接近吞吐时延迟(含 Kafka 读写时间)中位数约 100 毫秒,99 线约 700 毫秒,Flink 中位数约 50 毫秒,99 线约 300 毫秒。Flink 在满吞吐时的延迟约为 Storm 的一半,且随着 QPS 逐渐增大,Flink 在延迟上的优势开始体现出来。综上可得,Flink 框架本身性能优于 Storm。6.2 复杂用户逻辑对框架差异的削弱
对比 5.1 和 5.3、5.2 和 5.4 的测试结果可以发现,单个 Bolt Sleep 时长达到 1 毫秒时,Flink 的延迟仍低于 Storm,但吞吐优势已基本无法体现。因此,用户逻辑越复杂,本身耗时越长,针对该逻辑的测试体现出来的框架的差异越小。6.3 不同消息投递语义的差异
由 5.6、5.7、5.9、5.10 的测试结果可以看出,Flink Exactly Once 的吞吐较 At Least Once 而言下降 6.3%,延迟差异不大;Storm At Most Once 语义下的吞吐较 At Least Once 提升 16.8%,延迟稍有下降。由于 Storm 会对每条消息进行 ACK,Flink 是基于一批消息做的检查点,不同的实现原理导致两者在 At Least Once 语义的花费差异较大,从而影响了性能。而 Flink 实现 Exactly Once 语义仅增加了对齐操作,因此在算子并发量不大、没有出现慢节点的情况下对 Flink 性能的影响不大。Storm At Most Once 语义下的性能仍然低于 Flink。6.4 Flink 状态存储后端选择
Flink 提供了内存、文件系统、RocksDB 三种 StateBackends,结合 5.11、5.12 的测试结果,三者的对比如下:
6.5 推荐使用 Flink 的场景
综合上述测试结果,以下实时计算场景建议考虑使用 Flink 框架进行计算:
要求消息投递语义为 Exactly Once 的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景。7. 展望本次测试中尚有一些内容没有进行更加深入的测试,有待后续测试补充。例如:Exactly Once 在并发量增大的时候是否吞吐会明显下降?用户耗时到 1ms 时框架的差异已经不再明显(Thread.sleep() 的精度只能到毫秒),用户耗时在什么范围内 Flink 的优势依然能体现出来?本次测试仅观察了吞吐量和延迟两项指标,对于系统的可靠性、可扩展性等重要的性能指标没有在统计数据层面进行关注,有待后续补充。Flink 使用 RocksDBStateBackend 时的吞吐较低,有待进一步探索和优化。关于 Flink 的更高级 API,如 Table API & SQL 及 CEP 等,需要进一步了解和完善。8. 参考内容分布式流处理框架——功能对比和性能评估.intel-hadoop/HiBench: HiBench is a big data benchmark suite.Yahoo的流计算引擎基准测试.Extending the Yahoo! Streaming Benchmark.
- 蜜度索骥:以跨模态检索技术助力“企宣”向上生长
- 2025年全球网络安全支出将激增15% | 行业观察
- 华为数据存储两大新品齐发:全面闪存化,全面向AI
- 数据中心太耗电,微软携手Constellation Energy探索核能供电新途径
- 戴尔一周内发生两起数据泄露事件,Atlassian工具成泄露源头
- 华为ICT学院年会2024举办,ICT学院3.0计划正式启航
- 华为启动全球金融伙伴“融海计划”,共创行业新价值
- 华为联合多家伙伴发布《现代化金融核心系统白皮书:实践篇》
- 华为发布数据智能解决方案5.0,加速金融大模型应用从“赋能”到“产能”
- 华为加速推动鲲鹏昇腾原生创新,未来三年赋能百万原生人才
- 第九届华为ICT大赛中国赛区报名通道开启,大赛真题集首发
免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。