Spark Core:第四章 RDD
—>Spark知识点总结导航<—
一、RDD简介
RDD Resillient Distrabuted Dataset( 弹性分布式数据集),是分布式内存一种抽象概念,提供了一种高度受限的共享内存模型(不存数据)
1. RDD是spark的核心
spark数据集的表现形式
- partition是RDD最小数据单元,多个partition组成一个RDD
2. RDD基本原理
(1) 读入外部数据源进行创建(只读,不能修改)
(2) 最后一个RDD经过“动作”操作进行转换,并输出到外部数据源
- 操作:动作(Action)和转换(Transformation)优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单
3. RDD特性
(1) 高效的容错性
① 容错机制:数据复制或记录日志
② 血缘关系、重新计算丢失分区、无需回滚系统、在不同节点间在重算过程中、记录粗粒度操作
(2) 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
(3) 存放的都是Java对象,避免了不必要的序列化和反序列化
4. RDD的宽窄依赖
(1) 窄依赖
① 一个父RDD对应一个子RDD的分区
② 多个父RDD对应一个子RDD的分区
实现流水线优化,可以实现管道化
(2) 宽依赖(shuffle)
一个父RDD的一个分区对应一个子RDD的多个分区
包含shuffle过程(磁盘读写,效率低),无法实现流水线优化
二、RDD的创建
1. 从文件创建
(1) 本地文件
sc.textFile("/home/duck/software/spark/RELEASE")
(2) HDFS
sc.textFile("hdfs://Cloud:9000/RELEASE")
textFile转换算子,当我们执行上面语句的时候,没有真的去做读文件这个操作
2. 通过集合创建
val arr=Array(1,2,3,4,5)
sc.textFile(...,minNumpartition)
sc.parallelize(arr)
sc.makeRDD(arr)
3. 从其他RDD转化(转换算子)
4. 创建指定分区的RDD
sc.textFile("hdfs://Cloud:9000/RELEASE",1) 这里的1就是分区数
sc.parallelize(arr,1)
5. 键值对RDD
(1) RDD里面每一个元素都是一个k-v对
(2) reduceByKey就是只针对键值对的RDD才能用的操作
三、RDD五大特性
1.RDD由一系列partition组成
2.算子(函数)是作用在partition上的
3.RDD之间有依赖关系
4.分区器是作用在K,V格式的RDD上
5.partition对外提供最佳的计算位置,利于数据处理的本地化
四、RDD的基本问题
1.K,V格式的RDD是什么?
RDD中的元素是一个个的Tuple2(二元组)
2.sc.textFile(…)
底层调用的是MR读取HDFS的方法,首先也会split,一个split对应一个block,这里的split 也对应一个partition.
3.RDD的分布式体现在哪里?
RDD中的partition是分布在多个节点上的
4.RDD的弹性体现在哪里?
(1) partition的个数可多可少
(2) RDD之间有依赖关系
(3) RDD中是不存数据的
五、RDD的操作算子
1. 转换操作算子Transformation
通过转换算子来对RDD进行操作,懒执行,需要Action算子(行动算子)触发执行
(1) map:把我们RDD中每个元素都执行map里的(function),形成一个新的RDD,原来的RDD中的元素,与新RDD中的元素一对一 RDD2=RDD1.map(x=>x+2) 等价于RDD2=RDD1.map(_