Spark2.x基础学习之RDD理解

一、RDD介绍
RDD:Resilient Distributed Datasets弹性分布式数据集——对于内存集群运算(In-Memory Cluster Computing)的一个容错(Fault-Tolerant)抽象

Spark是一个函数式编程的范例(functional programming paradigm),函数式编程的一个关键概念是不变的(immutable)对象,RDD也是一个immutable dataset。
RDD的逻辑表示:

RDD也可由键值对((key, value) pairs)表示,逻辑表示如下
RDD可以被分割存储在集群中,所以下面是分割存储在集群中的RDD逻辑表示:


二、RDD操作
RDD只支持两种类型操作:转换(transformation)和行动(action)

Transformation:如果对一个RDD的操作给了你另一个RDD,那么这个操作就是transformation
例:你有一个字符串组成的RDD,想过滤掉所有H开头的值:
对于RDD的过滤(filter)操作返回另一个有所有通过过滤条件的值的RDD,因此,filter是一个转换操作

Action:如果一个操作给你返回的结果不是一个RDD,它就被称为action。如:对RDD中所有值求和、对所有值计数或检索RDD中所有值并组合成一个列表等等。下面是对RDD求和(sum)行动的逻辑表达
在后续文章中会进一步演绎RDD的所有操作。

三、惰性计算
RDD中另一个重要概念是Lazy evaluation。Spark会创建一个DAG,也被称为血缘关系图(lineage graph),展现了你在一个RDD上执行的所有操作。当对RDD进行action操作时,这个图才会开始执行。让我们来看一个RDD的DAG操作的例子。
首先,从一个稳态存储(stable storage)中读取数据创建了RDD,然后对RDD进行两个transformation和一个action操作得到了result。

让我们来看看前面这个图的图解,我们也许会推断,Spark任务会在发现创建RDD的操作步骤的时候就会对RDD进行创建,然后会依次发现两次transformation和一次action操作并会依次执行直到得到结果。然而事实并不是这样。

实际上,Spark任务会在发现action操作的时候才开始创建DAG步骤,然后才从DAG顶点开始执行步骤。

这种方法的优点如下:
容错性:RDD的血缘关系图,使得RDD拥有容错性。Spark能很好地意识到自己要对RDD进行的操作,它能够重新计算之前出错的步骤中的RDD或RDD的分割(partitions)而不是再一次重复整个过程。举个例子,如果有DAG的话,当RDD的partitions在处理过程中丢失了,它能够从RDD2中计算得到,而不用从数据库和两次transformation开始重复整个计算过程。这个特性能够在任务失败的情况下节省大量的时间和资源。
最佳资源使用: 因为Spark知道计算出最终结果所进行的所有操作,它能够利用这个信息来以最佳方式使用集群资源。

四、RDD的优点
下面是Spark RDD模型超越MapReduce模型的优点

迭代过程:MapReduce处理的最大问题就是相关的I/O。如果你使用MapReduce进行迭代操作,I/O会极大地拖慢速度,因此MR基本被只能用于处理多元聚合(multiple aggregations)操作。
考虑一个MapReduce任务从HDFS中读取数据,经过一些聚合(aggregation)操作后将输出写回到HDFS中。现在,映射(Mapper)任务将从HDFS中读取数据,并且在进行计算后将输出写入到本地文件系统中,归约(Reduce)任务拉取数据并在数据上执行归约过程。然后,将输出写入到HDFS中(不考虑mapper和reducer的溢出机制)。
我们再来考虑,如果你想要在输出上执行另一个aggregation,你就要在输出数据上执行另一个MapReduce工作,这个MR工作将进行另一个类似的I/O过程。下面是MR上的迭代操作运行的逻辑表示:
另一方面,在大多数情况下,Spark不会为先前描述的工作执行I/O操作。Data从HDFS中读取,然后Spark将对每一次迭代在内存对RDD进行转换操作。每一步操作的输出(另一个RDD)将被存储在分布式集群内存中,下面是Spark进行同样工作的逻辑表示:

交互式过程:当用户想对存放在稳态存储中的数据运行一些即时查询(ad-hoc query)时,Spark的数据结构超越MR/Hadoop的地方也能显现出来
我们来看看当你尝试用MR(或Hive查询)任务对数据进行分析时。如果你对同一个输入数据进行多个查询,MR将在每一次运行查询时都从存储(我们用HDFS来代表)中读取数据,逻辑表示如下:

另一方面,Spark提供了机制使得RDD能够在内存中持久(persist)(持久化RDD的不同机制将在后续文章中详细讨论),因此,你能够在内存中执行和存储RDD。然后,其他对同一个RDD的分析将不再需要从HDFS中读取数据。逻辑表示如下:

当一个Spark任务遇到Spark Action 1时,它执行DAG并计算RDD。然后RDD将持久在内存中,Spark Action 1将RDD上执行。此后,Spark Action 2和Spark Action 3将在同一个RDD上执行。这个模型将在交互过程中节省许多对稳态存储的I/O。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值