学习之前先介绍一下什么是spark
Spark 是基于内存计算的大数据并行计算框架,因为它基于内存计算,所以提高了
在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将
Spark 部署在大量廉价硬件之上,形成集群。

RDD

介绍RDD

概念
RDD(Resilient Distributed Dataset) 弹性分布式数据集 , 
是 Spark 中最基本的数据对象,它代表一个不可变,可区,里面
的元素可并行计算的集合。这里虽然是集合但是里面却没有数据。
特点
  1. 自动容错性
  2. 位置感知性高度
  3. 可伸缩性
  4. 允许用户在多个查询的时候,将任务存在缓冲区内,后续的查询能重用查询工作集,这样大大提升工作效率以及速度
RDD的属性

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的值是NonePartitioner函数不但决定 了 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

  1. 通过外部的数据文件创建 (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")

  1. 通过 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的类型