您的位置:首页 > 其它

RDD(转):一种基于内存的集群计算的容错性抽象方法(一)

2013-01-28 19:57 211 查看


摘要:

本文提出了弹性分布式数据集(RDD,Resilient Distributed Datasets),这是一种分布式的内存抽象方法,允许在大型集群上执行基于内存的计算(In-Memory Computing),与此同时还保持了MapReduce等数据流模型的容错特性。现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图 应用和机器学习领域很常见;二是交互式数据挖掘工具。这两种情况下,将数据保存在内存中能够极大地提高性能。为了有效地实现容错,RDD提供了一种高度受 限的共享内存,即RDD是只读的,并且只能通过其他RDD上的批量操作来创建。尽管如此,RDD仍然足以表示很多类型的计算,包括MapReduce和专 用的迭代编程模型(如Pregel)等。我们实现的RDD在迭代计算方面比Hadoop快二十多倍,同时还可以在5-7秒的延时内交互式地查询1TB的数 据集。

1.引言

无论是工业界还是学术界,都已经广泛使用高级集群编程模型来处理日益增长的数据,如MapReduce和Dryad。这些系统将分布式编程简化为自动提供位置感知性(locality-aware)调度、容错以及负载均衡,使得大量用户能够在商用集群上分析庞大的数据集。

大多数现有的集群计算系统都是基于非循环的数据流模型(acyclic data flow
model)。从稳定的物理存储(如分布式文件系统)中加载记录,一组确定性操作构成一个DAG,记录被传入这个DAG,然后写回稳定存储。通过这个
DAG数据流图,运行时自动完成调度工作及故障恢复。

尽管非循环数据流是一种很强大的抽象方法,但仍然有些应用无法使用这种方式描述。我们就是针对这些不太适合非循环模型的应用,它们的特点是在多个并行操作之间重用工作数据集。这类应用包括:

(1)机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数);

(2)交互式数据挖掘工具(用户反复查询一个数据子集)。基于数据流的架构并不明确支持工作集,所以需要将数据输出到磁盘然后在每次查询时重新加载,从而带来较大的开销。

我们提出了一种分布式的内存抽象,称为弹性分布式数据集(RDD,Resilient Distributed
Datasets),支持基于工作集的应用,同时具有数据流模型的特点:即自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将
工作集缓存在内存中,极大地加速了后期的工作集重用。

RDD提供了一种高度受限的共享内存方式,即RDD是只读的记录分区的集合,只能通过对其他RDD执行确定性的转换操作(如map,join和
group
by)而创建。这些限制保证了低开销的容错性。与分布式共享内存系统需要高成本的检查点(checkpoint)和回滚(rollback)不同,RDD
通过血统(lineage)来重建丢失的分区:RDD中包含如何从其他RDD衍生(即计算)出本RDD所需的相关信息,这样不需要检查点操作就可以重新构
建丢失的数据分区。尽管RDD不是一个普适的共享内存抽象,但却具备了良好的描述能力、可伸缩性和可靠性,非常适合大多数数据并行型应用。

第一个指出非循环数据流存在不足的并不是我们。例如,Google的Pregel,是一种专门用于迭代式图算法的编程模型;Twister和
HaLoop,是两种典型的迭代式MapReduce模型。但是,这些系统都是针对特定类型应用的。相比之下,RDD则为基于工作集的应用提供了更为通用
的抽象。用户可以对中间结果进行显式的命名和物化(materialize),控制其分区,然后使用它们执行特定的用户操作(而不是让运行时去循环执行一
系列MapReduce步骤)。RDD可以用来描述Pregel、迭代式MapReduce,以及这两种模型无法描述的其他应用,如交互式数据挖掘工具
(用户将数据集装入RAM,然后执行ad-hoc查询)。

我们RDD的实现称为Spark,用于开发多种并行应用。Spark采用Scala语言实现,提供类似于DryadLINQ的集成语言编程接口,方
便用户编写并行任务。此外,通过修改Scala解释器,Spark还可用于交互式查询大数据集。我们相信Spark是第一个允许集群上对大数据集进行交互
式分析的有效、通用的编程语言框架。

我们通过微基准(microbenchmark)和用户应用程序来评估RDD。实验表明,在处理迭代式应用上Spark比Hadoop快高达20多
倍,数据分析报表的性能提高了40多倍,同时能够在5-7秒的延时内交互式扫描1TB的数据集。此外,我们还在Spark之上实现了Pregel和
HaLoop编程模型(包括其位置优化策略,placement
optimization),以库的形式实现(分别使用了100和200行Scala代码)。最后,利用RDD内在的确定性特性,我们还创建了一种
Spark调试工具rddbg,允许用户在任务期间利用血统关系(lineage)重建RDD,然后像传统调试器那样重新执行任务。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: