点击上方蓝字关注我们
分布式数据流计算系统的数据缓存技术综述
袁旭初, 付国, 毕继泽, 张岩峰, 聂铁铮, 谷峪, 鲍玉斌, 于戈
东北大学计算机科学与工程学院,辽宁 沈阳 110169
论文引用格式:
袁旭初, 付国, 毕继泽, 张岩峰, 聂铁铮, 谷峪, 鲍玉斌, 于戈.分布式数据流计算系统的数据缓存技术综述. 大数据[J], 2020, 6(3):101-116
YUAN X C, FU G, BI J Z, ZHANG Y F, NIE T Z, GU Y, BAO Y B, YU G.Survey on data caching technology of distributed dataflow system. Big Data Research[J], 2020, 6(3): 101-116
1 引言
计算机的计算模型可以分为控制流和数据流两大类。控制流计算模型按指令的顺序驱动操作,计算机内的数据是否参加运算依赖于当时执行的指令。图灵机理论是控制流计算机的基础,控制流计算机也被称为冯·诺伊曼型计算机,它是主流计算机一直采用的基本体系结构。控制流天然擅长描述控制逻辑,但其使用变量缓存中间结果,不利于并行或异构计算抽象。数据流计算模型采用数据驱动方式,只有当一条或一组指令需要的操作数全部准备好时,才能激发相应指令的一次执行,执行结果又流向等待这一数据的下一条或一组指令,以驱动该条或该组指令的执行。指令之间天然的依赖关系决定了指令的执行顺序,指令按照数据流图执行。
数据流计算模型在许多方面优于控制流计算模型,其优点主要体现在以下3个方面。
(1)高度并行计算
在数据流方法中,由于没有指令执行顺序的限制,从理论上来说,指令执行更加灵活,通过系统优化可以获得最大的并行性。相似地,其灵活性同样适用于高度异构计算。
(2)支持流水线处理
由于在指令中直接使用数值本身,而不是使用存放数值的地址,因此可以在过程级及指令级充分开发异步并行性,把串行执行算子实际处理的数据变成一条异步处理流水线,即前一个算子处理完部分结果后就让后一个算子开始处理。
(3)函数式编程
面向数据流的编程模型对丰富的算子进行了抽象,通过用户定义函数为算子指定用户处理逻辑,用户无须使用变量维护中间状态,实现优化空间巨大且灵活的函数式编程。
目前许多主流的计算系统(如Spark、Flink、TensorFlow、Google Dataflow等)采用了数据流编程模型。一个数据流程序中一般包含算子和中间结果数据两大类元素,算子还包含数据源算子(source)、数据池算子(sink)、转换算子(transformer)。数据源是数据的生产者,如文件或者视频采集设备;数据池指定程序输出的位置,如文件或者数据库;转换算子是系统提供或者用户自定义的数据操作集合,描述对一个或多个输入数据的处理过程,同时输出一个或多个中间结果数据。中间结果数据位于各算子之间,是由算子产生或供算子消费的数据。数据流处理程序采用算子连接数据流的模式,当一个数据流程序被执行的时候,它会被映射为一个有向无环图(directed acyclic graph,DAG),数据流图的顶点为算子,数据流图的边为中间结果数据。程序启动时从一个或多个数据源算子开始,结束于一个或多个数据池算子。
数据流模型不仅被应用于内存计算中,也被应用到分布式集群(如Spark)或者异构计算环境(如TensorFlow)中,算子可能被设计为跨多台机器的分布式算子,有些算子在CPU执行,有些算子在GPU执行,甚至是跨CPU-GPU执行。而算子之间数据的流动需要考虑跨网络或者跨CPU-GPU的情况,数据流的维护和管理也不仅在内存中完成。在这种分布式数据流系统和异构数据流系统中,算子和数据不再统一存在于单机内存中。算子之间数据生产和数据消化的速度不一致可能会导致数据堆积或者算子闲置等问题,造成严重的空间开销,影响数据流系统的效率。为了支持高效的数据流系统,需要为分布式数据流系统和异构数据流系统设计数据流的缓存系统,以保证数据流在分布式计算节点之间或者异构CPU-GPU之间的高效缓存和移动。然而,目前并没有针对分布式或异构数据流系统的通用数据流缓存系统。
现有的消息队列(message queue,MQ)系统(如Kafka等)常被用作数据源算子的数据缓存系统,特别是为视频采集设备这种主动推送数据源提供数据缓冲支持。这些系统利用优化的分布式存储将数据消息存到保持数据有序性的消息队列中,可以在一定程度上满足缓存需求。
本文选取Kafka、RabbitMQ、ActiveMQ、Pulsar 5个典型的分布式消息队列系统进行系统分析,并分析未来的数据流缓存系统的需求和研究方向。
2 分布式数据流计算系统概述
2.1 数据流计算模型
计算模型是对计算任务完成过程的一种抽象描述,主要由3个部分组成:计算任务的描述方法、计算任务的执行机构以及计算任务在执行机构上的运行方法。根据计算任务的描述形式,可以将计算模型分为控制流计算模型和数据流计算模型。在控制流计算模型中,采用控制流的方式描述计算任务。控制流即以控制驱动程序。以下面包含控制流概念的代码1为例,由于控制条件的存在,无论输入是多少,总是执行被控制的部分,而不执行另一部分。在控制流计算模型中,进行数据传递的关键是借助变量保存中间状态。通过中间变量,可以根据任务的执行逻辑将其划分为不同的阶段,这样一来,每个阶段只需要完成一部分逻辑子功能即可。
将代码1的控制逻辑用数据流的方式表示,如代码2所示,代码的执行逻辑以流水线的方式按顺序执行。不论是否满足条件,均执行相应代码,只不过数据总是只满足一种情况,最后将两部分的结果做交集。如果上游输入数据不断到来,这段代码便可以不断地执行下去,并且总是同时执行真(ture)和假(false)的分支逻辑,但是无论何时,总有一个分支上的流水线的数据集为空。
在数据流计算模型中,用数据流图的形式表示计算任务。根据任务中不同子任务的依赖关系将其转化为数据流图,复杂的程序逻辑便可以容易地以流水线的方式执行,同时提高执行效率。数据流编程模型是以数据驱动程序的,一个处理逻辑的输出作为下一个处理逻辑的输入,无须维护数据的中间状态,将这种处理逻辑抽象为算子,通常不同算子之间的任务相互独立,可以在不同的线程上执行。在分布式或异构的环境下,算子也可以在不同的机器或容器内执行。只要数据到达,算子即可开始处理,从而使得各个算子形成流水线的结构,数据则在流水线中被并行处理,这种处理方式在处理具有复杂依赖关系的程序逻辑时有天然的优势。
在数据流图中,用节点和边描述程序逻辑。其中