Spark Core面试题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的数字分别代表什么意思?

答:常见的稳定版本有spark1.3,spark1.6,spark2.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适合调试,driver运行在客户端.

4)spark  on mesos模式.官方推荐这种模式(当然,原因之一是血缘关系).正是由于spark开发之初就考虑到支持Mesos,因此,目前而言,spark运行在Mesos上会比较运行在Yarn上更加灵活,更加自然.用户可选择两种调度模式之一运行自己的应用程序:

     1)  粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Driver和若干个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最根本的函数,最底层的函数

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值