我是靠谱客的博主 友好微笑,最近开发中收集的这篇文章主要介绍大数据面试-Spark专题-001,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录:

    • 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模式:
在这里插入图片描述

  1. 执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
  2. SparkSubmit类中的main方法反射调用YarnClusterApplication的main方法;
  3. YarnClusterApplication创建Yarn客户端,然后向Yarn发送执行指令:bin/java ApplicationMaster;
  4. Yarn框架收到指令后会在指定的NM中启动ApplicationMaster;
  5. ApplicationMaster启动Driver线程,执行用户的作业;
  6. AM向RM注册,申请资源;
  7. 获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBackend;
  8. CoarseGrainedExecutorBackend进程会接收消息,跟Driver通信,注册已经启动的Executor;然后启动计算对象Executor等待接收任务
  9. Driver分配任务并监控任务的执行。
    注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Driver是独立的线程;Executor和YarnClusterApplication是对象。

YARN Client模式:
在这里插入图片描述

  1. 执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程;
  2. SparkSubmit类中的main方法反射调用用户代码的main方法;
  3. 启动Driver线程,执行用户的作业,并创建ScheduleBackend;
  4. YarnClientSchedulerBackend向RM发送指令:bin/java ExecutorLauncher;
  5. Yarn框架收到指令后会在指定的NM中启动ExecutorLauncher(实际上还是调用ApplicationMaster的main方法);
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}
}
  1. AM向RM注册,申请资源;
  2. 获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBackend;
  3. CoarseGrainedExecutorBackend进程会接收消息,跟Driver通信,注册已经启动的Executor;然后启动计算对象Executor等待接收任务
  4. Driver分配任务并监控任务的执行。
    注意:SparkSubmit、ApplicationMaster和CoarseGrainedExecutorBackend是独立的进程;Executor和Driver是对象。

最后

以上就是友好微笑为你收集整理的大数据面试-Spark专题-001的全部内容,希望文章能够帮你解决大数据面试-Spark专题-001所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部