SparkRDD核心详解

Spark编程模型RDD,即弹性分布式数据集的简称。RDD是一个容错的、并行的数据结构,可以让用户显式地将数据映射/存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的算子来操作这些数据。RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(transformation操作)而创建。RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的数据部分。

RDD将操作分为两类:transformation与action。无论执行了多少次transformation操作,RDD都不会真正执行运算,只有当action操作被执行时,运算才会触发。而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得更高效,也避免了大量中间结果对内存的消耗。

#RDD是Spark的核心,也是整个Spark的架构基础。

1. RDD是不变的数据结构存储
2. RDD是支持跨集群的分布式数据结构
3. RDD可以根据数据记录的key对结构进行分区
4. 提供了粗粒度的操作,且这些操作都支持分区
5. 它将数据存储在内存中,从而提供了低延迟性

#RDD的特征

RDD总共有五个特征,其中三个基本特征,两个可选特征。

1. 分区(partition):有一个数据分片列表,可以将数据进行划分,切分后的数据能够进行并行计算,是数据集的原子组成部分。
2. 函数(compute):即算子,对于每一个分片都会有一个函数去迭代/计算执行它。
3. 依赖(dependency):每一个RDD对父RDD有依赖关系,源RDD没有依赖,通过依赖关系建立来记录它们之间的血统(关系-lineage)。
4. 优先位置(可选):每一个分片会优先计算位置(prefered location)。即要执行任务在哪几台机器上好一点(数据本地性)。
5. 分区策略(可选):对于key-value的RDD可以告诉它们如何进行分片。可以通过repartition函数进行指定。

#RDD之间的依赖关系(从分区partition的角度来定义依赖关系的)

RDD的依赖关系分为两种模型,一种是窄依赖(narrow dependency)和宽依赖(wide dependency)。

1.窄依赖:父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区(第一类),或者是多个父RDD的分区对应于一个RDD的分区(第二类),也就是说一个父RDD的一个分区不可对应于一个子RDD的多个分区。

如下图所示,对输入进行协同划分(co-partitioned)的join属于第二类。当子RDD的分区依赖于单个父RDD的分区的时候,分区的结构不会发生改变,如下图中的map,filter等操作,相反的,对于一个子RDD的分区依赖于多个RDD的分区的时候,分区的结构会发生改变,如下图的union操作。

2.宽依赖:宽依赖是值子RDD的每一个分区都要依赖于所有父RDD的所有分区或者多个分区。也就是说存在一个父RDD的一个分区对应着一个子RDD的多个分区。如下图的groupByKey就属于宽依赖。其中宽依赖会出发shuffle操作,下面会详细讲到。

partition的角度定义依赖关系

#

创建RDD的几种方式

1.Parallelized Collections(并行化计算一个集合)

2.External Datasets(引用外部数据)

3.RDD经转换操作生成新的RDD

通常将RDD操作分为两种操作,转换(transformation)和执行(action),在默认情况下,spark的所有转换操作都是惰性的(lazy),对于每一个转换得到的RDD结果不会立即计算出结果,只是记下该转换操作的一些基础数据集,可以有多个转换结果,一旦遇到action操作就 会执行之前的所有transformation操作,最后得到结果(spark的作业执行其实就是构建DAG(有向无环图),下面会讲到),所有的RDD被清除,如果下一个JOB中会用到其他JOB中的RDD,会引发该RDD的再次计算,因此,为了避免重新计算,我们可以使用persist或者cache操作进行“持久化”一个RDD到内存当中,也可以缓存到磁盘当中。

RDD对应的控制操作

RDD的控制操作主要包括故障恢复,数据持久化以及数据移除等操作。

1. 故障恢复

对于一个集群,spark会做出两种假设:处理的时间有限;保持数据持久化是外部数据的职责,主要让处理过程中数据保护稳定。Spark基于假设会折中选择方案,基于RDD之间的依赖关系,如果一个RDD坏掉,则会重新执行其父RDD的相应分区,不需要重新执行全部的JOB。

宽依赖的再执行涉及到多个父RDD(因为宽依赖会出发shuffle操作,也就是说宽依赖跨多个stage),从而引发整个JOB重新执行,为了避免这一点,spark会保持Map阶段的中间数据输出的持久,在发生故障时,只需回溯到mapper执行的相应分区即可获取中间数据。

2. RDD持久化

RDD持久化分为主动持久化和自动持久化。自动持久化就是不需要用户调用持久化操作,spark自动保存一些Shuffle操作的中间结果(保存到磁盘中)来避免节点崩溃时重新计算所有的输入。

主动持久化需要用户自己在需要持久化的RDD调用persist操作或者cache操作缓存数据到内存中(默认),持久化的等级选择是通过一个Storage Level对象传递给persist方法进行确定的,Cache方法调用persist()的默认级别是MEMORY_ONLY(内存)。

RDD的数据移除

RDD可以在内存中进行缓存,spark会坚持每一个节点上使用的缓存,如果集群中没有足够的内存时,spark会根据LRU算法(最近最少使用算法,操作系统内存管理章节内容)对数据分区进行删除。

如果想手动删除,可以在指定RDD中调用unpersist方法删除,立即生效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343