一、什么是宽依赖,什么是窄依赖,哪些算子是宽依赖,哪些是窄依赖
1、宽依赖:一个分区对应多个分区,这就表明有shuffle过程,父分区数据经过shuffle过程的hash分区器划分子rdd。
例如:groupbykey reducebykey sortbykey等操作,shuffle可以理解为数据从原分区打乱重组到新分区
2、窄依赖:一个分区对应一个分区,这个过程没有shuffle过程
例如 map filter等
spark的stage就是按照shuffle来划分的
二、transformation和action算子有什么区别,举例说明
1、transformation 变换、转换算子,这种变化并不会触发提交作业,完成作业过程处理,transformation操作是延迟计算的。
也就是说从rdd到另一个rdd的转换并不会马上执行,需要遇到action操作才会触发计算
2、action行动算子,这类算子会真正的触发spark 提交job作业
三、哪些spark算子会shuffle
1、去重distanct
2、groupbykey reducebykey
3、重分区 repartition coalesce
4、join算子【分情况讨论】
两个RDD的分区数相同,在join的时候设置的分区数也相同,则在join阶段不会产生shuffle
两个RDD的分区数不同,在join的时候设置的分区数不同,则在join阶段都会产生shuffle
两个RDD的分区数不同,在join的时候设置的分区数和其中一个相同,则在join阶段不同的会产生shuffle
也就是说,当两个rdd分区数和分区方式一样时做join就不会产生shuffle
四、rdd的特性
1、一个分区列表,rdd的数据都存在一个分区列表中
2、rdd的依赖关系
3、作用在每一个分区上的函数
4、rdd的key value结构,决定数据的来源和已经数据处理后的去向
5、数据本地性,移动计算
五、spark如何划分stage
1、action操作触发job
2、DAGScheduler根据rdd的宽窄依赖关系进行划分一个一个的stage,遇到宽依赖划分成一个stage,最后将整个job都划分成多个stage,而各个stage之间又存在依赖关系。
六、spark的内存溢出
1、driver的内存溢出
可以增加driver的内存参数,默认1G
在spark程序中,sparkcontext、DAGScheduler都是运行在driver端的,对应的rdd的stage切分也是在driver端进行,如果用户的代码有很多stage,这部分消耗的是driver的内存,这时候就需要调大driver的内存
2、map过程中产生大量的对象导致溢出
这个原因是在单个map中产生了大量的对象导致的,例如 rdd.map(x=>for(i<- 1 to 10000) yield i.toString ),这个操作在rdd中,每个对象都产生了10000个对象,肯定容易造成内存溢出的问题,针对这种问题,在不增大内存的情况下,可以减少task的大小,以便能达到每个task的executor能装下大量的对象,具体可以在产出大量对象之前进行repartition草,分区成更小的块传入map
3、数据不平衡导致的内存溢出
调用repartition重新分区
4、shuffle后内存溢出
shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的,在spark中,join reducebykey这一类型的算子,都会有shuffle过程,在shuffle过程,需要传入一个partitioner
5、使用rdd的persist(StorageLevel.MEMEORY_ADN_DISK_SER)代替rdd.cache
rdd.cache和rdd.persist(StorageLevel.MEMEORY_ADN_DISK_SER)是等价的,在内存不足的情况下,rdd.cache的数据会丢失,再次使用的时候会重新计算,而rdd.persist会再内存不足的情况下保存在磁盘,避免重新计算,只是消耗点IO时间
七、spark的几种部署模式
1、本地模式
local:只启动一个executor
local[k]:启动k个executor
2、standalone模式
分布式部署集群,自带有完整的服务,资源管理和任务监控
3、spark on yarn模式
分布式部署集群,资源和任务管理交给yarn管理
1、cluster模式 driver运行在集群子节点,具有容错功能
2、client模式,driver运行在客户端,适合调试
4、spark on mesos
八、你所知道的调度器,说明工作原理
1、Fifo scheduler 默认的调度器,先进先出
2、Capacity scheduler 计算能力调度,选择占用内存小,优先级别高的
3、Fair scheduler 公平调度,所有jbo的占用相同资源