Twitter 推出新的流处理器系统 Heron

  • 张天雷

2015 年 6 月 15 日

话题:语言 & 开发架构

2011 年,Twitter 发布了开源的分布式流计算系统Storm。四年后,随着用户数量的急剧增加,Twitter 每天要处理的事件已经增加到十亿以上。Storm 系统应对如此庞大而复杂多样的流数据变得十分困难。为了解决该问题,Twitter 公司近期开发了一套全新的流处理系统——Heron。近日,Twitter 公司在 SIGMOD 2015 会议上对 Heron 进行了介绍

据 Twitter 公司的技术经理 Karthik Ramasamy 表示,Twitter 公司之前对 Storm 所存在的问题以及新平台的功能需求进行了详细分析。首先,Storm 调试能力较弱的问题曾让 Twitter 员工比较困扰。在 Storm 中,一个拓扑中的多个组件是捆绑在操作系统的一个进程中的。这就使得在拓扑出现问题时很难迅速定位问题的根源。用户不得不借助 cleaner 映射来帮助实现逻辑计算单元到物理进程的映射,从而辅助调试。此外,Storm 还需要专门的集群资源来运行拓扑。这就使得它不能利用流行的集群调度软件进行计算资源的优化。而且,在使用 Storm 时,用户需要手动隔离机器才能部署一个新的产品拓扑。同样,在拓扑不再使用时还需要手动回收机器资源。所有 Storm 存在的这些问题严重限制了 Twitter 处理事件的能力,而且带来时间和计算资源的巨大浪费。因此,Twitter 认为新的系统需要具备能够每分钟处理上亿的事件、大规模处理数据的延迟为亚秒级、行为可预测、高数据精度、遇到局部流量过高或流水线拥堵时能够自行调整输入速率、调试方便以及能够在共享式框架中部署等功能。

据 Karthik 透露,Twitter 当初考虑了三种可能的方案——扩展现有的 Storm 系统、利用别的已经开源的系统和开发一套新的系统。然而,Storm 系统的核心部件并不能满足现有的需求,而对其进行修改又需要比较长的开发周期。同时,其他的开源流处理框架不能满足 Twitter 在规模、吞吐量以及延迟等方面的需求。更关键的是,它们不能与 Storm 的 API 相兼容,迁移工作会十分复杂。因此,Twitter 最终决定开发一套全新的实时流处理系统。

根据设计要求,Heron 保持了与 Storm 相同的数据模型和 API,运行的也是由 spout 和 bolt 构成的拓扑。其总体框架包含了一个调度器和若干个拓扑。该调度器只是一个抽象模型,可以具体化为 YARN、Mesos 或者 ECS 等,方便资源共享。用户利用 API 提交拓扑到调度器后,调度器把每个拓扑当作一个单独的任务,并根据集群中节点利用情况分派若干个容器来执行。在这些容器中,其中一个运行拓扑 master,负责管理拓扑。剩余的每一个容器都需要运行一个流管理器来负责数据路由、一个 metric 管理器负责收集和报告各种各样的 metric 以及若干个 Heron 实例进程来运行用户自定义的 spout/bolt 代码。最后,拓扑的元数据,如物理规划和执行细节等都被保存在 ZooKeeper 中。

因此,Heron 能够轻松部署在运行如 Mesos、YARN 或者自定义调度框架的共享架构中。而且,Heron 向后兼容 Storm,使得原来基于 Storm 的其它系统可以继续使用。在 Heron 中运行已有的 Storm 拓扑完全不需要任何改变,移除了复杂的迁移过程。容器中的 Heron 实例执行的是单独的任务,保证了用户利用 jstack 或者 heap dump 等工具即可进行实例的调试。Metric 收集器又使得拓扑中任何组件的失效变得十分明显,大大降低了调试的难度。此外,Heron 有一个背压机制能够在运行过程中动态调整拓扑中数据流的速度,而不影响数据精度。同时,与 2013 年 10 月发布的 Storm 相比,Heron 的吞吐量可以到达其 10-14 倍,而延迟时间却只是它的 1/15-1/5,资源消耗也更低。

目前,Heron 已经作为 Twitter 的主要流处理器系统在运行,其中包括了数百个拓扑。由于 Heron 的低资源消耗特性,迁移后的新系统硬件减少了 2/3,大大提高了物理资源的利用率。Karthik 也表示,Twitter 公司非常愿意与 Storm 社区或者其他开源的实时流处理系统社区分享 Heron 的经验和教训。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

语言 & 开发架构