Fighting bird分享 http://blog.sciencenet.cn/u/tonia

博文

弹性分布式数据集:基于内存的集群计算的容错性抽象(3)

已有 9358 次阅读 2011-12-22 15:43 |个人分类:译文|系统分类:科研笔记| Spark

弹性分布式数据集:基于内存的集群计算的容错性抽象(1)—— 引言、RDD

弹性分布式数据集:基于内存的集群计算的容错性抽象(2)—— 编程接口、RDD实现实例、任务调度

弹性分布式数据集:基于内存的集群计算的容错性抽象(3)—— 实现、实验结果


6. 实现


我们使用10000Scala代码实现了Spark。系统可以使用任何Hadoop数据源(如HDFSHbase)作为输入,这样很容易与Hadoop环境集成。Spark以库的形式实现,不需要修改Scala编译器。


这里讨论关于实现的三方面问题:(1)修改Scala解释器,允许交互模式使用Spark6.1);(2)缓存管理(6.2);(3)调试工具rddbg6.3)。


6.1 解释器的集成

RubyPython一样,Scala也有一个交互式shell。基于内存的数据可以实现低延时,我们希望允许用户从解释器交互式地运行Spark,从而在大数据集上实现大规模并行数据挖掘。


通常Scala解释器将用户输入的每一行编译为一个类,装载到JVM中,然后执行函数。这个类是一个包含输入行变量或函数的单态(singleton)对象,并在一个初始化函数中运行这行代码。例如,如果用户敲入代码 var x = 5; println(x),则解释器会定义一个包含xLine1类,并将第2行编译为println(Line1.getInstance().x)


Spark中我们对解释器做了两点改动:

1. 类传输(class shipping):解释器支持每行上创建的类以HTTP传输,这样worker节点就能获取这些类的字节码。

2. 改进的代码生成逻辑:通常每行上创建的单态对象通过对应类上的静态方法进行访问。也就是说,如果要序列化一个引用前面代码行变量的闭集(closure),比如上面的例子Line1.xJava不会根据对象关系传输包含xLine1实例。所以worker节点不会收到x。我们将这种代码生成逻辑改为直接引用各个行对象的实例。


7说明了解释器如何将用户输入的一组代码行解释为Java对象。


(图参见原文

7 Spark解释器如何将用户输入的两行代码解释为Java对象

 

Spark解释器便于处理大量对象关系引用(trace),并且有利于HDFS数据集的探究。我们计划以Spark解释器为基础,开发提供高级数据分析语言支持的交互式工具,比如SQLMatlab的变种。


6.2 Cache管理

Worker节点将RDD分区以Java对象的形式缓存在内存中。由于大部分操作是基于扫描的,采取RDD级的LRU(最近最少使用)替换策略(即不会为了装载一个RDD分区而将同一RDD的其他分区替换出去)。目前这种简单的策略适合大多数用户应用。另外,使用带参数的cache操作可以设定RDD的缓存优先级。


6.3 rddbgRDD程序的调试工具

RDD的初衷是为了支持容错的确定性再计算(re-computation),这个特性使得调试更容易。我们创建了一个名为rddbg的调试工具,使用程序记录的lineage信息,允许用户:(1)重建任何由程序创建的RDD,并执行交互式查询;(2)使用一个单进程Java调试器(如jdb)传入计算好的RDD分区,重新运行job中的任何任务。


我们强调一下rddbg不是一个完全重放的(replay)调试器:特别是不对非确定性的代码或行为进行重放。但如果某个任务一直运行很慢(比如由于数据分布不均匀或者异常输入等原因),仍然可以用它来帮助找到其中的逻辑错误和性能错误。


Rddbg给程序执行带来的开销很小。程序本来就需要将各个RDD中的所有闭包(closure)序列化并通过网络传送,只不过使用rddbg同时还要将这些闭集记录到磁盘。


7. 实验评估


我们在Amazon EC2上进行了一系列实验来评估SparkRDD的性能,并与Hadoop及其他应用程序的基准(benchmark)进行了对比。总的说来,结果如下:


(1)对于迭代式机器学习应用,SparkHadoop20多倍。这种加速比是因为:数据存储在内存中,同时Java对象缓存避免了反序列化操作(deserialization)。

(2)用户编写的应用程序执行结果很好。例如,Spark分析报表比Hadoop40多倍。

(3)如果节点发生失效,通过重建那些丢失的RDD分区,Spark能够实现快速恢复。

(4)Spark能够在5-7s延时范围内,交互式地查询1TB大小的数据集。


(具体实验细节参见原文


本系列文章《弹性分布式数据集:基于内存的集群计算的容错性抽象》系《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》译文。原文参见这里



https://blog.sciencenet.cn/blog-425672-520969.html

上一篇:弹性分布式数据集:基于内存的集群计算的容错性抽象(2)
下一篇:Iterative MapReduce
收藏 IP: 75.180.53.*| 热度|

1 crossludo

该博文允许注册用户评论 请点击登录 评论 (8 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-22 03:54

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部