Spark Core面试篇01

一、简答题

1.Spark master使用zookeeper进行HA的,有哪些元数据保存在Zookeeper?

答:spark通过这个参数spark.deploy.zookeeper.dir指定master元数据在zookeeper中保存的位置,包括Worker,Driver和Application以及Executors。standby节点要从zk中,获得元数据信息,恢复集群运行状态,才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。另外,Master切换需要注意2点 
1)在Master切换的过程中,所有的已经在运行的程序皆正常运行!因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的! 
2) 在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求;

2.Spark master HA 主从切换过程不会影响集群已有的作业运行,为什么?

答:因为程序在运行之前,已经申请过资源了,driver和Executors通讯,不需要和master进行通讯的。

3.Spark on Mesos中,什么是粗粒度分配,什么是细粒度分配,各自的优点和缺点是什么?

答:1)粗粒度:启动时就分配好资源, 程序启动,后续具体使用就使用分配好的资源,不需要再分配资源;好处:作业特别多时,资源复用率高,适合粗粒度;不好:容易资源浪费,假如一个job有1000个task,完成了999个,还有一个没完成,那么使用粗粒度,999个资源就会闲置在那里,资源浪费。2)细粒度分配:用资源的时候分配,用完了就立即回收资源,启动会麻烦一点,启动一次分配一次,会比较麻烦。

4.如何配置spark master的HA?

1)配置zookeeper 
2)修改spark_env.sh文件,spark的master参数不在指定,添加如下代码到各个master节点 
export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk01:2181,zk02:2181,zk03:2181 -Dspark.deploy.zookeeper.dir=/spark” 
3) 将spark_env.sh分发到各个节点 
4)找到一个master节点,执行./start-all.sh,会在这里启动主master,其他的master备节点,启动master命令: ./sbin/start-master.sh 
5)提交程序的时候指定master的时候要指定三台master,例如 
./spark-shell –master spark://master01:7077,master02:7077,master03:7077

5.Apache Spark有哪些常见的稳定版本,Spark1.6.0的数字分别代表什么意思?

答:常见的大的稳定版本有Spark 1.3,Spark1.6,Spark 2.0 ,Spark1.6.0的数字含义 
1)第一个数字:1 
major version : 代表大版本更新,一般都会有一些 api 的变化,以及大的优化或是一些结构的改变; 
2)第二个数字:6 
minor version : 代表小版本更新,一般会新加 api,或者是对当前的 api 就行优化,或者是其他内容的更新,比如说 WEB UI 的更新等等; 
3)第三个数字:0 
patch version , 代表修复当前小版本存在的一些 bug,基本不会有任何 api 的改变和功能更新;记得有一个大神曾经说过,如果要切换 spark 版本的话,最好选 patch version 非 0 的版本,因为一般类似于 1.2.0, … 1.6.0 这样的版本是属于大更新的,有可能会有一些隐藏的 bug 或是不稳定性存在,所以最好选择 1.2.1, … 1.6.1 这样的版本。 
通过版本号的解释说明,可以很容易了解到,spark2.1.1的发布时是针对大版本2.1做的一些bug修改,不会新增功能,也不会新增API,会比2.1.0版本更加稳定。

6.driver的功能是什么?

答: 1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点;

2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。

7.spark的有几种部署模式,每种模式特点?

1)本地模式 
Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地模式分三类 
· local: 只启动一个executor 
· local[k]:   启动k个executor 
· local : 启动跟cpu数目相同的 executor 
2)standalone模式 
分布式部署集群, 自带完整的服务,资源管理和任务监控是Spark自己监控,这个模式也是其他模式的基础。 
3)Spark on yarn模式 
分布式部署集群,资源和任务监控交给yarn管理,但是目前仅支持粗粒度资源分配方式,包含cluster和client运行模式,cluster适合生产,driver运行在集群子节点,具有容错功能,client适合调试,dirver运行在客户端。 
4)Spark On Mesos模式。官方推荐这种模式(当然,原因之一是血缘关系)。正是由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。用户可选择两种调度模式之一运行自己的应用程序: 
1) 粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。 
2) 细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。

8.Spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?

答:可以画一个这样的技术栈图先,然后分别解释下每个组件的功能和场景 
1)Spark core:是其它组件的基础,spark的内核,主要包含:有向循环图、RDD、Lingage、Cache、broadcast等,并封装了底层通讯框架,是Spark的基础。 
2)SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP 套接字)进行类似Map、Reduce和Join等复杂操作,将流式计算分解成一系列短小的批处理作业。 
3)Spark sql:Shark是SparkSQL的前身,Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析 
4)BlinkDB :是一个用于在海量数据上运行交互式 SQL 查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应时间,其数据的精度被控制在允许的误差范围内。 
5)MLBase是Spark生态圈的一部分专注于机器学习,让机器学习的门槛更低,让一些可能并不了解机器学习的用户也能方便地使用MLbase。MLBase分为四部分:MLlib、MLI、ML Optimizer和MLRuntime。 
6)GraphX是Spark中用于图和图并行计算。

9.Spark中Work的主要工作是什么?

答:主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务,worker就类似于包工头,管理分配新进程,做计算的服务,相当于process服务。需要注意的是:1)worker会不会汇报当前信息给master,worker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给mater,master分配的时候就知道work,只有出现故障的时候才会发送资源。2)worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。

10.Spark为什么比mapreduce快?

答:1)基于内存计算,减少低效的磁盘交互;2)高效的调度算法,基于DAG;3)容错机制Linage,精华部分就是DAG和Lingae

11.简单说一下hadoop和spark的shuffle相同和差异?

答:1)从 high-level 的角度来看,两者并没有大的差别。 都是将 mapper(Spark 里是 ShuffleMapTask)的输出进行 partition,不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一个 stage 里的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以内存作缓冲区,边 shuffle 边 aggregate 数据,等到数据 aggregate 好以后进行 reduce() (Spark 里可能是后续的一系列操作)。 
2)从 low-level 的角度来看,两者差别不小。 Hadoop MapReduce 是 sort-based,进入 combine() 和 reduce() 的 records 必须先 sort。这样的好处在于 combine/reduce() 可以处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,reducer 的 shuffle 对排好序的每段数据做归并)。目前的 Spark 默认选择的是 hash-based,通常使用 HashMap 来对 shuffle 来的数据进行 aggregate,不会对数据进行提前排序。如果用户需要经过排序的数据,那么需要自己调用类似 sortByKey() 的操作;如果你是Spark 1.1的用户,可以将spark.shuffle.manager设置为sort,则会对数据进行排序。在Spark 1.2中,sort将作为默认的Shuffle实现。 
3)从实现角度来看,两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几个阶段:map(), spill, merge, shuffle, sort, reduce() 等。每个阶段各司其职,可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中,没有这样功能明确的阶段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。 
如果我们将 map 端划分数据、持久化数据的过程称为 shuffle write,而将 reducer 读入数据、aggregate 数据的过程称为 shuffle read。那么在 Spark 中,问题就变为怎么在 job 的逻辑或者物理执行图中加入 shuffle write 和 shuffle read 的处理逻辑?以及两个处理逻辑应该怎么高效实现? 
Shuffle write由于不要求数据有序,shuffle write 的任务很简单:将数据 partition 好,并持久化。之所以要持久化,一方面是要减少内存存储空间压力,另一方面也是为了 fault-tolerance。

12.Mapreduce和Spark的都是并行计算,那么他们有什么相同和区别

答:两者都是用mr模型来进行并行计算: 
1)hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。 
2)spark用户提交的任务成为application,一个application对应一个sparkcontext,app中存在多个job,每触发一次action操作就会产生一个job。这些job可以并行或串行执行,每个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算。 
3)hadoop的job只有map和reduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系。 
spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join,groupby等,而且通过DAG图可以实现良好的容错。

13.RDD机制?

答:rdd分布式弹性数据集,简单的理解成一种数据结构,是spark框架上的通用货币。 
所有算子都是基于rdd来执行的,不同的场景会有不同的rdd实现类,但是都可以进行互相转换。 
rdd执行过程中会形成dag图,然后形成lineage保证容错性等。 从物理的角度来看rdd存储的是block和node之间的映射。

14.spark有哪些组件?

答:主要有如下组件: 
1)master:管理集群和节点,不参与计算。 
2)worker:计算节点,进程本身不参与计算,和master汇报。 
3)Driver:运行程序的main方法,创建spark context对象。 
4)spark context:控制整个application的生命周期,包括dagsheduler和task scheduler等组件。 
5)client:用户提交程序的入口。

15.spark工作机制?

答:用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。 
执行add算子,形成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler。 task scheduler会将stage划分为task set分发到各个节点的executor中执行。

16.spark的优化怎么做?

答: spark调优比较复杂,但是大体可以分为三个方面来进行:

1)平台层面的调优:防止不必要的jar包分发,提高数据的本地性,选择高效的存储格式如parquet;

2)应用程序层面的调优:过滤操作符的优化降低过多小任务,降低单条记录的资源开销,处理数据倾斜,复用RDD进行缓存,作业并行化执行等等;

3)JVM层面的调优:设置合适的资源量,设置合理的JVM,启用高效的序列化方法如kyro,增大off head内存等等。

17.简要描述Spark分布式集群搭建的步骤

1)准备linux环境,设置集群搭建账号和用户组,设置ssh,关闭防火墙,关闭seLinux,配置host,hostname 
2)配置jdk到环境变量 
3)搭建hadoop集群,如果要做master ha,需要搭建zookeeper集群,修改hdfs-site.xml,hadoop_env.sh,yarn-site.xml,slaves等配置文件 
4)启动hadoop集群,启动前要格式化namenode 
5)配置spark集群,修改spark-env.xml,slaves等配置文件,拷贝hadoop相关配置到spark conf目录下 
6)启动spark集群。

18.什么是RDD宽依赖和窄依赖?

RDD和它依赖的parent RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。 
1)窄依赖指的是每一个parent RDD的Partition最多被子RDD的一个Partition使用 
2)宽依赖指的是多个子RDD的Partition会依赖同一个parent RDD的Partition

19.spark-submit的时候如何引入外部jar包

方法一:spark-submit –jars 
根据spark官网,在提交任务的时候指定–jars,用逗号分开。这样做的缺点是每次都要指定jar包,如果jar包少的话可以这么做,但是如果多的话会很麻烦。 
命令:spark-submit –master yarn-client –jars .jar,.jar 
方法二:extraClassPath 
提交时在spark-default中设定参数,将所有需要的jar包考到一个文件里,然后在参数中指定该目录就可以了,较上一个方便很多: 
spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/* spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/* 
需要注意的是,你要在所有可能运行spark任务的机器上保证该目录存在,并且将jar包考到所有机器上。这样做的好处是提交代码的时候不用再写一长串jar了,缺点是要把所有的jar包都拷一遍。

20.cache和pesist的区别

答:1)cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间;

2) cache只有一个默认的缓存级别MEMORY_ONLY ,cache调用了persist,而persist可以根据情况设置其它的缓存级别;

3)executor执行的时候,默认60%做cache,40%做task操作,persist最根本的函数,最底层的函数

二、选择题

1.Spark 的四大组件下面哪个不是 (D )

A.Spark Streaming        B. Mlib 
C Graphx                      D.Spark R

2.下面哪个端口不是 spark 自带服务的端口 (C )

A.8080     B.4040       C.8090       D.18080 
备注:8080:spark集群web ui端口,4040:sparkjob监控端口,18080:jobhistory端口

3.spark 1.4 版本的最大变化 (B )

A spark sql Release 版本     B .引入 Spark R 
C DataFrame                       D.支持动态资源分配

4.Spark Job 默认的调度模式 (A )

A FIFO        B FAIR 
C 无           D 运行时指定

5.哪个不是本地模式运行的个条件 ( D)

A spark.localExecution.enabled=true 
B 显式指定本地运行 
C finalStage 无父 Stage 
D partition默认值

6.下面哪个不是 RDD 的特点 (C )

A. 可分区        B 可序列化     C 可修改       D 可持久化

7.关于广播变量,下面哪个是错误的 (D )

A 任何函数调用          B 是只读的 
C 存储在各个节点      D 存储在磁盘或 HDFS

8.关于累加器,下面哪个是错误的 (D )

A 支持加法        B 支持数值类型 
C 可并行           D 不支持自定义类型

9.Spark 支持的分布式部署方式中哪个是错误的 (D )

A standalone            B spark on mesos 
C spark on YARN     D Spark on local

10.Stage 的 Task 的数量由什么决定 (A )

A Partition    B Job      C Stage     D TaskScheduler

11.下面哪个操作是窄依赖 (B )

A join           B filter 
C group       D sort

12.下面哪个操作肯定是宽依赖 (C )

A map                  B flatMap 
C reduceByKey   D sample

13.spark 的 master 和 worker 通过什么方式进行通信的? (D )

A http     B nio      C netty     D Akka

14 默认的存储级别 (A )

A MEMORY_ONLY                B MEMORY_ONLY_SER 
C MEMORY_AND_DISK       D MEMORY_AND_DISK_SER

15 spark.deploy.recoveryMode 不支持那种 (D )

A.ZooKeeper        B. FileSystem 
D NONE               D Hadoop

16.下列哪个不是 RDD 的缓存方法 (C )

A persist()            B Cache() 
C Memory()

17.Task 运行在下来哪里个选项中 Executor 上的工作单元 (C )

A Driver program         B. spark master 
C.worker node             D Cluster manager

18.hive 的元数据存储在 derby 和 MySQL 中有什么区别 (B )

A.没区别                   B.多会话 
C.支持网络环境        D数据库的区别

19.DataFrame 和 RDD 最大的区别 (B )

A.科学统计支持        B.多了 schema 
C.存储方式不一样    D.外部数据源支持

20.Master 的 ElectedLeader 事件后做了哪些操作 (D )

A. 通知 driver           B.通知 worker 
C.注册 application    D.直接 ALIVE

Spark Core面试篇02

1.cache后面能不能接其他算子,它是不是action操作?

答:cache可以接其他算子,但是接了算子之后,起不到缓存应有的效果,因为会重新触发cache。 cache不是action操作。

2.reduceByKey是不是action?

答:不是,很多人都会以为是action,reduce rdd是action

3.数据本地性是在哪个环节确定的?

具体的task运行在那他机器上,dag划分stage的时候确定的

4.RDD的弹性表现在哪几点? 
1)自动的进行内存和磁盘的存储切换; 
2)基于Lingage的高效容错; 
3)task如果失败会自动进行特定次数的重试; 
4)stage如果失败会自动进行特定次数的重试,而且只会计算失败的分片; 
5)checkpoint和persist,数据计算之后持久化缓存 
6)数据调度弹性,DAG TASK调度和资源无关 
7)数据分片的高度弹性,a.分片很多碎片可以合并成大的,b.par

5.常规的容错方式有哪几种类型?

1).数据检查点,会发生拷贝,浪费资源 
2).记录数据的更新,每次更新都会记录下来,比较复杂且比较消耗性能

6.RDD通过Linage(记录数据更新)的方式为何很高效?

1)lazy记录了数据的来源,RDD是不可变的,且是lazy级别的,且RDD之间构成了链条,lazy是弹性的基石。由于RDD不可变,所以每次操作就 
产生新的rdd,不存在全局修改的问题,控制难度下降,所有有计算链条 将复杂计算链条存储下来,计算的时候从后往前回溯900步是上一个stage的结束,要么就checkpoint 。
2)记录原数据,是每次修改都记录,代价很大。如果修改一个集合,代价就很小,官方说rdd是粗粒度的操作,是为了效率,为了简化,每次都是操作数据集合,写或者修改操作,都是基于集合的 rdd的写操作是粗粒度的,rdd的读操作既可以是粗粒度的也可以是细粒度,读可以读其中的一条条的记录。 
3)简化复杂度,是高效率的一方面,写的粗粒度限制了使用场景。如网络爬虫,现实世界中,大多数写是粗粒度的场景

7.RDD有哪些缺陷?

1)不支持细粒度的写和更新操作(如网络爬虫),spark写数据是粗粒度的。 
所谓粗粒度,就是批量写入数据,为了提高效率。但是读数据是细粒度的也就是说可以一条条的读 。
2)不支持增量迭代计算,Flink支持

8.说一说Spark程序编写的一般步骤?

答:初始化,资源,数据源,并行化,rdd转化,action算子打印输出结果或者也可以存至相应的数据存储介质,具体的可看下图: 
file:///E:/%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6/%E6%9C%89%E9%81%93%E7%AC%94%E8%AE%B0%E6%96%87%E4%BB%B6/qq19B99AF2399E52F466CC3CF7E3B24ED5/069fa7b471f54e038440faf63233acce/640.webp

9.Spark有哪两种算子?

答:Transformation(转化)算子和Action(执行)算子。

10.Spark提交你的jar包时所用的命令是什么?

答:spark-submit。

11.Spark有哪些聚合类的算子,我们应该尽量避免什么类型的算子?

答:在我们的开发过程中,能避免则尽可能避免使用reduceByKey、join、distinct、repartition等会进行shuffle的算子,尽量使用map类的非shuffle算子。这样的话,没有shuffle操作或者仅有较少shuffle操作的Spark作业,可以大大减少性能开销。

12.你所理解的Spark的shuffle过程?

答:从下面三点去展开 
1)shuffle过程的划分 
2)shuffle的中间结果如何存储 
3)shuffle的数据如何拉取过来 
可以参考这篇博文:http://www.cnblogs.com/jxhd1/p/6528540.html

13.你如何从Kafka中获取数据?

1)基于Receiver的方式 
这种方式使用Receiver来获取数据。Receiver是使用Kafka的高层次Consumer API来实现的。receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming启动的job会去处理那些数据。 
2)基于Direct的方式 
这种新的不基于Receiver的直接方式,是在Spark 1.3中引入的,从而能够确保更加健壮的机制。替代掉使用Receiver来接收数据后,这种方式会周期性地查询Kafka,来获得每个topic+partition的最新的offset,从而定义每个batch的offset的范围。当处理数据的job启动时,就会使用Kafka的简单consumer api来获取Kafka指定offset范围的数据

14.对于Spark中的数据倾斜问题你有什么好的方案?

1) 前提是定位数据倾斜,是OOM了,还是任务执行缓慢,看日志,看WebUI 
2) 解决方法,有多个方面 
· 避免不必要的shuffle,如使用广播小表的方式,将reduce-side-join提升为map-side-join 
·分拆发生数据倾斜的记录,分成几个部分进行,然后合并join后的结果 
·改变并行度,可能并行度太少了,导致个别task数据压力大 
·两阶段聚合,先局部聚合,再全局聚合 
·自定义paritioner,分散key的分布,使其更加均匀 
详细解决方案参考博文《Spark数据倾斜优化方法》

15.RDD创建有哪几种方式?

1).使用程序中的集合创建rdd 
2).使用本地文件系统创建rdd 
3).使用hdfs创建rdd, 
4).基于数据库db创建rdd 
5).基于Nosql创建rdd,如hbase 
6).基于s3创建rdd, 
7).基于数据流,如socket创建rdd 
如果只回答了前面三种,是不够的,只能说明你的水平还是入门级的,实践过程中有很多种创建方式。

16.Spark并行度怎么设置比较合适

答:spark并行度,每个core承载2~4个partition,如,32个core,那么64~128之间的并行度,也就是设置64~128个partion,并行读和数据规模无关,只和内存使用量和cpu使用时间有关

17.Spark中数据的位置是被谁管理的?

答:每个数据分片都对应具体物理位置,数据的位置是被blockManager,无论 数据是在磁盘,内存还是tacyan,都是由blockManager管理

18.Spark的数据本地性有哪几种?

答:Spark中的数据本地性有三种: 
a.PROCESS_LOCAL是指读取缓存在本地节点的数据 
b.NODE_LOCAL是指读取本地节点硬盘数据 
c.ANY是指读取非本地节点数据 
通常读取数据PROCESS_LOCAL>NODE_LOCAL>ANY,尽量使数据以PROCESS_LOCAL或NODE_LOCAL方式读取。其中PROCESS_LOCAL还和cache有关,如果RDD经常用的话将该RDD cache到内存中,注意,由于cache是lazy的,所以必须通过一个action的触发,才能真正的将该RDD cache到内存中。

19.rdd有几种操作类型?

1)transformation,rdd由一种转为另一种rdd 
2)action, 
3)cronroller,crontroller是控制算子,cache,persist,对性能和效率的有很好的支持 
三种类型,不要回答只有2中操作

20.Spark如何处理不能被序列化的对象?

将不能序列化的内容封装成object

21.collect功能是什么,其底层是怎么实现的?

答:driver通过collect把集群中各个节点的内容收集过来汇总成结果,collect返回结果是Array类型的,collect把各个节点上的数据抓过来,抓过来数据是Array型,collect对Array抓过来的结果进行合并,合并后Array中只有一个元素,是tuple类型(KV类型的)的。

22.Spaek程序执行,有时候默认为什么会产生很多task,怎么修改默认task执行个数?

答:1)因为输入数据有很多task,尤其是有很多小文件的时候,有多少个输入 
block就会有多少个task启动;2)spark中有partition的概念,每个partition都会对应一个task,task越多,在处理大规模数据的时候,就会越有效率。不过task并不是越多越好,如果平时测试,或者数据量没有那么大,则没有必要task数量太多。3)参数可以通过spark_home/conf/spark-default.conf配置文件设置: 
spark.sql.shuffle.partitions 50 spark.default.parallelism 10 
第一个是针对spark sql的task数量 
第二个是非spark sql程序设置生效

23.为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?

答:会导致执行该job时候集群资源不足,导致执行job结束也没有分配足够的资源,分配了部分Executor,该job就开始执行task,应该是task的调度线程和Executor资源申请是异步的;如果想等待申请完所有的资源再执行job的:需要将spark.scheduler.maxRegisteredResourcesWaitingTime设置的很大;spark.scheduler.minRegisteredResourcesRatio 设置为1,但是应该结合实际考虑。否则很容易出现长时间分配不到资源,job一直不能运行的情况。

24.map与flatMap的区别

map:对RDD每个元素转换,文件中的每一行数据返回一个数组对象 
flatMap:对RDD每个元素转换,然后再扁平化 
将所有的对象合并为一个对象,文件中的所有行数据仅返回一个数组 
对象,会抛弃值为null的值

25.列举你常用的action?

collect,reduce,take,count,saveAsTextFile等

26.Spark为什么要持久化,一般什么场景下要进行persist操作? 
为什么要进行持久化?

spark所有复杂一点的算法都会有persist身影,spark默认数据放在内存,spark很多内容都是放在内存的,非常适合高速迭代,1000个步骤 
只有第一个输入数据,中间不产生临时数据,但分布式系统风险很高,所以容易出错,就要容错,rdd出错或者分片可以根据血统算出来,如果没有对父rdd进行persist 或者cache的化,就需要重头做。 
以下场景会使用persist 
1)某个步骤计算非常耗时,需要进行persist持久化 
2)计算链条非常长,重新恢复要算很多步骤,很好使,persist 
3)checkpoint所在的rdd要持久化persist, 
lazy级别,框架发现有checnkpoint,checkpoint时单独触发一个job,需要重算一遍,checkpoint前 
要持久化,写个rdd.cache或者rdd.persist,将结果保存起来,再写checkpoint操作,这样执行起来会非常快,不需要重新计算rdd链条了。checkpoint之前一定会进行persist。 
4)shuffle之后为什么要persist,shuffle要进性网络传输,风险很大,数据丢失重来,恢复代价很大 
5)shuffle之前进行persist,框架默认将数据持久化到磁盘,这个是框架自动做的。

27.为什么要进行序列化

序列化可以减少数据的体积,减少存储空间,高效存储和传输数据,不好的是使用的时候要反序列化,非常消耗CPU

28.介绍一下join操作优化经验?

答:join其实常见的就分为两类: map-side join 和 reduce-side join。当大表和小表join时,用map-side join能显著提高效率。将多份数据进行关联是数据处理过程中非常普遍的用法,不过在分布式计算系统中,这个问题往往会变的非常麻烦,因为框架提供的 join 操作一般会将所有数据根据 key 发送到所有的 reduce 分区中去,也就是 shuffle 的过程。造成大量的网络以及磁盘IO消耗,运行效率极其低下,这个过程一般被称为 reduce-side-join。如果其中有张表较小的话,我们则可以自己实现在 map 端实现数据关联,跳过大量数据进行 shuffle 的过程,运行时间得到大量缩短,根据不同数据可能会有几倍到数十倍的性能提升。 
备注:这个题目面试中非常非常大概率见到,务必搜索相关资料掌握,这里抛砖引玉。

29.介绍一下cogroup rdd实现原理,你在什么场景下用过这个rdd?

答:cogroup的函数实现:这个实现根据两个要进行合并的两个RDD操作,生成一个CoGroupedRDD的实例,这个RDD的返回结果是把相同的key中两个RDD分别进行合并操作,最后返回的RDD的value是一个Pair的实例,这个实例包含两个Iterable的值,第一个值表示的是RDD1中相同KEY的值,第二个值表示的是RDD2中相同key的值.由于做cogroup的操作,需要通过partitioner进行重新分区的操作,因此,执行这个流程时,需要执行一次shuffle的操作(如果要进行合并的两个RDD的都已经是shuffle后的rdd,同时他们对应的partitioner相同时,就不需要执行shuffle,), 
场景:表关联查询

30.下面这段代码输出结果是什么?

  1. def joinRdd(sc:SparkContext) {
  2. val name= Array(
  3. Tuple2(1,"spark"),
  4. Tuple2(2,"tachyon"),
  5. Tuple2(3,"hadoop")
  6. )
  7. val score= Array(
  8. Tuple2(1,100),
  9. Tuple2(2,90),
  10. Tuple2(3,80)
  11. )
  12. val namerdd=sc.parallelize(name);
  13. val scorerdd=sc.parallelize(score);
  14. val result = namerdd.join(scorerdd);
  15. result .collect.foreach(println);
  16. }

答案: 
(1,(Spark,100)) 
(2,(tachyon,90)) 
(3,(hadoop,80))

Spark Core面试篇03

1.Spark使用parquet文件存储格式能带来哪些好处?

1) 如果说HDFS 是大数据时代分布式文件系统首选标准,那么parquet则是整个大数据时代文件存储格式实时首选标准 
2) 速度更快:从使用spark sql操作普通文件CSV和parquet文件速度对比上看,绝大多数情况 
会比使用csv等普通文件速度提升10倍左右,在一些普通文件系统无法在spark上成功运行的情况 
下,使用parquet很多时候可以成功运行 
3) parquet的压缩技术非常稳定出色,在spark sql中对压缩技术的处理可能无法正常的完成工作 
(例如会导致lost task,lost executor)但是此时如果使用parquet就可以正常的完成 
4) 极大的减少磁盘I/o,通常情况下能够减少75%的存储空间,由此可以极大的减少spark sql处理 
数据的时候的数据输入内容,尤其是在spark1.6x中有个下推过滤器在一些情况下可以极大的 
减少磁盘的IO和内存的占用,(下推过滤器) 
5) spark 1.6x parquet方式极大的提升了扫描的吞吐量,极大提高了数据的查找速度spark1.6和spark1.5x相比而言,提升了大约1倍的速度,在spark1.6X中,操作parquet时候cpu也进行了极大的优化,有效的降低了cpu 
6) 采用parquet可以极大的优化spark的调度和执行。我们测试spark如果用parquet可以有效的减少stage的执行消耗,同时可以优化执行路径

2.Executor之间如何共享数据?

答:基于hdfs或者基于tachyon

3.Spark累加器有哪些特点?

1)累加器在全局唯一的,只增不减,记录全局集群的唯一状态 
2)在exe中修改它,在driver读取 
3)executor级别共享的,广播变量是task级别的共享 
两个application不可以共享累加器,但是同一个app不同的job可以共享

4.如何在一个不确定的数据规模的范围内进行排序?

为了提高效率,要划分划分,划分的范围并且是有序的 要么有序,要么降序? 
水塘抽样:目的是从一个集合中选取,集合非常答,适合内存 
无法容纳数据的时候使用 从N中抽取出K个,N是随机数

5.spark hashParitioner的弊端是什么?

答:HashPartitioner分区的原理很简单,对于给定的key,计算其hashCode,并除于分区的个数取余,如果余数小于0,则用余数+分区的个数,最后返回的值就是这个key所属的分区ID;弊端是数据不均匀,容易导致数据倾斜,极端情况下某几个分区会拥有rdd的所有数据

6.RangePartitioner分区的原理?

答:RangePartitioner分区则尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,也就是说一个分区中的元素肯定都是比另一个分区内的元素小或者大;但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。其原理是水塘抽样。可以参考这篇博文 
https://www.iteblog.com/archives/1522.html

7.介绍parition和block有什么关联关系?

答:1)hdfs中的block是分布式存储的最小单元,等分,可设置冗余,这样设计有一部分磁盘空间的浪费,但是整齐的block大小,便于快速找到、读取对应的内容;

2)Spark中的partion是弹性分布式数据集RDD的最小单元,RDD是由分布在各个节点上的partion组成的。partion是指的spark在计算过程中,生成的数据在计算空间内最小单元,同一份数据(RDD)的partion大小不一,数量不定,是根据application里的算子和最初读入的数据分块数量决定;

3)block位于存储空间、partion位于计算空间,block的大小是固定的、partion大小是不固定的,是从2个不同的角度去看数据。

8.Spark应用程序的执行过程是什么?

1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源; 
2).资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上; 
3).SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。 
4).Task在Executor上运行,运行完毕释放所有资源。

9.hbase预分区个数和spark过程中的reduce个数相同么

答:和spark的map个数相同,reduce个数如果没有设置和reduce前的map数相同。

10.如何理解Standalone模式下,Spark资源分配是粗粒度的?

答:spark默认情况下资源分配是粗粒度的,也就是说程序在提交时就分配好资源,后面执行的时候 
使用分配好的资源,除非资源出现了故障才会重新分配。比如Spark shell启动,已提交,一注册,哪怕没有任务,worker都会分配资源给executor。

11.Spark如何自定义partitioner分区器?

答:1)spark默认实现了HashPartitioner和RangePartitioner两种分区策略,我们也可以自己扩展分区策略,自定义分区器的时候继承org.apache.spark.Partitioner类,实现类中的三个方法 
def numPartitions: Int:这个方法需要返回你想要创建分区的个数; 
def getPartition(key: Any): Int:这个函数需要对输入的key做计算,然后返回该key的分区ID,范围一定是0到numPartitions-1; 
equals():这个是Java标准的判断相等的函数,之所以要求用户实现这个函数是因为Spark内部会比较两个RDD的分区是否一样。 
2)使用,调用parttionBy方法中传入自定义分区对象 
参考:http://blog.csdn.net/high2011/article/details/68491115

12.spark中task有几种类型?

答:2种类型:1)result task类型,最后一个task,2是shuffleMapTask类型,除了最后一个task都是

13.union操作是产生宽依赖还是窄依赖?

答:窄依赖

14.rangePartioner分区器特点?

答:rangePartioner尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素肯定都是比另一个分区内的元素小或者大;但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。RangePartitioner作用:将一定范围内的数映射到某一个分区内,在实现中,分界的算法尤为重要。算法对应的函数是rangeBounds

15.什么是二次排序,你是如何用spark实现二次排序的?(互联网公司常面)

答:就是考虑2个维度的排序,key相同的情况下如何排序,参考博文:http://blog.csdn.net/sundujing/article/details/51399606

16.如何使用Spark解决TopN问题?(互联网公司常面)

答:常见的面试题,参考博文:http://www.cnblogs.com/yurunmiao/p/4898672.html

17.如何使用Spark解决分组排序问题?(互联网公司常面)

组织数据形式: 
aa 11 
bb 11 
cc 34 
aa 22 
bb 67 
cc 29 
aa 36 
bb 33 
cc 30 
aa 42 
bb 44 
cc 49 
需求: 
1、对上述数据按key值进行分组 
2、对分组后的值进行排序 
3、截取分组后值得top 3位以key-value形式返回结果

代码如下

  1. val groupTopNRdd = sc.textFile("hdfs://db02:8020/user/hadoop/groupsorttop/groupsorttop.data")
  2. groupTopNRdd.map(_.split(" ")).map(x => (x(0),x(1))).groupByKey().map(
  3. x => {
  4. val xx = x._1
  5. val yy = x._2
  6. (xx,yy.toList.sorted.reverse.take(3))
  7. }
  8. ).collect

18.窄依赖父RDD的partition和子RDD的parition是不是都是一对一的关系?

答:不一定,除了一对一的窄依赖,还包含一对固定个数的窄依赖(就是对父RDD的依赖的Partition的数量不会随着RDD数量规模的改变而改变),比如join操作的每个partiion仅仅和已知的partition进行join,这个join操作是窄依赖,依赖固定数量的父rdd,因为是确定的partition关系

19.Hadoop中,Mapreduce操作的mapper和reducer阶段相当于spark中的哪几个算子?

答:相当于spark中的map算子和reduceByKey算子,当然还是有点区别的,MR会自动进行排序的,spark要看你用的是什么partitioner

20.什么是shuffle,以及为什么需要shuffle?

shuffle中文翻译为洗牌,需要shuffle的原因是:某种具有共同特征的数据汇聚到一个计算节点上进行计算

21.不需要排序的hash shuffle是否一定比需要排序的sort shuffle速度快?

答:不一定!!当数据规模小,Hash shuffle快于Sorted Shuffle数据规模大的时候;当数据量大,sorted Shuffle会比Hash shuffle快很多,因为数量大的有很多小文件,不均匀,甚至出现数据倾斜,消耗内存大,1.x之前spark使用hash,适合处理中小规模,1.x之后,增加了Sorted shuffle,Spark更能胜任大规模处理了。

22.Spark中的HashShufle的有哪些不足?

答:1)shuffle产生海量的小文件在磁盘上,此时会产生大量耗时的、低效的IO操作;

2).容易导致内存不够用,由于内存需要保存海量的文件操作句柄和临时缓存信息,如果数据处理规模比较大的化,容易出现OOM;

3)容易出现数据倾斜,导致OOM。

23.conslidate是如何优化Hash shuffle时在map端产生的小文件?

答:1)conslidate为了解决Hash Shuffle同时打开过多文件导致Writer handler内存使用过大以及产生过多文件导致大量的随机读写带来的低效磁盘IO;2)conslidate根据CPU的个数来决定每个task shuffle map端产生多少个文件,假设原来有10个task,100个reduce,每个CPU有10个CPU 
那么使用hash shuffle会产生10*100=1000个文件,conslidate产生10*10=100个文件 
备注:conslidate部分减少了文件和文件句柄,并行读很高的情况下(task很多时)还是会很多文件

24.Sort-basesd shuffle产生多少个临时文件

答:2*Map阶段所有的task数量,Mapper阶段中并行的Partition的总数量,其实就是Mapper端task

25.Sort-based shuffle的缺陷?

1) 如果mapper中task的数量过大,依旧会产生很多小文件,此时在shuffle传递数据的过程中reducer段,reduce会需要同时大量的记录进行反序列化,导致大量的内存消耗和GC的巨大负担,造成系统缓慢甚至崩溃 
2)如果需要在分片内也进行排序,此时需要进行mapper段和reducer段的两次排序

26.Spark shell启动时会启动derby?

答: spark shell启动会启动spark sql,spark sql默认使用derby保存元数据,但是尽量不要用derby,它是单实例,不利于开发。会在本地生成一个文件metastore_db,如果启动报错,就把那个文件给删了 ,derby数据库是单实例,不能支持多个用户同时操作,尽量避免使用

27.spark.default.parallelism这个参数有什么意义,实际生产中如何设置?

答:1)参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能;2)很多人都不会设置这个参数,会使得集群非常低效,你的cpu,内存再多,如果task始终为1,那也是浪费,spark官网建议task个数为CPU的核数*executor的个数的2~3倍。

28.spark.storage.memoryFraction参数的含义,实际生产中如何调优?

答:1)用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6,,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。2)如果持久化操作比较多,可以提高spark.storage.memoryFraction参数,使得更多的持久化数据保存在内存中,提高数据的读取性能,如果shuffle的操作比较多,有很多的数据读写操作到JVM中,那么应该调小一点,节约出更多的内存给JVM,避免过多的JVM gc发生。在web ui中观察如果发现gc时间很长,可以设置spark.storage.memoryFraction更小一点。

29.spark.shuffle.memoryFraction参数的含义,以及优化经验?

答:1)spark.shuffle.memoryFraction是shuffle调优中 重要参数,shuffle从上一个task拉去数据过来,要在Executor进行聚合操作,聚合操作时使用Executor内存的比例由该参数决定,默认是20% 如果聚合时数据超过了该大小,那么就会spill到磁盘,极大降低性能;

2)如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值

30.介绍一下你对Unified Memory Management内存管理模型的理解?

答:Spark中的内存使用分为两部分:执行(execution)与存储(storage)。执行内存主要用于shuffles、joins、sorts和aggregations,存储内存则用于缓存或者跨节点的内部数据传输。1.6之前,对于一个Executor,内存都有哪些部分构成: 
1)ExecutionMemory。这片内存区域是为了解决 shuffles,joins, sorts and aggregations 过程中为了避免频繁IO需要的buffer。 通过spark.shuffle.memoryFraction(默认 0.2) 配置。 
2)StorageMemory。这片内存区域是为了解决 block cache(就是你显示调用dd.cache, rdd.persist等方法), 还有就是broadcasts,以及task results的存储。可以通过参数 spark.storage.memoryFraction(默认0.6)。设置 
3)OtherMemory。给系统预留的,因为程序本身运行也是需要内存的。 (默认为0.2). 
传统内存管理的不足: 
1).Shuffle占用内存0.2*0.8,内存分配这么少,可能会将数据spill到磁盘,频繁的磁盘IO是很大的负担,Storage内存占用0.6,主要是为了迭代处理。传统的Spark内存分配对操作人的要求非常高。(Shuffle分配内存:ShuffleMemoryManager, TaskMemoryManager,ExecutorMemoryManager)一个Task获得全部的Execution的Memory,其他Task过来就没有内存了,只能等待。 
2).默认情况下,Task在线程中可能会占满整个内存,分片数据特别大的情况下就会出现这种情况,其他Task没有内存了,剩下的cores就空闲了,这是巨大的浪费。这也是人为操作的不当造成的。 
3).MEMORY_AND_DISK_SER的storage方式,获得RDD的数据是一条条获取,iterator的方式。如果内存不够(spark.storage.unrollFraction),unroll的读取数据过程,就是看内存是否足够,如果足够,就下一条。unroll的space是从Storage的内存空间中获得的。unroll的方式失败,就会直接放磁盘。 
4). 默认情况下,Task在spill到磁盘之前,会将部分数据存放到内存上,如果获取不到内存,就不会执行。永无止境的等待,消耗CPU和内存。 
在此基础上,Spark提出了UnifiedMemoryManager,不再分ExecutionMemory和Storage Memory,实际上还是分的,只不过是Execution Memory访问Storage Memory,Storage Memory也可以访问Execution Memory,如果内存不够,就会去借。

Spark on Yarn面试篇 

1.MRV1有哪些不足?

1)可扩展性(对于变化的应付能力) 
a) JobTracker内存中保存用户作业的信息 
b) JobTracker使用的是粗粒度的锁 
2)可靠性和可用性 
a) JobTracker失效会多事集群中所有的运行作业,用户需手动重新提交和恢复工作流 
3)对不同编程模型的支持 
HadoopV1以MapReduce为中心的设计虽然能支持广泛的用例,但是并不适合所有大型计算,如storm,spark

2.描述Yarn执行一个任务的过程?

1)客户端client向ResouceManager提交Application,ResouceManager接受Application 
并根据集群资源状况选取一个node来启动Application的任务调度器driver(ApplicationMaster) 
2)ResouceManager找到那个node,命令其该node上的nodeManager来启动一个新的JVM进程运行程序的driver(ApplicationMaster)部分,driver(ApplicationMaster)启动时会首先向ResourceManager注册,说明由自己来负责当前程序的运行 
3)driver(ApplicationMaster)开始下载相关jar包等各种资源,基于下载的jar等信息决定向ResourceManager申请具体的资源内容。 
4)ResouceManager接受到driver(ApplicationMaster)提出的申请后,会最大化的满足 资源分配请求,并发送资源的元数据信息给driver(ApplicationMaster); 
5)driver(ApplicationMaster)收到发过来的资源元数据信息后会根据元数据信息发指令给具体机器上的NodeManager,让其启动具体的container。 
6)NodeManager收到driver发来的指令,启动container,container启动后必须向driver(ApplicationMaster)注册。 
7)driver(ApplicationMaster)收到container的注册,开始进行任务的调度和计算,直到任务完成。 补充:如果ResourceManager第一次没有能够满足driver(ApplicationMaster)的资源请求 ,后续发现有空闲的资源,会主动向driver(ApplicationMaster)发送可用资源的元数据信息以提供更多的资源用于当前程序的运行。

3.Yarn中的container是由谁负责销毁的,在Hadoop Mapreduce中container可以复用么?

答:ApplicationMaster负责销毁,在Hadoop Mapreduce不可以复用,在spark on yarn程序container可以复用

4.提交任务时,如何指定Spark Application的运行模式?

1)cluster模式:./spark-submit –class xx.xx.xx –master yarn –deploy-mode cluster xx.jar 
2) client模式:./spark-submit –class xx.xx.xx –master yarn –deploy-mode client xx.jar

5.不启动Spark集群Master和work服务,可不可以运行Spark程序?

答:可以,只要资源管理器第三方管理就可以,如由yarn管理,spark集群不启动也可以使用spark;spark集群启动的是work和master,这个其实就是资源管理框架,yarn中的resourceManager相当于master,NodeManager相当于worker,做计算是Executor,和spark集群的work和manager可以没关系,归根接底还是JVM的运行,只要所在的JVM上安装了spark就可以。

6.Spark中的4040端口由什么功能?

答:收集Spark作业运行的信息

7.spark on yarn Cluster 模式下,ApplicationMaster和driver是在同一个进程么?

答:是,driver 位于ApplicationMaster进程中。该进程负责申请资源,还负责监控程序、资源的动态情况。

8.如何使用命令查看application运行的日志信息

答:yarn logs -applicationId

9.Spark on Yarn 模式有哪些优点?

1)与其他计算框架共享集群资源(eg.Spark框架与MapReduce框架同时运行,如果不用Yarn进行资源分配,MapReduce分到的内存资源会很少,效率低下);资源按需分配,进而提高集群资源利用等。 
2)相较于Spark自带的Standalone模式,Yarn的资源分配更加细致 
3)Application部署简化,例如Spark,Storm等多种框架的应用由客户端提交后,由Yarn负责资源的管理和调度,利用Container作为资源隔离的单位,以它为单位去使用内存,cpu等。 
4)Yarn通过队列的方式,管理同时运行在Yarn集群中的多个服务,可根据不同类型的应用程序负载情况,调整对应的资源使用量,实现资源弹性管理。

10.谈谈你对container的理解?

1) Container作为资源分配和调度的基本单位,其中封装了的资源如内存,CPU,磁盘,网络带宽等。 目前yarn仅仅封装内存和CPU 
2) Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster 
3) Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令.

11.运行在yarn中Application有几种类型的container?

1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源; 
2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。

12.Spark on Yarn架构是怎么样的?(要会画哦,这个图)

Yarn提到的App Master可以理解为Spark中Standalone模式中的driver。Container中运行着Executor,在Executor中以多线程并行的方式运行Task。运行过程和第二题相似。

13.Executor启动时,资源通过哪几个参数指定?

1)num-executors是executor的数量 
2)executor-memory 是每个executor使用的内存 
3)executor-cores 是每个executor分配的CPU

14.为什么会产生yarn,解决了什么问题,有什么优势?

1)为什么产生yarn,针对MRV1的各种缺陷提出来的资源管理框架 
2)解决了什么问题,有什么优势,参考这篇博文:http://www.aboutyun.com/forum.php?mod=viewthread&tid=6785

15.Mapreduce的执行过程?

阶段1:input/map/partition/sort/spill 
阶段2:mapper端merge 
阶段3:reducer端merge/reduce/output 
详细过程参考这个http://www.cnblogs.com/hipercomer/p/4516581.html

16.一个task的map数量由谁来决定?

一般情况下,在输入源是文件的时候,一个task的map数量由splitSize来决定的,那么splitSize是由以下几个来决定的 
goalSize = totalSize / mapred.map.tasks 
inSize = max {mapred.min.split.size, minSplitSize} 
splitSize = max (minSize, min(goalSize, dfs.block.size)) 
一个task的reduce数量,由partition决定。

17.reduce后输出的数据量有多大?

并不是想知道确切的数据量有多大这个,而是想问你,MR的执行机制,开发完程序,有没有认真评估程序运行效率 
1)用于处理redcue任务的资源情况,如果是MRV1的话,分了多少资源给map,多少个reduce 
如果是MRV2的话,可以提一下,集群有分了多少内存、CPU给yarn做计算 。 
2)结合实际应用场景回答,输入数据有多大,大约多少条记录,做了哪些逻辑操作,输出的时候有多少条记录,执行了多久,reduce执行时候的数据有没有倾斜等 
3)再提一下,针对mapReduce做了哪几点优化,速度提升了多久,列举1,2个优化点就可以

18.你的项目提交到job的时候数据量有多大?

答:1)回答出数据是什么格式,有没有采用什么压缩,采用了压缩的话,压缩比大概是多少;

2)文件大概多大:大概起了多少个map,起了多少个reduce,map阶段读取了多少数据,reduce阶段读取了多少数据,程序大约执行了多久;

3)集群什么规模,集群有多少节点,多少内存,多少CPU核数等。把这些点回答进去,而不是给个数字了事。

19.你们提交的job任务大概有多少个?这些job执行完大概用多少时间?

还是考察你开发完程序有没有认真观察过程序的运行,有没有评估程序运行的效率

20.你们业务数据量多大?有多少行数据?

这个也是看你们有没有实际的经验,对于没有实战的同学,请把回答的侧重点放在MR的运行机制上面, 
MR运行效率方面,以及如何优化MR程序(看别人的优化demo,然后在虚拟机上拿demo做一下测试)。

22.如何杀死一个正在运行的job

杀死一个job 
MRV1:Hadoop job kill jobid 
YARN: yarn application -kill applicationId

23.列出你所知道的调度器,说明其工作原理

a) Fifo schedular 默认的调度器 先进先出 
b) Capacity schedular 计算能力调度器 选择占用内存小 优先级高的 
c) Fair schedular 调肚脐 公平调度器 所有job 占用相同资源

24.YarnClient模式下,执行Spark SQL报这个错,Exception in thread “Thread-2” java.lang.OutOfMemoryError: PermGen space,但是在Yarn Cluster模式下正常运行,可能是什么原因?

1)原因查询过程中调用的是Hive的获取元数据信息、SQL解析,并且使用Cglib等进行序列化反序列化,中间可能产生较多的class文件,导致JVM中的持久代使用较多 
Cluster模式的持久代默认大小是64M,Client模式的持久代默认大小是32M,而Driver端进行SQL处理时,其持久代的使用可能会达到90M,导致OOM溢出,任务失败。 
yarn-cluster模式下出现,yarn-client模式运行时倒是正常的,原来在SPARKHOME/bin/spark−class文件中已经设置了持久代大小:JAVAOPTS=”−XX:MaxPermSize=256mSPARKHOME/bin/spark−class文件中已经设置了持久代大小:JAVAOPTS=”−XX:MaxPermSize=256mOUR_JAVA_OPTS” 
2)解决方法:在Spark的conf目录中的spark-defaults.conf里,增加对Driver的JVM配置,因为Driver才负责SQL的解析和元数据获取。配置如下: 
spark.driver.extraJavaOptions -XX:PermSize=128M -XX:MaxPermSize=256M

25.spark.driver.extraJavaOptions这个参数是什么意思,你们生产环境配了多少?

传递给executors的JVM选项字符串。例如GC设置或者其它日志设置。注意,在这个选项中设置Spark属性或者堆大小是不合法的。Spark属性需要用SparkConf对象或者spark-submit脚本用到的spark-defaults.conf文件设置。堆内存可以通过spark.executor.memory设置

26.导致Executor产生FULL gc 的原因,可能导致什么问题?

答:可能导致Executor僵死问题,海量数据的shuffle和数据倾斜等都可能导致full gc。以shuffle为例,伴随着大量的Shuffle写操作,JVM的新生代不断GC,Eden Space写满了就往Survivor Space写,同时超过一定大小的数据会直接写到老生代,当新生代写满了之后,也会把老的数据搞到老生代,如果老生代空间不足了,就触发FULL GC,还是空间不够,那就OOM错误了,此时线程被Blocked,导致整个Executor处理数据的进程被卡住

27.Combiner 和partition的作用

combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的。combine函数把一个map函数产生的

Spark相关面试题的更多相关文章

  1. C# 相关面试试题简单的总结

    最近一个搞NET开发的朋友离职了,想让我给他找点关于NET的相关面试题,准备抱一下佛脚,迎接新的挑战. 我赶紧找到以前检索的各种宝典,试题,今天梳理一下关于NET的基础知识点. 1.面向对象语言的三大 ...

  2. hadoop和spark相关参数的配置

    背景 MapReduce和Spark对外提供了上百个配置参数,用户可以为作业定制这些参数以更快,更稳定的运行应用程序.本文梳理了最常用的一些MapReduce和Spark配置参数. MapReduce ...

  3. Linux相关面试题&答案

    Linux相关面试题&答案 Linux面试题&答案 假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] " ...

  4. HashMap源码与相关面试题

    一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...

  5. spring MyBatis的相关面试题

    (相关面试题! 供参考!) 1.ORM框架有哪些? MyBatis:半自动化框架(不是纯ORM) 需要写动态SQL语句,实体类和SQL语句之间建立映射关系 Spring:轻量级框架, Java EE的 ...

  6. Kafka相关面试题及答案

    Kafka相关面试题及答案 1. Kafka中的ISR.AR又代表什么? ISR:与leader保持同步的follower集合 AR:分区的所有副本 2. Kafka中的HW.LEO等分别代表什么? ...

  7. Struts2相关面试题

    Struts2面试题 1.struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心 ...

  8. JavaScript定时器及相关面试题

    在单线程JavaScript这篇文章中,在介绍JavaScript单线程的同时,也介绍了setTimeout是如何工作的.但是对于定时器的一些内容,并没有做深入的讨论.这篇文章,会详细说说JS的两种定 ...

  9. js事件相关面试题

    说是面试题,其实也相当于是对js事件部分知识点的一个总结.简单内容一笔带过,了解详情我都给出了参考链接,都是之前写的一些相关文章.JavaScript本身没有事件模型,但是环境可以有. DOM:add ...

  10. Java线程和进程相关面试题与答案总结

    有几天没有写一写博客了,今天就带给大家一些面试题和参考答案吧! 这些都是上海尚学堂Java培训的学员去面试时遇到的问题,今天总结出来的是Java线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...

随机推荐

  1. 线段树的区间更新 hdu 1698

    ***第一次写的果断超时,所以百度了一下,知道我写的每一次都要递归最底层,这样会花费很多时间,第二次写得线段树的区间更新,因为一个条件写错了,真是让我坑到死, 这样区间相同的不必更新,省了很多时间.. ...

  2. Feign源码解析7:nacos loadbalancer不支持静态ip的负载均衡

    背景 在feign中,一般是通过eureka.nacos等获取服务实例,但有时候调用一些服务时,人家给的是ip或域名,我们这时候还能用Feign这一套吗? 可以的. 有两种方式,一种是直接指定url: ...

  3. Angular系列教程之管道

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  4. 英语学习 : Get + 形容词 ( 表示由无到有的变化过程 )

    I am happy .    表示事实 I got happy .    强调变化过程 get + 名词  :  得到 ...物或人 get + 形容词  :  变得 ...样

  5. iframe访问页面,出现 ERR_BLOCKED_BY_RESPONSE

    那是因为服务器输出了 X-Frame-Options 头,只要把这个头删除掉,就没问题了

  6. [转帖]堆表(HOT)和索引组织表(IOT)优缺点

      转载于: https://www.ywnds.com/?p=7702 一.堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思. ...

  7. [转帖]--build=arm-linux

    今天在arm上用configure生成makefile时报错:configure: error: cannot guess build type; you must specify one 问题: 不 ...

  8. [转帖]KingbaseES V8R6 中walminer的使用

    https://www.cnblogs.com/kingbase/p/17315750.html 前言 walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作.例如 ...

  9. [转帖] 常见的Socket网络异常场景分析

    https://www.cnblogs.com/codelogs/p/16001770.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 在目前微服务的 ...

  10. [转帖]HTTP 框架 Hertz 实践入门:性能测试指南

    https://maimai.cn/article/detail?fid=1767401397&efid=R2_kM5y-yEUDCK88FZWrGA 干货不迷路2021 年 9 月 8 日, ...