1、shuffle过程的数据会写磁盘,因为数据洗牌重组如果发往某一个节点的partition数据过多,就会造成OOM,当然如果写的cipa磁盘的小文件过多,太多的io会影响效率。
2、每个stage的task数量由最后一个rdd的partition数量决定
3、1:n关系
一个app:多个job(job的个数由一个driver(main)中的action算子决定)
一个job:多个stage(stage的数量由shuffle数量决定=shuffle数量+1)
一个stage:多个task(前面2中提到,多个task形成taskset)
spark建立在rdd之上,将需要处理的数据转换为rdd,然后进行一系列的算子操作,得到结果。rdd是一个容错的,并行的数据结构,可以将数据存储到内存或磁盘中,并控制数据分区,有丰富的api来操作数据。
Hadoop--数据集,数据集的特性:位置感知,容错性和均衡负载等。容错采用:数据检查点和记录数据更新。
spark--工作集,也具有上述的特性,为了有效的实现容错,rdd本身 提供了一种高度受限的内存共享模型,它是只读的记录分区的集合。并且rdd之间会形成依赖链,即血缘关系(lineage),用于恢复数据。
RDD:弹性分布式数据集是分布式内存的一个抽象概念,是一种高度受限的(只读)的内存共享模型,能够横跨集群的所有节点进行并行计算,是一种基于工作集的应用抽象。
RDD底层数据存储原理:其数据分布于多台机器节点上。每个节点上都会起一个blockmanagerslave管理其对应的数据块,driver节点会起一个blockmangagermaster来管理所有节点的block元数据。
本质上RDD相当于数据的一个元数据结构,存储着数据分区及逻辑结构的映射关系,存储着rdd之前的依赖关系。
spark支持重分区,分区是逻辑概念,实际的存储由blockmanage管理。
RDD五大特性:
1、分区列表
rdd是被分区的,每一个分区对应一个task,分区数量决定了并行的计算数量。
2、每一个分区都有一个计算函数
3、依赖于其它rdd列表
spark通过rdd的依赖形成调度关系,对rdd的操作形成整个程序。
依赖分为宽窄两种,宽依赖意味着shuffle,是stage划分的边界,spark宽依赖支持两种shuffle manager,即hash-shuffle-manager和sort-shuffle-manager。
4、k-v数据类型的rdd分区器,控制分区策略和分区数。
每一个k-v类型的rdd都有partitioner属性。
5、每个分区都有一个优先位置列表
优先位置列表会存储每个partition的优先位置,代码发生运算前就已经知道它需要运行的数据在什么地方了,有具体的节点信息,这就符合大数据中的数据不动代码动的原则(移动数据不如移动计算)。