欢迎来到天天文库
浏览记录
ID:17422091
大小:314.40 KB
页数:12页
时间:2018-08-31
《spark分布式计算和rdd模型研究》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1背景介绍现今分布式计算框架像MapReduce和Dryad都提供了高层次的原语,使用户不用操心任务分发和错误容忍,非常容易地编写出并行计算程序。然而这些框架都缺乏对分布式内存的抽象和支持,使其在某些应用场景下不够高效和强大。RDD(ResilientDistributedDatasets弹性分布式数据集)模型的产生动机主要来源于两种主流的应用场景:Ø 迭代式算法:迭代式机器学习、图算法,包括PageRank、K-means聚类和逻辑回归(logisticregression)Ø 交互式数据挖掘工具:用户在同一数据子集上运行多
2、个Adhoc查询。不难看出,这两种场景的共同之处是:在多个计算或计算的多个阶段间,重用中间结果。不幸的是,在目前框架如MapReduce中,要想在计算之间重用数据,唯一的办法就是把数据保存到外部存储系统中,例如分布式文件系统。这就导致了巨大的数据复制、磁盘I/O、序列化的开销,甚至会占据整个应用执行时间的一大部分。为了解决这种问题,研究人员为有这种数据重用需要的应用开发了特殊的框架。例如将中间结果保存在内存中的迭代式图计算框架Pregel。然而这些框架只支持一些特定的计算模式,而没有提供一种通用的数据重用的抽象。于是,RDD横空出
3、世,它的主要功能有:Ø 高效的错误容忍Ø 中间结果持久化到内存的并行数据结构Ø 可控制数据分区来优化数据存储Ø 丰富的操作方法对于设计RDD来说,最大的挑战在于如何提供高效的错误容忍(fault-tolerance)。现有的集群上的内存存储抽象,如分布式共享内存、key-value存储、内存数据库以及Piccolo等,都提供了对可变状态(如数据库表里的Cell)的细粒度更新。在这种设计下为了容错,就必须在集群结点间进行数据复制(datareplicate)或者记录日志。这两种方法对于数据密集型的任务来说开销都非常大,因为需
4、要在结点间拷贝大量的数据,而网络带宽远远低于RAM。 与这些框架不同,RDD提供基于粗粒度转换(coarse-grainedtransformation)的接口,例如map、filter、join,能够将同一操作施加到许多数据项上。于是通过记录这些构建数据集(lineage世族)的粗粒度转换的日志,而非实际数据,就能够实现高效的容错。当某个RDD丢失时,RDD有充足的关于丢失的那个RDD是如何从其他RDD产生的信息,从而通过重新计算来还原丢失的数据,避免了数据复制的高开销。 尽管基于粗粒度转换的接口第一眼看
5、起来有些受限、不够强大,但实际上RDD却能很好地用于许多并行计算应用,因为这些应用本身自然而然地就是在多个数据项上运用相同的操作。事实上,RDD能够高效地表达许多框架的编程模型,如MapReduce、DryadLINQ、SQL、Pregel和HaLoop,以及它们处理不了的交互式数据挖掘应用。2RDD简介2.1概念RDD是一种只读的、分区的记录集合。具体来说,RDD具有以下一些特点:Ø 创建:只能通过转换(transformation,如map/filter/groupBy/join等,区别于动作action)从两种数据源中创建
6、RDD:1)稳定存储中的数据;2)其他RDD。Ø 只读:状态不可变,不能修改Ø 分区:支持使RDD中的元素根据那个key来分区(partitioning),保存到多个结点上。还原时只会重新计算丢失分区的数据,而不会影响整个系统。Ø 路径:在RDD中叫世族或血统(lineage),即RDD有充足的信息关于它是如何从其他RDD产生而来的。Ø 持久化:支持将会·被重用的RDD缓存(如in-memory或溢出到磁盘)Ø 延迟计算:像DryadLINQ一样,Spark也会延迟计算RDD,使其能够将转换管道化(pipelinetra
7、nsformation)Ø 操作:丰富的动作(action),count/reduce/collect/save等。关于转换(transformation)与动作(action)的区别,前者会生成新的RDD,而后者只是将RDD上某项操作的结果返回给程序,而不会生成新的RDD:2.2例子假设网站中的一个WebService出现错误,我们想要从数以TB的HDFS日志文件中找到问题的原因,此时我们就可以用Spark加载日志文件到一组结点组成集群的RAM中,并交互式地进行查询。以下是代码示例: 首先行1从HDFS文件中创建出
8、一个RDD,而行2则衍生出一个经过某些条件过滤后的RDD。行3将这个RDDerrors缓存到内存中,然而第一个RDDlines不会驻留在内存中。这样做很有必要,因为errors可能非常小,足以全部装进内存,而原始数据则会非常庞大。经过缓存后,现在就
此文档下载收益归作者所有