综述
概念与特性
RDD是spark最重要的抽象。spark统一建立在抽象的RDD之上。设计一个通用的编程抽象,使得spark可以应对各种场合的大数据情景。RDD模型将不同的组件融合到一起,选用其中的几个/所有,可以应付各种不同的场景。解决了mr的缺陷
1. 弹性分布式数据集Resilient Distributed Dataset。
2. 只读分区数据集,final修饰的
3. 一个分布式的数据集合,是spark中的核心,spark的操作都是围绕RDD展开的。
4. 真正的运算是在各个计算节点。
5. 当某个RDD操作丢失的时候,可以很快恢复。
分区
- 不同分区可能被划分到不同机器上。但是每个分区对应一个数据block
- 分区是个逻辑概念,新旧分区可能是同一块内存。(重要的优化,节约资源。)。在函数式编程,经常使用常量,但是很费内存,rdd的这种优化非常实用。防止内存的无限性扩充。
- 只是记录需要做的操作。只有当真正要执行的时候,才具体的执行。
计算
- 并行计算。计算/处理都是在各分区上,并行计算。并行,提高了效率。
- 真正的数据处理都是在各个分散的节点上。
依赖
- 子RDD从父RDD产生,父子RDD之间的关系。
- 宽依赖:依赖上级所有的RDD分区。宽依赖一般非常消耗资源,结果一般要缓存下来
- 窄依赖:依赖上级RDD的部分分区。计算的时候可能都在同一个节点上,节省资源
- stage以依赖的区别,分成不同的stage
- 每个父RDD的分区,只能被最多一个字RDD使用,子RDD可以使用任意个父RDD。
RDD的操作
创建
- 从外部数据集中读取。来源于文件系统(HDFS,HBASE),textFile方法
这里的路径要让每个RDD的节点都能访问到
// 从外部文本中创建RDD。可以指定分片的个数
lines = sc.textFle("路径",3)
// 一个目录下所有的文件。
lines = sc.wholeTextFile("路径")
// 从hadoop系统创建RDD
val rdd = newApiHadoopFile()
// 从hadoop数据创建RDD
val RDD = new ApiHadoopRDD()
- 从驱动程序中对一个集合进行并行化
在测试的时候用的多,parallelize方法。可以指定分区个数