大数据岗位校招Spark面试总结

Hive 面试总结传送门:大数据岗位校招Hive面试总结

Hadoop 面试总结传送门: 大数据岗位校招Hadoop面试总结

1、Spark基本概念

  1. Driver:main()函数,创建SparkContext,由SparkContext进行资源申请,任务的分配和监控等。程序执行完毕后关闭SparkContext。
  2. Executor:某个应用运行在worker节点上的一个进程,该进程负责运行某些task,将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task,并将数据存在内存或者磁盘上。
  3. Worker:集群中可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点。
  4. job:包含多个task的并行计算,由action触发
  5. stage:每个job被划分为多个stage,一个stage中包含一个taskset
  6. task:在executor进程中执行任务的工作单元

2、Spark运行流程

Spark运行流程比较复杂,在此仅简单描述必要流程

  1. Client向YARN的 RM 申请启动 AM 。同时在client中运行的 driver 会初始化 SparkContext ,Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU core。SC初始化中将创建DAGScheduler和TASKScheduler、HeartbeatReceiver。
  2. RM 收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该 AM 不运行SparkContext,只与SparkContext进行联系进行资源的分派;
  3. Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(executor中的Container)
  4. 一旦 AM 申请到资源(也就是Container,container中运行的是executor进程)后,便与对应的NodeManager通信,要求它在获得的Container中启动一些Backend进程,启动后会向SparkContext注册并申请Task
  5. Driver进程将Spark作业代码分拆为多个stage,每个stage执行一部分代码片段,并为每个stage创建一批task,Client中的SparkContext分配Task给executor执行,executor向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;(task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个task处理的数据不同而已。)一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的task的输入数据就是上一个stage输出的中间结果。循环往复,直到执行完。
  6. 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。

3、Spark on yarn—cilent 和 on yarn—cluster 的区别

  1. cluster:driver运行在AM中,它负责向YARN申请资源,并监督作业的运行状况。用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而Cluster模式不适合运行交互类型作业
  2. client:AM 仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开。

4、Spark 怎样划分stage和task

stage划分

在spark中,会根据RDD之间的依赖关系划分DAG图,对于窄依赖,由于partition依赖关系的确定性,可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。

stage划分思路

从后往前推,遇到宽依赖就断开,划分为一个stage,遇到窄依赖就将这个RDD加入该stage中。

task划分

  1. ResultTask获取父RDD分区数据之后,把分区数据作为参数输入到action函数中,最终计算出特定的结果返回给driver。
  2. ShuffleMapTask获取父RDD分区数据之后,把分区数据作为参数传入分区函数,最终形成新的RDD中的分区数据,保存在各个Executor节点中

5、stage的调度与task的调度

stage调度

通过Action的调用,触发Job并调度执行。DAGScheduler负责Stage级的调度,将DAG切分成若干Stages,并将每个Stage打包(task的分区信息和方法,并序列化)成TaskSet交给TaskScheduler调度。

划分的Stages分两类,一类叫做ResultStage,为DAG最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据。

TaskScheduler负责Task级的调度,将DAGScheduler给过来的TaskSet按照指定的调度策略分发到Executor上执行,调度过程中SchedulerBackend负责提供可用资源(SchedulerBackend有多种实现对应多种资源管理系统)

task调度

TaskScheduler 会将发来的 taskSet 封装为TaskSetManager加入到调度队列中,TaskSetManager负责监控管理同一个Stage中的Tasks,TaskScheduler就是以TaskSetManager为单元来调度任务。

TaskScheduler 初始化后会启动SchedulerBackend(接收Executor的注册信息,并维护Executor的状态),SchedulerBackend 会定期询问 TaskScheduler 有没有任务要运行,TaskScheduler会从调度队列中按照指定的调度策略选择 TaskSetManager 去调度运行。

TaskScheduler支持两种调度策略,一种是FIFO(默认),另一种是FAIR。

从调度队列中拿到 TaskSetManager 后,接下来的工作就是 TaskSetManager 按照一定的规则一个个取出 Task 给 TaskScheduler,TaskScheduler 再交给 SchedulerBackend 去发到 Executor 上执行。

6、静态资源申请与动态资源申请

  1. 静态资源申请:用户在提交Spark应用程序时,就要提前估计应用程序需要使用的资源(使用参数设定),任务的并行度由分区数决定,一个Stage有多少分区,就会有多少Task。每个Task默认占用一个Core,一个Executor上的所有core共享Executor上的内存,一次并行运行的Task数等于num_executor*executor_cores
  2. 动态资源申请:目前只支持到Executor,即可以不用指定num_executor,通过参数spark.dynamicAllocation.enabled 来控制。由于许多Spark应用程序一开始可能不需要那么多Executor或者其本身就不需要太多Executor,所以不必一次性申请那么多Executor,根据具体的任务数动态调整Executor的数量,尽可能做到资源的不浪费。动态Executor的调整会导致Executor动态的添加与删除,如果删除Executor,上面的中间Shuffle结果可能会丢失

7、Spark内存管理机制

静态内存管理

堆内:存储内存、执行内存、其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可在应用程序启动前配置,默认storage 60%(60%中预留了6%防止OOM,但只是逻辑上的,实际中spark没有区别对待,和其他内存一样全部交给JVM管理),execution 20%,other 20%。

堆外:只有存储内存、执行内存,由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域。默认情况下各占50%

缺点:需要根据具体的数据规模和计算任务调整࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值