sparkAPI @zhouhonglin
1.RDD
弹性分布式数据集:
RDD是由多个partition组成
最小单位是partition:与读取的block是一一对应的. 有多少个block就有多少个partion.
算子就是函数:作用再rdd的partition上的.
对弹性的理解:某个RDD损坏了,可以进行恢复.他们直接有依赖关系
分区器是作用在kv格式RDD上很难理解
partition提供数据计算的最佳位置,利用数据处理的本地化
计算移动,数据不移动
2.相关问题:
1. 什么是KV格式的RDD,
RDD中的数据是一个个tuple2数据,那么就是kv格式的数据
2.Spark读取hdfs数据的方法:textFile.底层是调用MR读取HDFS的方法,首先会split,每个split对应一个一个block,每个split对应生产RDD的每个parttition.
3.哪里体现了RDD的弹性:容错
RDD之间有依赖关系,
RDD的分区,parttiton可多可少
4,哪里体现了分布式:
RDD的partition分布在多个节点上
3.spark的执行原理
Driver: 负责发送任务和回收任务,
Worker:负责进行数据操作
4.算子
多个RDD组成一个有向无环图
1. 懒执行算子:
只有在遇到行动算子的时候,才会触发懒执行算子
sparkapplication是由多个jab组成的
每个行动算子,触发一个job
算子:
map
filter
flatMap
sample
reduceByKey
groupByKey
union
join
规律总结:懒执行算子,都是由RDD转换为RDD
2.行动算子
算子:
count
collect
reduce
5.持久化算子
--cache:默认将数据存储在内存中,懒执行
--persist:可以手动指定持久化级别
-- cache和persist都是懒执行,最小的持久化单位是partition.
---cache和persist之后就可以直接赋值给一个值,后面不可以紧跟行动算子
6.宽窄依赖
Application:基于Spark的用户程序,包含了driver程序和运行在集群上的excutor程序,依据宽窄依赖进行划分。
窄依赖:一对一的依赖,称为窄依赖 ,多对一
宽依赖:一对多:存在与多个节点的数据传输
spark用在迭代的场景,会很快,没有用在迭代的场景,和,mapreduce没什么区别
spark处理数据的模式,pipiline管道处理模式,
一个stage由多个并行的task
stage的并行度是谁决定的?
由stage中的finalpartition的个数决定的
管道中的数据何时可以落地?
shuffle write的时候落地,
对RDD进行持久化的时候,落地
如何提高Stage的并行度
reduceByKey
7. 资源调度和任务调度
源码:
计算模式图
资源调度图和任务调度
资源调度是粗粒度的调用:spark:application启动之前首先将所有的资源都申请完毕,如果申请不到,则一直处于等待状态,一直到申请到资源为止,必须一次申请完毕后,才会执行任务,这样,task的我执行效率,task快了,job快了,job快了,application就快了,必须最后一个task执行完毕后,才会释放所有资源。
优点:执行速度快
缺点:容易造成资源的浪费
细粒度资源shenq:MR
与粗粒度相反
算子
1.maPartitionWithIndex算子
输入一个索引和迭代器,输入一个迭代器
2. repartiton:可以增多分区,也可以减少分区
是一个宽依赖的算子,会产生shuffer