概述
目录:
- 1、Spark有几种部署方式?请分别简要论述
- 2、Spark提交作业参数,及参数常规设置?
- 3、简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?
- 4、Spark任务使用什么进行提交,JavaEE界面还是脚本?
- 5、简述Spark的架构与作业提交流程(画图并注明务个部分作用)
1、Spark有几种部署方式?请分别简要论述
1)Local:运行在一台机器上,通常是练手或者测试环境。
2)Standalone:构建一个基于Mster+Slaves的资源调度集群,Spark任务提交给Master运行。是Spark自身的一个调度系统。
3)Yarn: Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
4)Mesos:国内大环境比较少用。
2、Spark提交作业参数,及参数常规设置?
1)在提交任务时的几个重要参数
executor-cores —— 每个executor使用的内核数,默认为1,官方建议2-5个,我们企业是4个
num-executors —— 启动executors的数量,默认为2
executor-memory —— executor内存大小,默认1G
driver-cores —— driver使用内核数,默认为1
driver-memory —— driver内存大小,默认512M
2)下边给一个提交任务的样式
spark-submit
–master local[5]
–driver-cores 2
–driver-memory 8g
–executor-cores 4
–num-executors 10
–executor-memory 8g
–class PackageName.ClassName XXXX.jar
–name “Spark Job Name”
InputPath
OutputPath
如果这里通过–queue 指定了队列,那么可以免去写–master
3)参数的常规设置
executor_cores*num_executors
表示的是能够并行执行Task的数目
不宜太小或太大!一般不超过总队列 cores 的 25%,比如队列总 cores 400,最大不要超过100,最小不建议低于 40,除非日志量很小。
executor_cores
不宜为1!否则 work 进程中线程数过少,一般 2~4 为宜。
executor_memory
一般 6~10g 为宜,最大不超过20G,否则会导致GC代价过高,或资源浪费严重。
driver-memory
driver 不做任何计算和存储,只是下发任务与yarn资源管理器和task交互,除非你是 spark-shell,否则一般 1-2g
3、简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?
1)什么是Spark的宽窄依赖?
窄依赖就是指父RDD的每个分区只被一个子RDD分区使用,子RDD分区通常只对应常数个父RDD分区,如下图所示【其中每个小方块代表一个RDD Partition】
窄依赖有分为两种:
一种是一对一的依赖,即OneToOneDependency
还有一个是范围的依赖,即RangeDependency,它仅仅被org.apache.spark.rdd.UnionRDD使用。UnionRDD是把多个RDD合成一个RDD,这些RDD是被拼接而成,即每个parent RDD的Partition的相对顺序不会变,只不过每个parent RDD在UnionRDD中的Partition的起始位置不同
宽依赖就是指父RDD的每个分区都有可能被多个子RDD分区使用,子RDD分区通常对应父RDD所有分区,如下图所示【其中每个小方块代表一个RDD Partition】
2)Spark如何划分stage,每个stage又根据什么决定task个数?
Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。
Task:Stage是一个TaskSet,将Stage根据分区数划分成一个个的Task。
4、Spark任务使用什么进行提交,JavaEE界面还是脚本?
Shell脚本
5、简述Spark的架构与作业提交流程(画图并注明务个部分作用)
YARN Cluster模式:
- 执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
- SparkSubmit类中的main方法反射调用YarnClusterApplication的main方法;
- YarnClusterApplication创建Yarn客户端,然后向Yarn发送执行指令:bin/java ApplicationMaster;
- Yarn框架收到指令后会在指定的NM中启动ApplicationMaster;
- ApplicationMaster启动Driver线程,执行用户的作业;
- AM向RM注册,申请资源;
- 获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBackend;
- CoarseGrainedExecutorBackend进程会接收消息,跟Driver通信,注册已经启动的Executor;然后启动计算对象Executor等待接收任务
- Driver分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Driver是独立的线程;Executor和YarnClusterApplication是对象。
YARN Client模式:
- 执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
- SparkSubmit类中的main方法反射调用用户代码的main方法;
- 启动Driver线程,执行用户的作业,并创建ScheduleBackend;
- YarnClientSchedulerBackend向RM发送指令:bin/java ExecutorLauncher;
- Yarn框架收到指令后会在指定的NM中启动ExecutorLauncher(实际上还是调用ApplicationMaster的main方法);
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}
}
- AM向RM注册,申请资源;
- 获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBackend;
- CoarseGrainedExecutorBackend进程会接收消息,跟Driver通信,注册已经启动的Executor;然后启动计算对象Executor等待接收任务
- Driver分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Executor和Driver是对象。
最后
以上就是友好微笑为你收集整理的大数据面试-Spark专题-001的全部内容,希望文章能够帮你解决大数据面试-Spark专题-001所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复