
大数据学习之Spark——04RDD概述及创建
发布日期:2021-05-06 17:19:30
浏览次数:47
分类:精选文章
本文共 2238 字,大约阅读时间需要 7 分钟。
一. RDD概述
1. 什么是RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
2. RDD的五大特性
- RDD是由一系列partition组成
- 算子(函数)是作用在RDD的partition上的
- RDD之间有依赖关系
- 分区器是作用在k, v格式的RDD上
- partition提供数据计算的最佳位置, 利于数据处理的本地化. “计算移动, 数据不移动”
3. RDD特点
- RDD表示只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖,RDD的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。
1. 分区
- RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。
- 如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据
- 如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。
2. 只读
-
如下图所示,RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。
-
由一个RDD转换到另一个RDD,可以通过丰富的操作算子实现,不再像MapReduce那样只能写map和reduce了,如下图所示。
-
RDD的操作算子包括两类,一类叫做transformations,它是用来将RDD进行转化,构建RDD的血缘关系;另一类叫做actions,它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。下图是RDD所支持的操作算子列表。
3. 依赖
- RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖。
- 依赖包括两种,一种是窄依赖,RDDs之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。
4. 缓存
-
如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。
-
如下图所示,RDD-1经过一系列的转换后得到RDD-n并保存到hdfs,RDD-1在这一过程中会有个中间结果,如果将其缓存到内存,那么在随后的RDD-1转换到RDD-m这一过程中,就不会计算其之前的RDD-0了。
5. checkpoint
- 虽然RDD的血缘关系天然地可以实现容错,当RDD的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。
- 为此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为checkpoint后的RDD不需要知道它的父RDDs了,它可以从checkpoint处拿到数据。
4. 说明
- Spark读取HDFS中数据的方法textFile底层是调用的MR读取HDFS文件的方法: 首先会split, 每个split对应一个block, 每个split对应生成RDD的每个partition
- 什么是k, v格式的RDD? RDD中的数据是一个一个的tuple2数据, 那么这个RDD就是k, v格式的RDD
- 那里体现了RDD的弹性(容错)?
- RDD之间有依赖关系
- RDD的partition可多可少
- 那里体现了RDD的分布式? RDD的partition分布在多个节点上.
二. RDD编程
1. 编程模型
- 在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换。经过一系列的transformations定义RDD之后,就可以调用actions触发RDD的计算,action可以是向应用程序返回结果(count, collect等),或者是向存储系统保存数据(saveAsTextFile等)。在Spark中,只有遇到action,才会执行RDD的计算(即延迟计算),这样在运行时可以通过管道的方式传输多个转换。
2. RDD的创建
在Spark中创建RDD的创建方式可以分为三种:
- 从集合中创建RDD
- 从外部存储创建RDD
- 从其他RDD创建
1. 从集合中创建RDD
从集合中创建RDD,Spark主要提供了两种函数:parallelize和makeRDD
-
使用parallelize()从集合创建
val list = sc.parallelize(1 to 5)
-
使用makeRDD()从集合创建
val list = sc.makeRDD(1 to 5)
2. 由外部存储系统的数据集创建
-
val line = sc.textFile("c://Users//Jiang锋时刻//Desktop//data.txt")
3. 从其他创建
见下一篇博客
声明:
- 本文参考了尚硅谷Spark课程的课件
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月05日 14时28分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
hdu6434 Problem I. Count(数论)(好题)
2019-03-05
NC15553 数学考试(线性DP)
2019-03-05
MySQL两阶段提交、崩溃恢复与组提交
2019-03-05
MySQL隐藏文件.mysql_history风险
2019-03-05
如何通过文件解析MySQL的表结构
2019-03-05
ClickHouse 适用场景调研文档
2019-03-05
C++的编译过程及原理
2019-03-05
Vue——父组件将方法传递给子组件
2019-03-05
文件加密软件对于企业发展而言有何优势?局域网数据防泄密工作应该如何入手?
2019-03-05
Beautiful Soup基础入门
2019-03-05
点击控制盒子移动
2019-03-05
js求阶乘
2019-03-05
小程序图片正确使用方式(防止发布之后不显示)
2019-03-05
C++基础学习笔记08——模板
2019-03-05
Java学习
2019-03-05
Js函数
2019-03-05
Python机器学习算法基础概述
2019-03-05
关于OCR的一些有用的技术博客文章链接
2019-03-05
jquery中用on事件委托的方式绑定事件
2019-03-05
蓝桥杯 2016c/c++A组 方格填数
2019-03-05