4道Spark面试必问题, 别面试挂了再开始看 !!
Posted 大数据与数据仓库
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4道Spark面试必问题, 别面试挂了再开始看 !!相关的知识,希望对你有一定的参考价值。
1. Spark的宽窄依赖
窄依赖指的是每一个父RDD的Partition最多被下游RDD的一个Partition依赖
宽依赖指的是一个Parent RDD的Partition被多个子RDD的Partition依赖
2. Spark 如何做Stage划分?如何优化?
总结一点: 当Spark 遇到宽依赖时会划分Stage
对于宽依赖来说,由于Shuffle的存在,只能在上游RDD 的Shuffle 处理结束后,才能开始接下来的计算,因此宽依赖作为Spark划分Stage的依据,即Spark根据宽依赖将DAG划分为不同的Stage。
对于窄依赖来说,由于Partition之间的依赖关系是确定的,Partition的转换处理可以在同一个线程里完成,为了提高数据处理速度, 窄依赖被Spark划分到同一个执行阶段。
在一个Stage内部,每个Partition都会被分配一个计算任务(Task),这些Task是可以并行执行的。Stage之间根据依赖关系变成了一个大粒度的DAG,这个DAG的执行顺序也是从前向后的。也就是说,Stage只有在它是Stage的开端或者上游 Stage都已经执行结束后,才会执行。
优化方法
由于宽依赖会进行Stage的划分并产生shuffle,而Shuffle操作由于涉及大量的网络传输,较为耗时,故需尽量避免使用会产生shuffle的算子,如reduceByKey, groupByKey, intersection等,可以使用其他的算子来代替。
3. 请描述下Spark的Shuffle过程
Shuffle阶段可进一步划分成三个子过程, 分别如下:
Shuffle Write:一批任务(ShuffleMapTask)将程序输出的临时数据并写到本地磁盘。由于每个任务产生的数据要被下一个阶段的每个任务读取一部分,因此存入磁盘时需对数据分区,分区可以使用Hash与Sort两种方法;
Shuffle Read:下一个阶段启动一批新任务(ResultTask),它们各自启动一些线程远程读取Shuffle Write产生的数据;
Aggregate:一旦数据被远程拷贝过来后,接下来需按照key将数据组织在一起,为后续计算做准备。
4. Spark如何解决数据倾斜问题?
避免产生 shuffle,可在数据输入 spark 之前进行预处理,比如在 Hive 中按照 key 进行分组。或者使用map等算子替代 shuffle 过程,即将 reduce join 替换为map join。
若其中有一个 RDD 很小,则可以将该小RDD进行广播。
如果避免不了 shuffle,可以减少单个 reduce task 的数据量,如缩小 key 粒度并增加 reduce task 数量。也可以通过随机数多次聚合来降低每次聚合时的数据倾斜,聚合之后,把添加的随机数还原为原始的 key,然后对 key 做最后的聚合。
多个 key 导致数据倾斜,首先可以通过采样才确定导致倾斜的key, 如果导致倾斜的key对业务没有影响,则可以直接过滤;如果对业务有影响,则可以将倾斜的key单门拿出来做处理。
以上是关于4道Spark面试必问题, 别面试挂了再开始看 !!的主要内容,如果未能解决你的问题,请参考以下文章
合格linux运维人员必会的30道shell编程面试题及讲解