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 读者交流群)。
评论