Spark 之RDD

为什么要设计RDD

      网上资料很多,这里我给罗列出来,许多的迭代算法和交互式数据挖掘工具,这些应用场景的共同点是:在不同的运行阶段或者说是计算阶段,都会重用中间结果,即一个阶段的输出会作为下一个输出,而Hadoop的mapreduce 会把处理的中间结果放入到HDFS上,这样极大的增加了磁盘读写的负担。

    RDD 就是满足这个减少对I/O的负担而提出的,提供一个抽象的数据结构,不必担心底层数据的分布性,只需要将具体的应用逻辑表达为一些列的转换处理,不同的RDD之间的转换操作形成依赖关系,可实现管道化,从而避免中间结果,减少磁盘I/O的操作。就是实现RDD 这个数据结构时候,可以重用中间结果,每个阶段的中间结果有依赖关系,可以相互转化。减少I/O操作,降低读写开销,提高运算效率。

什么是RDD?

一个RDD是一个分布式对象集合。本质上是一个只读的分区集合。每个RDD 可以分成多个分区,每个分区上有多个数据集片段。


上图

并且。一个RDD上的不同的分区可以被保存在集群中不同的worknode 上。从而使集群在不同的节点上实行并行运算。

关键字:高度受限,只读记录分区集合,不能修改

RDD还提供了一种高度受限的共享内存模型。 【是一个只读的记录分区集合,不能直接修改】。只能基于稳定的物理存储中的数据集来创建RDD。或者通过在其他的RDD上执行确定的转换操。(map, join,groupby)而创建而得到新的RDD。

RDD提供一组丰富的操作以及支持常见的数据运算,分为 Action 【行动】和转换【Transformation】两个类型,前者用于执行计算并指定输出形式,——> Action 后者用于只能够RDD之间的相互关系——> Transformation

  Action and Transformation 的区别

1.前者用于执行计算并指定输出形式,——> Action 后者用于只能够RDD之间的相互关系——> Transformation

2.转换操作【 map ,join,filter groupBy 】 接受RDD并返回RDD。

3.行动操作【count,collect】接受RDD,但是返回非RDD(即一个输出一个值或者结果)



RDD提供的转换接口都非常简单, 都是类似map,filter,groupBy ,join 等数据转换操作。 因此,RDD 比较适合对于数据集元素中执行相同操作的批处理式应用。

RDD 执行过程

1. RDD 读取外部数据源,或者再内存中进行创建

2.RDD经过一系列的转换操作,每一次都会产生不同的RDD,共下一个转换使用

3.整个流程中的最后一个RDD经过Action 操作惊醒处理,并输出外部数据源。

注释: RDD采用惰性调用,即在RDD的执行过程中,真正的计算发生在RDD的Action 操作,对于Action 操作之前的所有Transformation 操作,Spark只记录Transformation应用的一些基础数据集以及RDD生成轨迹,即各个RDD之间的相互依赖关系,而不会触发真正的运算 只有在Action 时候 才会计算并返回一个值。



RDD执行过程

Spark 转换和行动操作

1.在输入逻辑是上生成2个RDD 命名为A,D,  经一系列的Transformation [转换]操作,会在最后生成一个RDD 这里取名为F,当要输出时候,也就是F进行Action 作时候是,Spark会根据RDD的依赖关系生成DAG 从起点进行真正的计算,之前都是逻辑上的,只是记录了各个RDD之间的依赖关系。


spark的数据处理框架 从一定程度上是对mapreduce 的扩展。执行mapreduce并不擅长的迭代式,交互式,流式计算。 因为spar创造性提出了RDD概念

Spark 编程:Scala 版

val sc=SparkContext()

对于Spark程序而言,要想进行操作,必须创建一个上下文。在创建上下文的过程中,集群申请资源以及构建相应的运行环境,一般来说要多SparkConnect 传入四个变量:

1.spark://localhost:7077 [集群在本地启动监听7077 端口]

2.spark程序的标识

3.spark的安装路径

4.传入这个Spark程序的jar 包

val  file=sc.textFile("hdfs:///root/datadir")

利用textFile 接口从指定的目录下读取文件 并返回一个变量file

val fileRDD=file.filter(_.contanins("hello, word"))

对文件进行过滤操作,传入的是function的对象。

spark编程中重要的几个概念

1.弹性分布式数据集RDD

2.创建操作,即申请资源内存一系列的SparkConnect,将内存中的集合或者是外部文件系统作为输入源

3.转换操作。将一个RDD通过一定的操作转换成另一个RDD

4.控制操作: 对RDD持久化,可以让RDD保存在磁盘或者内存中,以便后续重复使用

5.行动操作: 我的理解就是RDD调用相关方法

RDD特性  ——实现高效计算的主要原因

1.高效的容错性。现有的分布式共享内存,键值存储,内存数据库,为了实现容错,必须在集群节点之间进行数据复制或者记录日志  也即是在节点之间会发生大量的数据传输。这对于数据密集型应用而言会带来很大的开销,

2.在RDD的设计中,数据只读,不可修改,如果修改数据,必须从父类的RDD转换到子类的RDD,由此在不同的RDD上建立血缘联系

3.中间结果持久化到内存中,数据在内存中的多个RDD操作之间进行传递,不需要写到磁盘,减少I/O开销。

4.存放的数据可以使Java对象,避免了不必要的对象的序列化和反序列化的开销

RDD之间的依赖关系

不同的RDD中在不同的操作会在不同的RDD中产生不同的依赖,RDD中的依赖分为窄依赖和宽依赖


窄依赖和宽依赖

窄依赖表现为一个父RDD的分区对应于一个子RDD的分区,或者多个父RDD的分区对应一个子RDD的分区。

宽依赖表现为一个父类的RDD的一个分区对应一个子RDD的多个分区

辨别:如果存在一个父类的RDD的一个分区对应一个子RDD的多个分区,则是宽依赖,否则是窄依赖。

两者依赖包含的几种操作

窄依赖【map, filter,union】

宽依赖【groupBy,sortByKey】

【join】连接操作分为2种情况

1.对输入进行协同划分,属于窄依赖,所谓协同划分是指多个父RDD的某一个分区的所有的键key落在子RDD的同一个分区内,不会产生同一个父RDD的某一个分区,落在子RDD的两个分区的情况。

图解

2.对输入做非协同划分,属于宽依赖。 


图解

两者依赖应用的场景选择

对于窄依赖的RDD,可以以流水线的方式计算所有父分区,不会造成网络之间的数据混合。

对于宽依赖的RDD,则通常伴随着Shuffle操作,即首先需要计算好所有父分区数据,然后在节点之间进行Shuffle。

窄依赖宽依赖的区别

      在两种依赖关系中,窄依赖的失败恢复更为高效,它只需要根据父RDD分区重新计算丢失的分区即可(不需要重新计算所有分区),而且可以并行地在不同节点进行重新计算。而对于宽依赖而言,单个节点失效通常意味着重新计算过程会涉及多个父RDD分区,开销较大。此外,Spark还提供了数据检查点和记录日志,用于持久化中间RDD,从而使得在进行失败恢复时不需要追溯到最开始的阶段。在进行故障恢复时,Spark会对数据检查点开销和重新计算RDD分区的开销进行比较,从而自动选择最优的恢复策略。

阶段的划分

Spark通过分析各个RDD的依赖关系生成了DAG再通过分析各个RDD中的分区之间的依赖关系来决定如何划分阶段,具体划分方法是:

在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中;将窄依赖尽量划分在同一个阶段中,可以实现流水线计算,假设从HDFS中读入数据生成3个不同的RDD(即A、C和E),通过一系列转换操作后再将计算结果保存回HDFS。对DAG进行解析时,在依赖图中进行反向解析,由于从RDD A到RDD B的转换以及从RDD B和F到RDD G的转换,都属于宽依赖,因此,在宽依赖处断开后可以得到三个阶段,即阶段1、阶段2和阶段3。可以看出,在阶段2中,从map到union都是窄依赖,这两步操作可以形成一个流水线操作,比如,分区7通过map操作生成的分区9,可以不用等待分区8到分区9这个转换操作的计算结束,而是继续进行union操作,转换得到分区13,这样流水线执行大大提高了计算的效率。


图解


RDD运行过程

(1)创建RDD对象;

(2)SparkContext负责计算RDD之间的依赖关系,构建DAG;

(3)DAGScheduler负责把DAG图分解成多个阶段,每个阶段中包含了多个任务,每个任务会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行。



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

推荐阅读更多精彩内容