spark底层核心 RDD详解

##spark底层核心RDD##
是什么?
弹性分布式数据集
简单点就理解成一个list集合
RDD = {1,2,3}

有什么属性?
用idea中注释的话来解释有5大属性
1、一个分区列表,数据集的基本组成单位
RDD以分区为单位,一个分区一个task任务来处理执行,可以在创建RDD时指定RDD的分区个数,如果没有指定,那么就会采用默认值。
2、一个计算每个分区的函数
sparkRDD计算是以分区为单位的,每个RDD都会实现compter计算函数以达到目的
3、一个RDD,可能会依赖多个RDD(可选项)
一个RDD由另一个RDD转换而来,形成一个流水线,所以其中哪个RDD丢失可以通过上一个RDD执行相应的操作得到
4、一个Partitioner,即RDD的分区函数
当前Spark中实现了两种类型的分区函数,一个是基于哈希的HashPartitioner,另外一 个是基于范围的RangePartitioner。只有对于key-value的RDD,才会有Partitioner(必须要产生shuffle),非key-value的RDD的Parititioner的值是None。
5、一个列表,存储每个Partition的优先位置(可选项)
对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置(spark进行任务分配的时候尽可能选择那些存有数据的worker节点来进行任务计算)。简单说就是数据的本地性。数据在哪RDD函数就送到哪。

RDD解决了什么?
一个技术或者框架的出现,总是为了解决上一个技术的问题。Spark的出现就是为了解决传统并行计算模型无法解决的迭代式计算和交互式计算。而spark其主要实现思想就是RDD,把所有计算的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据集做反复的迭代计算,数据在内存中将大大提升IO操作。这也是Spark涉及的核心:内存计算。
交互式计算是因为spark是scala语言写的,所以操作简单。

创建RDD
1、由一个已经存在的Scala集合创建。
val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))

2、由外部存储系统的文件创建。包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等。
val rdd2 = sc.textFile("/words.txt")
sc是spark-shell内置创建的sparkcontext

3、已有的RDD经过算子转换生成新的RDD
val rdd3=rdd2.flatMap(_.split(" "))

RDD的算子分类
Transformation(转换):根据数据集创建一个新的数据集,计算后返回一个新RDD;例如:一个rdd进行map操作后生了一个新的rdd。
Action(动作):对rdd结果计算后返回一个数值value给驱动程序,或者把结果存储到外部存储系统(例如HDFS)中;
例如:collect算子将数据集的所有元素收集完成返回给驱动程序。
具体算子操作百度吧。。。

RDD依赖
宽依赖
shuffer之后
宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition
总结:宽依赖我们形象的比喻为超生

窄依赖
窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用
总结:窄依赖我们形象的比喻为独生子女

宽、窄依赖是划分stage的依据,从后往前,碰到宽依赖终止成为一个stage。DAGScheduler基于每个stage生成一个taskset,交给TaskScheduler,然后由TaskScheduler调度task分配给worker节点执行任务。

Lineage(血统)
RDD转换成下一个RDD1 过程叫做血统
所以RDD1丢失 可以通过RDD和血统来恢复

RDD缓存
Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或者缓存数据集。可以说,缓存是Spark构建迭代式算法和快速交互式查询的关键。
默认缓存级别 cache
可设置缓存级别 persisit
高容错机制Checkpoint(最安全的缓存)

剩下的记不起来了,,有啥我在添吧。。。

你可能感兴趣的:(努力吧少年)