一、什么是宽依赖,什么是窄依赖,哪些算子是宽依赖,哪些是窄依赖

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的占用相同资源