Spark RDD 论文详解(一)摘要和介绍

前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系


目录

Spark RDD 论文详解(一)摘要和介绍

Spark RDD 论文详解(二)RDDs

Spark RDD 论文详解(三)Spark 编程接口

Spark RDD 论文详解(四)表达 RDDs

Spark RDD 论文详解(五)实现

Spark RDD 论文详解(六)评估

Spark RDD 论文详解(七)讨论

Spark RDD 论文详解(八)相关工作和结尾


思维导图

在这里插入图片描述


正文

这里分享一下 RDD 论文下载链接:

Resilient Distributed Datasets: A Fault-tolerant Abstraction for In-memory Cluster Computing


标题

Resilient Distributed Datasets: A Fault-tolerant Abstraction for In-memory Cluster Computing

从标题就可以看出,RDD 虽然翻译过来是弹性分布式数据集,但是更进一步的解释是:一个用于内存集群计算的容错抽象

摘要

原文翻译

我们提出了弹性分布式数据集(RDDs)这个概念,这是一个分布式的内存抽象,它可以让程序员以容错的方式在大型集群上进行内存计算。

当前(2012 年)的计算框架在处理迭代式算法场景与交互性数据挖掘场景时性能非常差,这个是 RDDs 提出的动机。

如果能将数据保存在内存中,将会使得上面两种场景的性能提高一个数量级。

为了能达到高效的容错,RDDs 提供了一种受限制的共享内存的方式,这种方式是基于粗粒度的转换共享状态而非细粒度的更新共享状态。

然而,我们分析表明 RDDs 可以表达出很多种类的计算,包括目前专门从事迭代任务的编程计算模型,比如 Pregel,当然也可以表达出目前模型表达不出的计算。

我们通过 Spark 系统来实现了 RDDs,并且通过各种各样的用户应用和测试来评估了这个系统。


解析

为了更好的理解上面的摘要,这里介绍一下 Apache Spark 的历史背景。

Apache Spark 来源于加州大学伯克利分校 2009 年的 Spark 研究项目,该校 AMPLab 实验室在 2010 年发表了题为:Spark:Cluster Computing with Working Sets 的论文。

这篇论文的下载链接在这里——Spark:Cluster Computing with Working Sets

在当时,Hadoop MapReduce 是运行在计算机集群上的主要并行计算引擎,是第一个在数千个节点集群上进行并行数据处理的开源系统。

AMPLab 曾与多位早期的 MapReduce 用户合作,以了解这种新编程模型的优缺点,因此能够针对多个实际中的问题,开始设计更通用的计算平台。

此外,他们还与加利福尼亚大学伯克利分校的 Hadoop 用户合作,了解他们对平台的需求,特别是使用迭代算法进行大规模机器学习的团队,他们需要对数据进行多次迭代处理。

在于 MapReduce 用户的交流中,有两件事很确定。

1. 集群计算具有巨大的潜力。

在使用 MapReduce 的每个组织机构中,可以使用现有数据构建全新的应用程序,并且许多研究组在尝试了入门示例后开始使用该系统。

2. MapReduce 引擎构建大型应用程序既具有挑战性又低效。

例如,典型的机器学习算法可能需要对数据进行 10 次或20 次迭代处理,而在 MapReduce 中,每次迭代都必须通过一个 MapReduce 作业来完成,必须在分布式集群上重新读取全部数据并单独启动一次作业。

为了解决这个问题,Spark 团队首先设计了一个基于函数式编程的 API,可以简洁的表达多计算步骤的应用程序。

然后,该团队通过一个新的引擎实现了这个 API,该引擎可以跨多个计算步骤执行高效的内存数据共享。

该团队还开始与伯克利分校和校外用户一起测试该系统。


1、介绍

原文翻译

像 MapReduce 和 Dryad 等分布式计算框架已经广泛应用于大数据集的分析。

这些系统可以让用户不用担心分布式工作以及容错,而是使用一系列的高层次的操作 API 来达到并行计算的目的。

虽然当前的框架提供了大量的对访问利用计算资源的抽象,但是它们缺少了对利用分布式内存的抽象。

这样使得它们在处理需要在多个计算之间复用中间结果的应用的时候会非常的不高效。

数据的复用在迭代机器学习和图计算领域(比如 PageRank,K-means 以及线性回归等算法)是很常见的。

在交互式数据挖掘中,一个用户会经常对一个相同的数据子集进行多次不同的特定查询,所以数据复用在交互式数据挖掘也是很常见的。

然而,目前的大部分的框架对计算之间的数据复用的处理方式就是将中间数据写到一个可靠稳定的系统中(比如分布式文件系统),这样会由于数据的复制备份,磁盘的 I/O 以及数据的序列化而致应用任务执行很费时间。

认识到这个问题后,研究者们已经为一些需要中间数据复用的应用开发出了一些特殊的框架。

比如Pregel 在做迭代式图计算的时候会将中间结果放在内存中。

HaLoop 也提供了迭代式 MapReduce 接口。

然而,这些框架仅仅支持一些特殊的计算模式(比如循环一系列的 MapReduce 步骤),并且它们是隐式的为些计算模式提供数据共享。

它们没有提供更加普遍数据复用的抽象,比如可以让用户加载几个数据集到存中然后对这些内存中的数据集进行专门的查询。

在这篇论文中,我们提出了一个全新的抽象,叫做 RDDs,它可以高效的处理广泛的应用中涉及到的数据用的场景。

RDDs 是一个可以容错且并行的数据结构,它可以让用户显式的将中间结果数据集保存在内存中,可以控制数据集的分区来达到数据存放处理最优以及可以使用丰富的操作 API 来操作数据集。

在设计 RDDs 的时候,最大的挑战是定义一个可以高效容错的编程接口

已经存在的分布式内存抽象系统比如 distributed shared memory、key-value stores、databases 以及 Poccolo,都是提供了基于粒度的更新可变状态(比如 table 中的 cells)的接口。

基于这种接口下,保证容错的方式无非是将数据复备份到多台机器或者在多台机器上记录更新的日志,这两种方式在数据密集性的工作任务中都是非常的耗时的,因为需要通过网络传输在机器节点间复制大量的数据,宽带传输数据的速度远远比 RAM 内存慢,而这两种方式会占用大量的存储空间。

与这些系统相反,RDDs 提供了基于粗粒度转换(比如 map,filter 以及 join)的接口,这些接口可以对多条数据条目应用相同的操作。

这样就可以通过记录来生成某个数据集的一系列转换(就是这个数据集的 lineage ,中文翻译血缘)而不是记录真实的数据来达到提供高效的容错机制。

这个 RDD 就有足够的信息知道它是从哪个 RDDs 转换计算来的,如果一个 RDD 的分区数据丢失掉了,那么重新计算这个 RDD 所依赖的那个 RDD 对应的分区就行了。

因此可以很快且不用通过复制备份方式来恢复丢失的数据。

虽然基于粗粒度的转换一开始看起来受限制,但是 RDDs 非常适合很多并行计算的应用,因为这些应用基本都是在大量的数据元素上应用相同的操作方法。

事实上,我们分析表明 RDDs 不仅可以高效的表达出目前括 MapReduce,DryadLINQ,SQL,Pregel 以及 HaLoop 等系统提出的分布式编程模型,而且还能表达它们表达不了的新的应用的计算模型,比如交互型数据挖掘。

我们相信,RDDs 解决那些新的框架提出来计算需求的能力将会成为是 RDD 抽象强大的最有力证据。

我们在 Spark 系统中实现了 RDDs,这个系统已经在 UC Berkeley 以及好些个公司中应用于研究和生产应中。

Spark 和 DryadLINQ 类似,使用 scala 语言提供了很方便语言集成的编程接口

另外,Spark可以利用 scala 的解释器来对大数据集进行交互式的查询

我们相信 spark 是首个允许使用多种编程语言来进行分布式内存中交互式数据挖掘的系统。

我们通过为基准测试以及用户应用的测试两个方面来评估了 RDDs 和 spark。

我们分析显示,Spark 在迭代应用中可以比 hadoop 快上 20 倍以上、使得现实中的数据分析报表的速度提升了 40 倍以及使的交互式的扫描 1TB 数据集的延迟在 5-7 秒。

更重要的是,为了彰显 RDDs 的普遍性,我们基于Spark 用相对较小的程序(每个包只有 200 行代码)实现了 Pregel 和 Hadoop 的编程模型,包括它们使用的数据分布优化。

本篇论文以 RDDs(第二节)和 Spark(第三节)的概述开始。

然后在第四节中讨论 了RDDs 内部的表达、在第五节中讨论了我们的实现以及在第六节中讨论了实验结果。

最后,我们讨论了 RDDs 是怎么样来表达现在已存在的几个系统的编程模型(第七节)、调查相关工作(第八节)以及总结。


解析

看起来很长,实际上归纳起来就几点:

  1. 为了更好的数据复用,所以创建了分布式内存抽象- RDD。
  2. RDD 可以高效表达多种计算模型。
  3. 通过 lineage 可以实现高效容错。
  4. Spark 支持多种编程语言,支持 scala 的 REPL。
  5. 充分的测试数据表明,Spark 是真滴快!
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark RDD(弹性分布式数据集)是Spark中最基本的数据结构之一,它是一个不可变的分布式对象集合,可以在集群中进行并行处理。RDD可以从Hadoop文件系统中读取数据,也可以从内存中的数据集创建。RDD支持两种类型的操作:转换操作和行动操作。转换操作是指对RDD进行转换,生成一个新的RDD,而行动操作是指对RDD进行计算并返回结果。RDD具有容错性,因为它们可以在节点之间进行复制,以便在节点故障时恢复数据。 Spark RDD的特点包括: 1. 分布式:RDD可以在集群中进行并行处理,可以在多个节点上进行计算。 2. 不可变性:RDD是不可变的,一旦创建就不能修改,只能通过转换操作生成新的RDD。 3. 容错性:RDD具有容错性,因为它们可以在节点之间进行复制,以便在节点故障时恢复数据。 4. 惰性计算:RDD的计算是惰性的,只有在行动操作时才会进行计算。 5. 缓存:RDD可以缓存到内存中,以便在后续操作中快速访问。 Spark RDD的转换操作包括: 1. map:对RDD中的每个元素应用一个函数,生成一个新的RDD。 2. filter:对RDD中的每个元素应用一个函数,返回一个布尔值,将返回值为true的元素生成一个新的RDD。 3. flatMap:对RDD中的每个元素应用一个函数,生成一个新的RDD,该函数返回一个序列,将所有序列中的元素合并成一个新的RDD。 4. groupByKey:将RDD中的元素按照key进行分组,生成一个新的RDD。 5. reduceByKey:将RDD中的元素按照key进行分组,并对每个分组中的元素进行reduce操作,生成一个新的RDDSpark RDD的行动操作包括: 1. count:返回RDD中元素的个数。 2. collect:将RDD中的所有元素收集到一个数组中。 3. reduce:对RDD中的所有元素进行reduce操作,返回一个结果。 4. foreach:对RDD中的每个元素应用一个函数。 5. saveAsTextFile:将RDD中的元素保存到文本文件中。 以上就是Spark RDD的详细介绍。 ### 回答2: Apache Spark是一款基于内存的分布式计算系统,可以处理大规模数据,其中最为重要的就是Spark中的RDD(Resilient Distributed Datasets,弹性分布式数据集),RDDSpark中的基本数据结构,是一种类似于数组的分布式数据集,可以被分割成多个分区,并在集群中的多个节点间进行并行计算。RDDSpark提高执行效率和数据可靠性的重要手段。 在Spark中,RDD具有以下三个特点:弹性、不可变和可分区。弹性指RDD能够自动进行数据分区和容错,即使节点出现故障,也能够自动从故障的节点中复制数据,提高了数据的可靠性和并行计算的效率。不可变指RDD一旦创建就不能够被改变,可以进行转换操作生成新的RDD,也可以被缓存到内存中以供重复使用。可分区则指RDD中可以被分成多个分区,实现并行计算。 SparkRDD的API提供了丰富的操作方法,常见的操作包括:转换操作和动作操作。转换操作指对RDD进行转换操作,返回一个新的RDD对象,例如map()、filter()等;动作操作指对RDD进行计算并返回结果,例如reduce()、collect()等。 值得注意的是,RDD是一种惰性求值的数据结构,即当对RDD进行转换操作时并不会立即进行计算,而是当需要对RDD进行动作操作时才会进行计算,这种惰性求值的机制可以进一步提高Spark的效率。同时,为了提高计算效率,可以使用RDD的持久化(缓存)功能,将RDD持久化到内存中,以便复用。 总之,RDDSpark中的核心数据结构,其弹性、不可变和可分区的特点以及丰富的API操作方法,为Spark实现高效计算和数据处理提供了重要的支持。 ### 回答3: Spark RDDSpark的核心抽象,代表分布式的元素集合,支持多种操作和转换。RDD可以看作是一个不可变的分布式内存数据集合,由一些分布式的partition(分区)组成。 1. RDD的特性: - 分布式的数据集,可以跨越多个节点进行计算 - 可以并行处理,充分利用集群计算资源 - 不可变的数据集,任何对数据集的操作都会生成新的数据集 - 支持多种类型的转换操作,如map、filter、reduce、groupByKey等 2. RDD的创建: - 通过外部数据源创建RDD:从HDFS或其他存储系统中读取数据创建 - 通过程序中的数据结构创建RDD:从内存中的数据结构中创建 - 通过其他RDD转换创建RDD:通过对已有的RDD进行转换操作创建 3. RDD的转换: RDD支持多种类型的操作和转换,如map、filter、reduce、groupByKey等。这些转换操作不会立即执行,而是记录下来,等到需要输出结果时才会真正执行。 4. RDD的行动: 行动操作是指对RDD进行计算并返回结果的操作,如count、collect等。行动操作会立即触发RDD的计算过程。 5. RDD的缓存: RDD支持缓存操作,将一个RDD的结果缓存在内存中,提高后续对该RDD的计算效率。缓存可以在计算过程中多次使用,通过unpersist清理缓存。 6. RDD的持久化: 当RDD的计算过程非常复杂时,可以将计算过程中得到的RDD进行持久化以便后续使用。持久化可以选择将RDD保存在磁盘中或者内存中,也可以将RDD复制到多个节点上以保障数据的可靠性。 7. RDD的checkpoint: RDD的checkpoint是指将RDD的计算结果保存在HDFS或其他分布式存储系统中,以便后续查询和还原数据集。在计算复杂的RDD时,使用checkpoint可以避免计算过程中数据丢失的问题。 总的来说,Spark RDDSpark分布式计算的核心特性,其提供对大规模数据集的分布式处理能力,以及丰富的操作和转换方式,使得程序员可以轻松地处理海量数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值