<b>更多面试题,干货内容,可以查看此处,从编程工具到面试要点。
全流程编程工具集&学习集 https://www.johngo689.com/2617/,欢迎留言交流!</b>
<i>以下面试题来自网络以及自己整理,如有侵权,请及时联系删除!</i>
***
[TOC]
### 1、分析一下一段 spark 代码中哪些部分在 Driver 端执行,哪些部分在Worker端执行?
<p>Driver Program是用户编写的提交给Spark集群执行的application。</p><p>它包含两部分</p><ul><li><strong>作为驱动:</strong> Driver与Master、Worker协作完成application进程的启动、DAG划分、计算任务封装、计算任 务分发到各个计算节点(Worker)、计算资源的分配等。</li><li><strong>计算逻辑本身:</strong>当计算任务在Worker执行时,执行计算逻辑完成application的计算任务。</li></ul><p>一般来说transformation算子均是在worker上执行的,其他类型的代码在driver端执行。</p>
### 2、讲一下spark的几种部署方式?
<p><strong>目前,除了local模式为本地调试模式以为。</strong></p><p><strong> Spark支持三种分布式部署方式,分别是standalone、spark on </strong><strong>mesos 和 spark on YARN。</strong></p><p> </p><ul><li>Standalone模式<br />即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。从一定程度上说,该模式是其他两种的基础。目前Spark在standalone模式下是没有任何单点故障问题的,这是借助 zookeeper实现的,思想类似于Hbase master单点故障解决方案。将Spark standalone与MapReduce比 较,会发现它们两个在架构上是完全一致的:<br /><ul><li>都是由master/slaves服务组成的,且起初master均存在单点故障,后来均通过zookeeper解决 (Apache MRv1的JobTracker仍存在单点问题,但CDH版本得到了解决); </li><li>各个节点上的资源被抽象成粗粒度的slot,有多少slot就能同时运行多少task。不同的是,MapReduce 将slot分为map slot和reduce slot,它们分别只能供Map Task和Reduce Task使用,而不能共享,这是 MapReduce资源利率低效的原因之一,而Spark则更优化一些,它不区分slot类型,只有一种slot,可 以供各种类型的Task使用,这种方式可以提高资源利用率,但是不够灵活,不能为不同类型的Task定制 slot资源。总之,这两种方式各有优缺点。</li></ul></li></ul><ul><li>Spark On YARN模式<br />spark on yarn 的支持两种模式:<br /><ul><li>yarn-cluster:适用于生产环境; </li><li>yarn-client:适用于交互、调试,希望立即看到app的输出<br />yarn-cluster 和 yarn-client的区别在于 yarn appMaster,每个yarn app实例有一个appMaster进程,是为app 启动的第一个container;负责从ResourceManager请求资源,获取到资源后,告诉NodeManager为其启动 container。yarn-cluster和yarn-client模式内部实现还是有很大的区别。如果你需要用于生产环境,那么请 选择yarn-cluster;而如果你仅仅是Debug程序,可以选择yarn-client。</li></ul></li></ul><ul><li>Spark On Mesos模式<br />Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。目前在Spark On Mesos环境中,用户可选择两种调度模式之一运行自己的应用程序<br /><ul><li>粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组 成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不 用,最后程序运行结束后,回收这些资源。</li><li>细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了 另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。与粗粒度模式一 样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需 要考虑将来要运行的任务,之后,mesos会为每个executor动态分配资源,每分配一些,便可以运行一 个新任务,单个Task运行完之后可以⻢上释放对应的资源。</li></ul></li></ul>
### 3、讲一下 spark 的运行架构?
<p><img src="https://www.johngo689.com/wp-content/uploads/member/avatars/spark1-1.png" alt="spark1-1" /></p><ul><li><strong>Cluster Manager(Master):</strong>在standalone模式中即为Master主节点,控制整个集群,监控worker。在 YARN模式中为资源管理器</li><li><strong>Worker节点:</strong>从节点,负责控制计算节点,启动Executor或者Driver。</li><li><strong>Driver</strong>:运行Application 的main()函数</li><li><strong>Executor:执行器:</strong>是为某个Application运行在worker node上的一个进程</li></ul>
### 4、一个spark程序的执行流程是什么样的?
<p><img src="https://www.johngo689.com/wp-content/uploads/member/avatars/spark2.jpg" alt="spark2" /></p><ul><li>A -> 当 Driver 进程被启动之后,首先它将发送请求到Master节点上,进行Spark应用程序的注册;</li><li>B -> Master在接受到Spark应用程序的注册申请之后,会发送给Worker,让其进行资源的调度和分配;</li><li>C -> Worker 在接受Master的请求之后,会为Spark应用程序启动Executor, 来分配资源;</li><li>D -> Executor启动分配资源好后,就会想Driver进行反注册,这是Driver已经知道哪些Executor为他服务了;</li><li>E -> 当Driver得到注册了Executor之后,就可以开始正式执行spark应用程序了. 首先第一步,就是创建初始RDD, 读取数据源,再执行之后的一系列算子. HDFS文件内容被读取到多个worker节点上,形成内存中的分布式数据 集,也就是初始RDD;</li><li>F -> Driver就会根据 Job 任务任务中的算子形成对应的task,最后提交给 Executor, 来分配给task进行计算的线程;</li><li>G -> task就会去调用对应的任务数据来计算,并task会对调用过来的 RDD 的 partition 数据执行指定的算子操作, 形成新的RDD的partition,这时一个大的循环就结束了;</li><li>后续的 RDD 的 partition 数据又通过 Driver 形成新的一批 task 提交给 Executor 执行,循环这个操作,直到所有的算子结束。</li></ul>
### 5、spark2.0 为什么放弃了 akka 而用 netty?
<p>1. 很多Spark用户也使用Akka,但是由于Akka不同版本之间无法互相通信,这就要求用户必须使用跟Spark完全 一样的Akka版本,导致用户无法升级Akka。<br />2. Spark的Akka配置是针对Spark自身来调优的,可能跟用户自己代码中的Akka配置冲突。<br />3. Spark用的Akka特性很少,这部分特性很容易自己实现。同时,这部分代码量相比Akka来说少很多,debug 比较容易。如果遇到什么bug,也可以自己⻢上fix,不需要等Akka上游发布新版本。而且,Spark 升级 Akka 本身又因为第一点会强制要求用户升级他们使用的Akka,对于某些用户来说是不现实的。</p>
### 6、Spark 的各种 HA:master/worker/executor 的 HA?
<ul><li>Master异常<br />spark可以在集群运行时启动一个或多个standby Master,当 Master 出现异常时,会根据规则启动某个standby master接管,在standlone模式下有如下几种配置 <br /><ul><li>ZOOKEEPER<br />集群数据持久化到zk中,当master出现异常时,zk通过选举机制选出新的master,新的master接管是需要 从 zk 获取持久化信息</li><li>FILESYSTEM<br />集群元数据信息持久化到本地文件系统, 当master出现异常时,只需要在该机器上重新启动master,启动后新的master获取持�