技术分享 | Spark RDD详解

1、RDD是什么 RDD:Spark的核心概念是RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用。 为什么会产生RDD? (1)传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型,使得在迭代计算式要进行大量的磁盘IO操作。RDD正是解决这一缺点的抽象方法 (2)RDD的具体描述RDD(弹性数据集)是Spark提供的最重要的抽象的概念,它是一种有容错机制的特殊集合,可以分布在集群的节点上,以函数式编 操作集合的方式,进行各种并行操作。可以将RDD理解为一个具有容错机制的特殊集合,它提供了一种只读、只能有已存在的RDD变换而来的共享内存,然后将 所有数据都加载到内存中,方便进行多次重用。

a.他是分布式的,可以分布在多台机器上,进行计算。

b.他是弹性的,计算过程中内错不够时它会和磁盘进行数 据交换。

c.这些限制可以极大的降低自动容错开销

d.实质是一种更为通用的迭代并行计算框架,用户可以显示的控制计算的中间结果,然后将其自由运用于之后 的计算。 (3)RDD的容错机制实现分布式数据集容错方法有两种:

数据检查点和记录更新RDD采用记录更新的方式:

记录所有更新点的成本很高。所以,RDD只支持 粗颗粒变换,即只记录单个块上执行的单个操作,然后创建某个RDD的变换序列(血统)存储下来;变换序列指,每个RDD都包含了他是如何由其他RDD变换 过来的以及如何重建某一块数据的信息。因此RDD的容错机制又称“血统”容错。 要实现这种“血统”容错机制,最大的难题就是如何表达父RDD和子RDD之间的依赖关系。

实际上依赖关系可以分两种,窄依赖和宽依赖:

窄依赖:子RDD中 的每个数据块只依赖于父RDD中对应的有限个固定的数据块;

宽依赖:子RDD中的一个数据块可以依赖于父RDD中的所有数据块。

例如:map变换,子 RDD中的数据块只依赖于父RDD中对应的一个数据块;

groupByKey变换,子RDD中的数据块会依赖于多有父RDD中的数据块,因为一个key可 能错在于父RDD的任何一个数据块中 将依赖关系分类的两个特性:

第一,窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计算得到子RDD对应的某块数据;宽依赖则要等到父RDD所 有数据都计算完成之后,并且父RDD的计算结果进行hash并传到对应节点上之后才能计算子RDD。

第二,数据丢失时,对于窄依赖只需要重新计算丢失的那 一块数据来恢复;对于宽依赖则要将祖先RDD中的所有数据块全部重新计算来恢复。所以在长“血统”链特别是有宽依赖的时候,需要在适当的时机设置数据检查 点。也是这两个特性要求对于不同依赖关系要采取不同的任务调度机制和容错恢复机制。 (4)RDD内部的设计每个RDD都需要包含以下四个部分:

a.源数据分割后的数据块,源代码中的splits变量

b.关于“血统”的信息,源码中的 dependencies变量

c.一个计算函数(该RDD如何通过父RDD计算得到),源码中的iterator(split)和compute函数

d. 一些关于如何分块和数据存放位置的元信息,如源码中的partitioner和preferredLocations

例如:

a.一个从分布式文件系统中的 文件得到的RDD具有的数据块通过切分各个文件得到的,它是没有父RDD的,它的计算函数知识读取文件的每一行并作为一个元素返回给RDD;

b.对与一个 通过map函数得到的RDD,它会具有和父RDD相同的数据块,它的计算函数式对每个父RDD中的元素所执行的一个函数 2、RDD在Spark中的地位及作用 (1)为什么会有Spark?

因为传统的并行计算模型无法有效的解决迭代计算(iterative)和交互式计算(interactive);而Spark的使命便是解决这两个问题,这也是他存在的价值和理由。 (2)Spark如何解决迭代计算?

其主要实现思想就是RDD,把所有计算的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据集做反复的迭代计算,数据在内存中将大大提升IO操作。这也是Spark涉及的核心:内存计算。 (3)Spark如何实现交互式计算?

因为Spark是用scala语言实现的,Spark和scala能够紧密的集成,所以Spark可以完美的运用scala的解释器,使得其中的scala可以向操作本地集合对象一样轻松操作分布式数据集。 (4)Spark和RDD的关系?

可以理解为:RDD是一种具有容错性基于内存的集群计算抽象方法,Spark则是这个抽象方法的实现。 3、如何操作RDD? (1)如何获取RDD

a.从共享的文件系统获取,(如:HDFS)

b.通过已存在的RDD转换

c.将已存在scala集合(只要是Seq对象)并行化 ,通过调用SparkContext的parallelize方法实现

d.改变现有RDD的之久性;RDD是懒散,短暂的。(RDD的固化:cache缓 存至内错; save保存到分布式文件系统) (2)操作RDD的两个动作

a.Actions:对数据集计算后返回一个数值value给驱动程序;

例如:Reduce将数据集的所有元素用某个函数聚合 后,将最终结果返回给程序。

b.Transformation:根据数据集创建一个新的数据集,计算后返回一个新RDD;

例如:Map将数据的每个元素经 过某个函数计算后,返回一个姓的分布式数据集。

原文发布于微信公众号 - 加米谷大数据(DtinoneBD)

原文发表时间:2018-01-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

2.0Spark编程模型

循序渐进学Saprk 与Hadoop相比,Spark最初为提升性能而诞生。Spark是Hadoop MapReduce的演化和改进,并兼容了一些数据库的基本思想...

3908
来自专栏Albert陈凯

3.0Spark RDD实现详解

Spark技术内幕:深入解析Spark内核架构设计与实现原理 第三章 Spark RDD实现详解 RDD是Spark最基本也是最根本的数据抽象,它具备像MapR...

3337
来自专栏我是攻城师

Spark Streaming流式计算的WordCount入门

3146
来自专栏肖力涛的专栏

Spark 踩坑记:从 RDD 看集群调度

本文的思路是从spark最细节的本质,即核心的数据结构RDD出发,到整个Spark集群宏观的调度过程做一个整理归纳,从微观到宏观两方面总结,方便自己在调优过程中...

1.1K2
来自专栏Jed的技术阶梯

Spark性能调优04-数据倾斜调优

数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。...

6145
来自专栏悦思悦读

Spark为什么比Hadoop快那么多?

在2014年11月5日举行的Daytona Gray Sort 100TB Benchmark竞赛中,Databricks 用构建于206个运算节点之上的spa...

53311
来自专栏一名叫大蕉的程序员

Spark你一定学得会(二)No.8

第一次分享的妥妥就是入门的干货,小伙伴们最好可以自己敲一敲代码,不然只看我的分享一点用都木有。但还是有很多小伙伴表示看不懂,没关系,慢慢来自己操作一遍有什么问题...

19410
来自专栏大数据架构

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

26910
来自专栏简单聊聊Spark

Spark性能调优篇四之使用Kryo进行序列化操作

        接着上一篇文章,今天介绍一下通过使用Kryo这个东东来进一步降低网络IO的传输量和内存的占用率。在介绍Kryo之前,接下来我们先来对比一下默认的...

3363
来自专栏斑斓

大数据 | 理解Spark的核心RDD

与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景,包括MapReduce,Streami...

3969

扫码关注云+社区

领取腾讯云代金券