Spark 面试

Hbase的面试

  • 目录
    • 概 述
    • Spark的转化流程:
  • 小结
  • 参考资料和推荐阅读

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

Spark的转化流程:

Spark 面试_第1张图片
1、spark应用提交后,经历了一系列的转换,最后成为task在每个节点上执行

2、RDD的Action算子触发Job的提交,生成RDD DAG

3、由DAGScheduler将RDD DAG转化为Stage DAG,每个Stage中产生相应的Task集合
4、TaskScheduler将任务分发到Executor执行
每个任务对应相应的一个数据块,只用用户定义的函数处理数据块。

在这里插入图片描述
Spark 面试_第2张图片
、客户端提交作业给Master
2、Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。
3、另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
4、ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。
5、所有stage都完成后作业结束。

Driver运行在客户端:
客户端启动后直接运行用户程序,启动Driver相关的工作:DAGScheduler和BlockManagerMaster等。

Spark 面试_第3张图片
三、Spark提交作业的参数

executor-cores —— 每个executor使用的内核数,默认为1,官方建议2-5个,我们企业是4个
num-executors —— 启动executors的数量,默认为2
executor-memory —— executor内存大小,默认1G
driver-cores —— driver使用内核数,默认为1
driver-memory —— driver内存大小,默认512M

四、简述Spark的作业提交流程
Spark的任务提交方式实际上有两种,分别是YarnClient模式和YarnCluster模式。
Spark 面试_第4张图片
在YARN Client模式下,Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存。
ResourceManager接到ApplicationMaster的资源申请后会分配container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。

在这里插入图片描述
概念
RDD是弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算 的集合。
作用
提供了一个抽象的数据模型,将具体的应用逻辑表达为一系列转换操作(函数)。另外不同RDD之间的转换操作之间还可以形成依赖关系,进而实现管道化,从而避免了中间结果的存储,大大降低了数据复制、磁盘IO和序列化开销,并且还提供了更多的API(map/reduec/filter/groupBy…)
Spark的宽窄依赖问题是SparkCore部分的重点考察内容,多数出现在笔试中,大家需要注意。

    窄依赖:父RDD的一个分区只会被子RDD的一个分区依赖

    宽依赖:父RDD的一个分区会被子RDD的多个分区依赖(涉及到shuffle)

    那Stage是如何划分的呢?

    根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。

    每个stage又根据什么决定task个数?

    Stage是一个TaskSet,将Stage根据分区数划分成一个个的Task。

七、列举Spark常用的transformation和action算子,有哪些算子会导致Shuffle?
transformation:
map

mapRartition

flatMap

filter
action

reduce

collect

first

take

八、reduceByKey与groupByKey的区别,哪一种更具优势?
reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v]。
groupByKey:按照key进行分组,直接进行shuffle
所以,在实际开发过程中,reduceByKey比groupByKey,更建议使用。

十四、如何使用Spark实现TopN的获取(描述思路或使用伪代码)?
方法1:
(1)按照key对数据进行聚合(groupByKey)
(2)将value转换为数组,利用scala的sortBy或者sortWith进行排序(mapValues)
注意:当数据量太大时,会导致OOM
(1)取出所有的key
(2)对key进行迭代,每次取出一个key利用spark的排序算子进行排序
方法3:
(1)自定义分区器,按照key进行分区,使不同的key进到不同的分区
(2)对每个分区运用spark的排序算子进行排序

小结

主要根据Spark 面试问题总结问题。

参考资料和推荐阅读

1.链接: 参考资料.

你可能感兴趣的:(#,hadoop,spark)