RDD 介绍RDD 概念学习之前先介绍一下什么是spark
Spark 是基于内存计算的大数据并行计算框架,因为它基于内存计算,所以提高了
在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将
Spark 部署在大量廉价硬件之上,形成集群。
RDD(Resilient Distributed Dataset) 弹性分布式数据集 , 是 Spark 中最基本的数据对象,它代表一个不可变,可区,里面 的元素可并行计算的集合。这里虽然是集合但是里面却没有数据。特点
- 自动容错性位置感知性高度可伸缩性允许用户在多个查询的时候,将任务存在缓冲区内,后续的查询能重用查询工作集,这样大大提升工作效率以及速度
1. ---- A list of partitions
一个组分片,即数据集的基本组成单位 对于 RDD 来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度,用户可以在创建 RDD 时指定 RDD的分片个数,如果没有指定,那么就会采用默认值,默认值就是程序所分配 到的 CPU Core 的数目
2. ---- A function for computing each split
一个计算每个分区的函数 Spark 中 RDD 的计算是以分片为单位的,每个 RDD 都会实现 compute 函数以达到这个目的, compute 函数会对迭代器进行复合,不需要保存每次计算的结果
3. ---- A list of dependencies on other RDDs
RDD 之间的依赖关系 RDD 每次转换都会生成一个新的RDD, 所以 RDD 之间就会形成类似于流水线一样的前后依赖关系。 在部分数据丢失时, Spark 可以通过这个依赖关系重新计算丢失 的分区数据,而不是对 RDD的所有 分区进行重新计算
4. ---- Optionally, a Partitioner for key-value RDDs(e.g. to say that the RDD is hash-partitioned)
一个 Partitioner, 即 RDD的分片函数 Spark 中实现 了两种类型的分片函数, 一个是基于哈希的 HashPartitioner, 另外一个是基于 RangePartitioner, 只有对于 key-value 的 RDD, 才会有 Partitioner, 非 key- value的 RDD的 Partitioner的值是None, Partitioner函数不但决定 了 RDD 本身的分片数 量,也决定了 parents RDD Shuffle 输出时的分片数量
5. ---- Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file )
一个列表,存储存取每个 Partion 的优先位置(preferred location) 对于一个 HDFS 文件来说,这个列表 保存的就是每个Partition 所在的块的位置 按照“移动数据不如移动计算”的理念, Spark 在进行任务调度的时候,会尽可能的将计算任务分配到 其所要处理数据块的存储位置深入RDD 创建RDD
这里主要用两种方法来创建RDD
- 通过外部的数据文件创建 (HDFS)
val rdd1: RDD[String] = sc.textFile("hdfs://192.168.10.210:9000/data/data.txt")
如果是本地模式的spark,这里可以把文件路径换成本地端
val linesRDD: RDD[String] = sc.textFile("data/words.txt")
- 通过 sc.parallelize 进行创建
val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5, 6, 7, 8, 9)) val rdd2 = sc.parallelize(Array(1,2,3,4,5,6))RDD的基本原理
一个分区运行在一个Worker 节点上, 一个 Worker 上可以运行多个分区
// 3代表分三个分区 val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8), 3)RDD的类型



