Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Spark教程】核心概念RDD

【Spark教程】核心概念RDD

原创
作者头像
涂小刚
修改于 2017-10-17 08:39:25
修改于 2017-10-17 08:39:25
3.5K10
代码可运行
举报
文章被收录于专栏:涂小刚的专栏涂小刚的专栏
运行总次数:0
代码可运行

作者介绍:涂小刚,攻城狮一枚,有代码洁癖,热爱学习,热爱生活,痛恨酱油帝、跪舔帝。目前主要从事Spark大数据平台与机器学习平台相关方向的工作,关注Spark与TensorFlow

RDD全称叫做弹性分布式数据集(Resilient Distributed Datasets),它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD转换而创建,为此,RDD支持丰富的转换操作 ( 如: map, join, filter, groupBy 等),通过这种转换操作,新的RDD则包含了如何从其他RDDs衍生所必需的信息,所以说RDDs之间是有依赖关系的。

基于RDDs之间的依赖,RDDs会形成一个有向无环图DAG,该DAG描述了整个流式计算的流程,实际执行的时候,RDD是通过血缘关系(Lineage)一气呵成的,即使出现数据分区丢失,也可以通过血缘关系重建分区。

总结起来,基于RDD的流式计算任务可描述为:从稳定的物理存储(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写回稳定存储。另外RDD还可以将数据集缓存到内存中,使得在多个操作之间可以重用数据集,基于这个特点可以很方便地构建迭代型应用(图计算、机器学习等)或者交互式数据分析应用。

可以说Spark最初也就是实现RDD的一个分布式系统,后面通过不断发展壮大成为现在较为完善的大数据生态系统,简单来讲,Spark-RDD的关系类似于Hadoop-MapReduce关系。

RDD特点

RDD表示只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。

RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。

分区

如下图所示,RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。

如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。

只读

如下图所示,RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。

由一个RDD转换到另一个RDD,可以通过丰富的操作算子实现,不再像MapReduce那样只能写map和reduce了,如下图所示。

RDD的操作算子包括两类,一类叫做transformations,它是用来将RDD进行转化,构建RDD的血缘关系;另一类叫做actions,它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。下图是RDD所支持的操作算子列表。

依赖

RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖。如下图所示,依赖包括两种,一种是窄依赖,RDDs之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。

!

通过RDDs之间的这种依赖关系,一个任务流可以描述为DAG(有向无环图),如下图所示,在实际执行过程中宽依赖对应于Shuffle(图中的reduceByKey和join),窄依赖中的所有转换操作可以通过类似于管道的方式一气呵成执行(图中map和union可以一起执行)。

缓存

如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。

如下图所示,RDD-1经过一系列的转换后得到RDD-n并保存到hdfs,RDD-1在这一过程中会有个中间结果,如果将其缓存到内存,那么在随后的RDD-1转换到RDD-m这一过程中,就不会计算其之前的RDD-0了。

Checkpoint

虽然RDD的血缘关系天然地可以实现容错,当RDD的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。

为此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为checkpoint后的RDD不需要知道它的父RDDs了,它可以从checkpoint处拿到数据。

!

小结

总结起来,给定一个RDD我们至少可以知道如下几点信息:1、分区数以及分区方式;2、由父RDDs衍生而来的相关依赖信息;3、计算每个分区的数据,计算步骤为:1)如果被缓存,则从缓存中取的分区的数据;2)如果被Checkpoint,则从Checkpoint处恢复数据;3)根据血缘关系计算分区的数据。

编程模型

在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换。经过一系列的Transformations后,就可以调用Actions触发RDD的计算,Action可以是向应用程序返回结果( count, collect 等),或者是向存储系统保存数据( saveAsTextFile 等)。在Spark中,只有遇到Action,才会执行RDD的计算(即懒执行),这样在运行时可以通过管道的方式传输多个转换。

要使用Spark,开发者需要编写一个Driver程序,它被提交到集群以调度运行Worker,如下图所示。Driver中定义了一个或多个RDD,并调用RDD上的action,Worker则执行RDD分区计算任务。

应用举例

下面介绍一个简单的Spark应用程序实例WordCount,统计一个数据集中每个单词出现的次数,首先将从HDFS中加载数据得到原始RDD-0,其中每条记录为数据中的一行句子,经过一个flatMap操作,将一行句子切分为多个独立的词,得到RDD-1,再通过map操作将每个词映射为key-value形式,其中key为词本身,value为初始计数值1,得到RDD-2,将RDD-2中的所有记录归并,统计每个词的计数,得到RDD-3,最后将其保存到HDFS。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

object WordCount {
  def main(args: Array[String]) {
    if (args.length < 2) {
      System.err.println("Usage: WordCount <inputfile> <outputfile>");
      System.exit(1);
    }
    val conf = new SparkConf().setAppName("WordCount")
    val sc = new SparkContext(conf)
    val result = sc.textFile(args(0))
                   .flatMap(line => line.split(" "))
                   .map(word => (word, 1))
                   .reduceByKey(_ + _)
    result.saveAsTextFile(args(1))
  }
}

结语

基于RDD实现的Spark相比于传统的Hadoop MapReduce有什么优势呢?总结起来应该至少有三点:

1)RDD提供了丰富的操作算子,不再是只有map和reduce两个操作了,对于描述应用程序来说更加方便;

2)通过RDDs之间的转换构建DAG,中间结果不用落地;

3)RDD支持缓存,可以在内存中快速完成计算。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
这篇讲的真清晰。 不过RDD分区这里有点疑问, 每个 RDD分区对应到一个worker的进程还是对应一个worker啊
这篇讲的真清晰。 不过RDD分区这里有点疑问, 每个 RDD分区对应到一个worker的进程还是对应一个worker啊
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
spark浅谈
学习和使用一段时间的spark, 对spark的总结一下,希望对大家有用,不介绍怎么使用, 只从设计上谈谈。
若与
2020/03/20
7880
Spark 入门简介
Spark 是一个通用的并行计算框架,由加州伯克利大学(UC Berkeley)的 AMP 实验室开发于 2009 年,并于 2010 年开源,2013 年成长为 Apache 旗下在大数据领域最活跃的开源项目之一。 目前 Spark 的版本已经更新到了 2.4.5,并且预上线了 3.0 版本,相信未来会有更精彩的地方值得我们期待。
一个会写诗的程序员
2021/12/16
7940
Spark 入门简介
Spark RDD详解
RDD(Resilient Distributed Datasets)弹性的分布式数据集,又称Spark core,它代表一个只读的、不可变、可分区,里面的元素可分布式并行计算的数据集。
大数据学习与分享
2020/06/29
9000
Spark RDD详解
Spark Day06:Spark Core之Spark 内核调度和SparkSQL快速入门
ShuffleMapTask要进行Shuffle,ResultTask负责返回计算结果,一个Job中只有最后的Stage采用ResultTask,其他的均为ShuffleMapTask。
Maynor
2022/02/17
9220
Spark Day06:Spark Core之Spark 内核调度和SparkSQL快速入门
大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor
  我们需要一个效率非常快,且能够支持迭代计算和有效数据共享的模型,Spark 应运而生。RDD 是基于工作集的工作模式,更多的是面向工作流。   但是无论是 MR 还是 RDD 都应该具有类似位置感知、容错和负载均衡等特性。
黑泽君
2019/05/10
2.6K0
大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor
Spark专题系列(二):Spark核心概念
首先我们从整个大数据生态的宏观层面概述一下数据的处理流程,主要涉及到七个层次,分别是数据源(产生数据的一方)、数据收集、数据存储、资源管理、计算框架、数据分析、可视化,如下图所示:
用户5252199
2022/04/18
3560
Spark专题系列(二):Spark核心概念
Spark面试题汇总及答案(推荐收藏)
spark是借鉴了Mapreduce,并在其基础上发展起来的,继承了其分布式计算的优点并进行了改进,spark生态更为丰富,功能更为强大,性能更加适用范围广,mapreduce更简单,稳定性好。主要区别
肉眼品世界
2021/12/27
8530
Hello Spark! | Spark,从入门到精通
Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架,是专为大规模数据处理而设计的快速通用的大数据处理引擎及轻量级的大数据处理统一平台。
美图数据技术团队
2018/08/13
6190
Hello Spark! | Spark,从入门到精通
Spark入门必读:核心概念介绍及常用RDD操作
导读:Spark是由加州大学伯克利分校AMP实验室开源的分布式大规模数据处理通用引擎,具有高吞吐、低延时、通用易扩展、高容错等特点。Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQL、图计算框架GraphX、机器学习库MLlib、流计算引擎Spark Streaming。
Python数据科学
2019/05/13
1.1K0
Spark入门必读:核心概念介绍及常用RDD操作
Spark RDD -> Stage Task
RDD分为两种: Transformation 转换算子, Action 动作算子
jasong
2023/07/21
2340
Spark基础
1.Spark 使用DAG 调度器、查询优化器和物理执行引擎,能够在批处理和流数据获得很高的性能。2.spark把运算的中间数据(shuffle阶段产生的数据)存放在内存,迭代计算效率更高,mapreduce的中间结果需要落地,保存到磁盘;3.Spark计算框架对内存的利用和运行的并行度比mapreduce高,Spark运行容器为executor,内部ThreadPool中线程运行一个Task,mapreduce在线程内部运行container,container容器分类为MapTask和ReduceTask。Spark程序运行并行度高;
857技术社区
2022/05/17
4850
Spark基础
Spark重要知识汇总
RDD(Resilient Distributed Dataset)弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
Lansonli
2024/08/02
4350
Spark重要知识汇总
原 荐 Spark框架核心概念
Spark框架核心概念     首先介绍Spark中的核心名词概念,然后再逐一详细说明。 RDD:弹性分布式数据集,是Spark最核心的数据结构。有分区机制,所以可以分布式进行处理。有容错机制,通过RDD之间的依赖关系来恢复数据。 依赖关系:RDD的依赖关系是通过各种Transformation(变换)来得到的。父RDD和子RDD之间的依赖关系分两种:①窄依赖②宽依赖。     ①窄依赖:父RDD的分区和子RDD的分区关系是:一对一。     窄依赖不会发生Shuffle,执行效率高,spark框架底层
云飞扬
2018/05/17
1.5K0
【PySpark大数据分析概述】02 Spark大数据技术框架
PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX),通过内存计算与弹性数据集 (RDD) 优化性能,提供DataFrame API和SQL接口简化结构化数据处理。可跨Hadoop/云平台部署,适用于ETL、日志分析、实时推荐等场景,具备TB级数据横向扩展能力,并与Pandas等Python工具无缝集成,兼顾高效分析与易用性。
Francek Chen
2025/04/07
1460
【PySpark大数据分析概述】02 Spark大数据技术框架
Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN
本文介绍了基于Apache Spark的分布式大数据处理框架,从RDD、DataFrame、Dataset、Streaming等组件的角度讲解了Spark的基本特性、架构和实现原理。同时,本文还通过多个实际应用案例,详细介绍了Spark在大数据处理、实时计算、机器学习和深度学习等领域的应用实践。此外,本文还讨论了Spark与其他大数据处理框架(如Hadoop、Storm等)的对比和选择。
片刻
2017/12/29
1.1K0
Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN
Spark内部原理
Spark中的Shuffle、宽依赖窄依赖、RDD持久化、共享变量
俺也想起舞
2019/07/24
7960
Spark Core——RDD何以替代Hadoop MapReduce?
继续前期依次推文PySpark入门和SQL DataFrame简介的基础上,今日对Spark中最重要的一个概念——RDD进行介绍。虽然在Spark中,基于RDD的其他4大组件更为常用,但作为Spark core中的核心数据抽象,RDD是必须深刻理解的基础概念。
luanhz
2020/09/16
8350
Spark Core——RDD何以替代Hadoop MapReduce?
Spark2.x学习笔记:3、 Spark核心概念RDD
程裕强
2018/01/02
1.4K0
Spark2.x学习笔记:3、 Spark核心概念RDD
Spark内核详解 (5) | Spark的任务调度机制
在上一篇博文中我们讲解了 Spark YARN-Cluster 模式下的任务提交流程,但是我们并没有具体说明 Driver 的工作流程, Driver 线程主要是初始化 SparkContext对象,准备运行所需的上下文,然后一方面保持与ApplicationMaster的RPC连接,通过ApplicationMaster申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。
不温卜火
2020/10/28
3.7K0
Spark内核详解 (5) | Spark的任务调度机制
【赵渝强老师】Spark中的RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,它是Spark中最基本、也是最重要的的数据模型。它由分区组成,每个分区被一个Spark的Worker从节点处理,从而支持分布式的并行计算。RDD通过检查点Checkpoint的方式提供自动容错的功能,并且具有位置感知性调度和可伸缩的特性。通过RDD也提供缓存的机制,可以极大地提高数据处理的速度。
赵渝强老师
2024/08/21
2300
【赵渝强老师】Spark中的RDD
相关推荐
spark浅谈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档