RDD
什么是RDD(Resilient Distributed Dataset)
RDD叫作弹性分布式数据集合,是spark中最基本的数据(计算、逻辑)抽象,在代码中它是一个抽象类,代表一个不可变、可分区、里面的元素的可并行计算的集合。
RDD属性
1.一组分区,即数据集的基本组成单位
2.一个计算每个分区的函数
3.RDD之间存在依赖关系(血统)
4.一个Partitioner,即RDD的分片函数
5.一个列表,存储存取每个Partition的优先位置(移动数据不如移动计算)
- 进程本地化
- 节点本地化
- 机架本地化
RDD特点
RDD表示只读的分区的数据集,对RDD进行改动,只能铜鼓RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必须的信息。RDDs之间存在依赖,RDD执行的是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD来切断血缘关系。如果程序中多次使用同一个RDD,可以将该RDD进行缓存,只有在第一次计算的时候回根据血缘关系得到分区数据,在后续其他地方用到直接从缓存中取
算子
Spark中所有的RDD方法都称为算子,有转换算子和行动算子两大类。
创建RDD
有三种创建方式
- 从集合中创建
- 从外部存储创建
- 从其他RDD创建
注:以下都是在local部署模式下的条件上说明
从集合中创建
spark提供了两种函数:parallelize()和makeRDD(),底层实现都是用的parallelize()
1.使用parallelize()
val arrayRDD = sc.parallelize(Array(1,2,3,4))
val arrayRDD = sc.parallelize(Array(1,2,3,4),X) #自定义分区数量,默认是8
2.使用makeRDD()
val listRDD = sc.makeRDD(lsit(1,2,3,4))
从外部存储系统的数据集创建
默认情况下,可以读取项目路径,也可以读其他路径,例如HDFS
val fileRDD = sc.textFile("XXX")
val fileRDD = sc.textFile(("XXX"),X) #这里自定义分区为最小分区数,具体如何分区依赖于hadoop的切片规则
RDD的转换
**RDD整体上分为Value类型和Key-Value类型
任务的划分&调度
一个分区划分一个任务(Task),一个任务会被分配到Executor执行