Spark Core面试篇01
1、简答题
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技术栈有哪些组件,每一个组件都有什么功能,适合什么应用场景?
答:能够画一个这样的技术栈图先,而后分别解释下每一个组件的功能和场景node
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之间的映射。
1四、spark有哪些组件?
答:主要有以下组件:
1)master:管理集群和节点,不参与计算。
2)worker:计算节点,进程自己不参与计算,和master汇报。
3)Driver:运行程序的main方法,建立spark context对象。
4)spark context:控制整个application的生命周期,包括dagsheduler和task scheduler等组件。
5)client:用户提交程序的入口。
1五、spark工做机制?
答:用户在client端提交做业后,会由Driver运行main方法并建立spark context上下文。
执行add算子,造成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler。 task scheduler会将stage划分为task set分发到各个节点的executor中执行。
1六、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最根本的函数,最底层的函数linux
2、选择题web
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.支持动态资源分配算法
5.哪一个不是本地模式运行的个条件 ( D)
A spark.localExecution.enabled=true
B 显式指定本地运行
C finalStage 无父 Stage
D partition默认值sql
6.下面哪一个不是 RDD 的特色 (C )
A. 可分区 B 可序列化 C 可修改 D 可持久化shell
关于广播变量,下面哪一个是错误的 (D )
A 任何函数调用 B 是只读的
C 存储在各个节点 D 存储在磁盘或 HDFS数据库
关于累加器,下面哪一个是错误的 (D )
A 支持加法 B 支持数值类型
C 可并行 D 不支持自定义类型编程
9.Spark 支持的分布式部署方式中哪一个是错误的 (D )
A standalone B spark on mesos
C spark on YARN D Spark on localapi
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