杭州欧若数网科技有限公司
1 研究现状
随着云计算、物联网以及移动设备的快速发展,个人数据的生成量与时效性产生了质的变化,对于传统单机数据处理系统提出了巨大挑战。为解决单台计算机数据处理能力不足的问题,分布式系统应运而生。分布式系统是一组计算机的集合,通过网络相互连接,并且对外表现为一个整体系统,具有高度内聚性与透明性。系统拥有多种物理与逻辑资源,包括内存、网络与计算资源,通过提交与分配作业的方式,在集群中运行计算逻辑。
目前分布式系统主要分为批处理与流处理两大类。批处理系统通过读取存储在分布式文件系统上的大规模数据集进行并行计算。批处理系统支持高吞吐量作业,但是数据处理延迟较大,时间粒度通常为小时级或天级,不适合时效性要求较高场景。区别于批处理系统将计算任务调度到不同节点进行计算,流式计算系统通过消息传递机制将数据分发到集群中不同节点进行并行处理。本文介绍了一种基于Actor模型的高性能、可扩展分布式流式处理系统。
相关工作
面向对象模型通过对现实世界的抽象,在计算机软件领域取得了巨大的成功。随着CPU性能的提升和多处核理器的普及,为防止多个处理器同时操作同一个对象造成数据不一致,面向对象模型使用锁机制限制资源同步访问。锁机制虽然能控制资源同步访问,但是存在一定的性能损失,并且不利于分布式系统设计与实现。
1973年Carl Hewitt在博士论文中提出了一种基于消息驱动的并行计算模型,称为Actor模型。Actor是模型中最小的执行单元,认为Actor为一个容器,在其中封装状态和行为。Actor之间不存在共享状态,不同Actor实体之间通过异步消息传递进行通信,消除了锁机制带来的性能损耗。Actor将收到的消息缓存在邮箱之中,采用先入先出队列缓存消息。
系统架构
Gearpump是一种基于Actor模型的轻量级流处理系统,提供毫秒级延迟计算服务。Gearpump采用主从结构,系统中包含至少一个Master节点和若干个Worker节点,Master与Worker均为Actor实例。Master节点为集群核心组件,主要负责管理集群总体资源与各个Worker节点运行状态。Master中包含AppMaster和ResourceScheduler两部分,AppMaster主要负责在Worker节点上调度Task实例运行并且管理应用程序状态,ResourceScheduler为不同应用程序分配资源。若干Master节点可以形成一个集群,Master状态通过Gossip协议以无冲突的形式进行交换,以确保集群中不存在单点,实现Master高可用性。Worker节点负责任务实际运行,并将运行状态上报给Master节点。Executor是一个Java虚拟机进程,主要管理Task生命周期及故障恢复。Task是实际运行计算任务的最小执行单元,Executor负责调度运行,每个Task可以向其他Task发送并接收数据。
在金融等领域中,同一条消息处理两次是无法接受的,消息丢失发现机制与Exactly Once处理机制尤其重要。Gearpump中使用控制消息AckRequest与Ack发现消息丢失现象。目标 Task统计最后一个AckRequest消息之后收到消息数量,以及应答给源Task消息数量,对比两者可发现消息丢失。当发现消息丢失时,恢复程序将根据最后检查点进行恢复。数据源从检查点中的时间戳重放消息,检查点间隔由全局时钟服务动态决定。每个数据源追踪输入消息流最大时间戳,并将检查点间隔发送给各个Task实例。
Gearpump支持三种部署模式,为本地模式,独立模式和YARN模式。本地模式将Master与Worker进场在同一个Java虚拟机进程中运行。本地模式主要用于程序开发与测试。独立模式可以将Master进程与Worker进程分布在不同节点上运行。YARN模式基于Hadoop YARN组件. Apache Hadoop YARN 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
应用程序接口
Gearpump应用程序使用有向无环图描述数据流,图中节点表示计算实例,边表示节点之间数据流,节点之间通过消息的形式进行数据传递。消息是一个由value和timestamp组成的二元组,value为任意对象,由Gearpump系统进行序列化,用于表示消息体。Timestamp微消息生成时间戳。
Gearpump编程模型主要包括三部分:DataSource、Task 和DataSink。数据通过DataSource组件读入Gearpump应用程序。Gearpump应用程序使用有向无环图描述数据处理结构,Task是程序的最小计算单元。在Task启动时,onStart函数被调用,用于初始化Task执行环境。onNext函数用于处理上流Task发送来的消息,并传递给下游Task。当应用程序停止时,调用onStop函数释放onStart函数申请的资源。最终应用程序处理结构通过DataSink组件写入数据存储系统。
GearPump中提供了一组面向流式处理的领域描述语言,用于定义程序结构,例如Graph(A~>B~>C,A~>C,B~>C),Graph由一组Processor路径组成,其中A~>B~>C为一条Processor路径。Processor包含一组并行Task,Processor之间由Partitioner组件控制消息在Task之间混洗逻辑。Partitioner分为单播分区器和多播分区器两大类,其中单播分区器用于表示单Task到单Task之间的消息传递,多播分区器用于表示单Task向多Task之间的消息映射。
实验测试
实验环境为五台物理服务器,其中一台服务器作为Master节点,四台服务器作为Worker节点。服务器配置为Linux 操作系统,8G内存,4核处理器,CPU主频2.4G,节点之间通过千兆网络相连接。实验测试程序选取一个英文单词词表,数据发送端Source从中选取任意单词,发送至数据接收端Sink,通过调整并行度测试消息传输性能与可扩展性。
实验一部署在单独节点上,实验部署在四个节点上,实验主要测试Gearpump系统性能与水平扩展能力。实验部署在四个节点上,测试程序运行结果与并行度基本符合线性扩展特性,实验结果基本符合预期。
四节点吞吐量测试结果
结束语
本文介绍了一种基于Actor模型的流式处理系统。Gearpump使用Akka组件实现其消息传递功能,同时支持限流与容错特性。Gearpump抽象了流处理模型,提供了DataSource、Task和DataSink三个组件,其中封装了数据处理逻辑。Gearpump支持三种部署模型,本地模式运行于单个Java虚拟机中,主要用于测试开发。Standalone模式和Yarn模式是分布式集群模型,Master和Worker运行于不同Java虚拟机之中,实现分布式处理。作为一个高性能可扩展的流处理系统,Gearpump在消息序列化性能方面仍有优化空间。与此同时SQL on Gearpump组件也可进行继续研究,提高流式处理程序表现力。目前Gearpump已经在Apache基金会中进行孵化,相信在不久的未来将应用于诸多场景。
参考文献:
[1] Michael Stonebraker U?ur ?etintemel Stan Zdonik The 8 Requirements of Real-Time Stream Processing .ACM SIGMOD Record Volume 34 Issue 4, December 2005 Pages 42-47
[2] Google Jeffrey Dean Sanjay Ghemawat MapReduce:Simplified Data Processing on Large Clusters https://research.google.com/archive/mapreduce.html
[3] Google Tyler Akidau, Alex Balikov, Kaya Bekiroglu MillWheel: Fault-Tolerant Stream Processing at Internet Scale https://research.google.com/pubs/pub41378.html
[4] Philipp Haller, Martin Odersky Event-Based Programming without Inversion of Control http://lampwww.epfl.ch/~odersky/papers/jmlc06.pdf
[5] https://akka.io/
[6] http://gearpump.apache.org/overview.html
[7] George Coulouris Jean Dollimore 分布式系统:概念与设计
[8] 响应式架构:消息模式Actor实现与Scala、Akka应用集成
论文作者:王辰光
论文发表刊物:《科技尚品》2019年第3期
论文发表时间:2019/7/18
标签:节点论文; 消息论文; 系统论文; 分布式论文; 模型论文; 模式论文; 集群论文; 《科技尚品》2019年第3期论文;