Spark面试问题汇总

(一、基础概念

1、什么是spark

是一种通用的大数据计算框架,基于内存进行计算。

spark sql  spark streaming   spark rdd

计算速度快(rdd内存计算) (基于dag的任务编排 ) (比mapreduce快100倍)

易于使用(丰富的算子) (支持多种语言)

通用的大数据解决方案 (spark批处理) (spark sql)(spark streaming流处理)

丰富的生态圈 (支持多种数据类型)(机器学习)(图计算)

2、spark的基本概念

(1)Application:表示应用程序

(2)Driver:表示main()函数,创建SparkContext。由SparkContext负责与

ClusterManage通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭SparkContext。

(3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上。在Spark on Yarn模式下,其进程名称为 CoarseGrainedExecutor Backend,一个CoarseGrainedExecutor Backend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task,这样,每个CoarseGrainedExecutorBackend能并行运行Task的数据就取决于分配给它的CPU的个数。

(4)Worker:集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点。

(5)Task:最小执行单元,在Executor进程中执行任务的工作单元,多个Task组成一个Stage。每个Task只是负责一个分区的数据处理,因此一般有多少个分区就有多少个Task。

(6)Job:包含多个Task组成的并行计算,是由Action行为触发的。一个Job包含一个Action和N个Transform操作;

(7)Stage:由于shuffle操作而划分的TaskSet,Stage的划分是根据其宽窄依赖关系。

(8)DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是RDD之间的依赖关系

(9)TaskScheduler:将TaskSet提交给Worker(集群)运行,每个Executor运行什么Task就是在此处分配的。

3、Spark中的exactly once语义

exactly once指在数据处理过程中,系统具有良好的容错性,能够保证数据处理不重不丢,,每一条数据仅被处理一次。

spark中保证exactly once的机制有:数据源的可重放性、计算过程中的容错性、以及写入存储介质时的幂等性或者事务性。详见:https://www.jianshu.com/p/e990ccc19d25


(1)数据源具有可重放性

指的是在出现问题时可以重新获取到需要的数据,一般Spark的数据源分为两种:

  1. 第一种为基于文件系统的数据源,如HDFS,这种数据源的数据来自于文件,所以本身就具备了可重放性;
  2. 另一种为基于外部接收器的数据源,如Kafka,这种数据源就不一定能够具备可重放性,需要具体考虑。(一般与Kafka配合使用的是Spark中的SparkStreaming模块,用来对流式数据进行准实时的处理。)

(2)计算过程中的容错性
 

Driver与Executor的高可用性不说,Spark应用内部则采用checkpoint和lineage的机制来确保容错性。

lineage血统

RDD在转化的过程中,由于父RDD与子RDD存在依赖关系(Dependency)形成的lineage,也可以理解为lineage串起了RDD DAG。

RDD可以进行缓存,通过调用persist或者cache方法,将RDD持久化到内存或者磁盘中,这样缓存的RDD就可以被保留在计算节点的内存中被重用,缓存是构建Spark快速迭代的关键。

当一个RDD丢失的情况下,Spark会去寻找它的父RDD是否已经缓存,如果已经缓存,可以通过父RDD直接算出当前的RDD,从而避免了缓存之前的RDD的计算过程,且只有丢失数据的partition需要进行重算,这样Spark就避免了RDD上的重复计算,能够极大的提升计算速度。

缓存虽然可以提升Spark快速迭代计算的速度,但是缓存是会丢失的。

checkpoint
可以切断lineage的依赖关系,在某个重要的节点,将RDD持久化到文件系统中(一般选择HDFS),这样就算之前的缓存已经丢失了,也可以保证检查点数据不会丢失,这样在恢复的时候,会直接从检查点的数据开始进行计算,检查点机制在SparkStreaming这种流式计算中发挥的作用会更大。


(3)写入存储介质的幂等性或事务性
幂等更新
指多次写入的结果总是写入相同的数据,比较典型的例子是key-value型数据库,即使数据可能多次写入,但是最终的结果也不会影响其正确性。

事务更新
指所有的更新都是基于事务的,所以更新都是exactly once。Spark需要用户自己实现事物机制。

二、面试题汇总

1、Spark RDD 的几大特性

  1. A list of partitions切片:数据集的基本单位,RDD是由多个分区(partition)组成的集合。
  2. A function for computing each split:对于RDD的计算,其实是RDD的每个分区都会执行这个计算。
  3. A list of dependencies on other RDDs:记录RDD与父RDD的依赖关系。
  4. a Partitioner for key-value RDDs:k:v结构的RDD拥有的分片函数。包括HashPartition、RangPartition
  5. a list of preferred locations to compute each split:计算就 近原则,Spark会尽量的将计算和存储放在同一个位置中。

2、知道的Spark参数配置

Spark提供三个位置用来配置系统:

  • Spark属性:控制大部分的应用程序参数,可以用SparkConf对象或者Java系统属性设置

  • 环境变量:可以通过每个节点的conf/spark-env.sh脚本设置。例如IP地址、端口等信息

  • 日志配置:可以通过log4j.properties配置

详见:(101条消息) Spark配置参数详解_guohecang的博客-CSDN博客_spark参数配置

3、SparkSQL参数配置

(1)num-executors

 设置任务executor个数,默认值为4,一般调整此参数需要同时调整并行度(参考4)。任务设置executor个数的依据是业务期望任务运行时间,可以先设置一个较小值,通过调整此参数及并行度直到运行时间达到期望。

(2)--executor-cores

设置单个executor的core数,默认为1,建议不要超过2。总core数为executor个数*单个executor的core数。此外,单个executor申请的core数与内存的比例要保持在1:4

(3)--executor-memory

executor内存,默认值为4g。每个executor申请的core数与内存比例要保持在1:4。

Shuflle相关

(4)--spark.sql.shuffle.partitions

调整stage的并行度,也就是每个stage的task个数,默认值为40。一般设置为任务申请的总core数的2-4倍。

在有JOIN或聚合等需要shuffle的操作时,从mapper端写出的partition个数。当作业数据较多时,适当调大该值,当作业数据较少时,适当调小以节省资源。

如select a, avg(c) from test_table group by a语句,不考虑优化行为,如果一个map端的task中包含有3000个a,根据spark.sql.shuffle.partitions=2000,会将计算结果分成2000份partition(例如按2000取余),写到磁盘,启动2000个reducer,每个reducer从每个mapper端拉取对应索引的partition。

(5)spark.sql.adaptive.shuffle.targetPostShuffleInputSize

和spark.sql.adaptive.enabled配合使用,当开启调整partition功能后,当mapper端两个partition的数据合并后数据量小于targetPostShuffleInputSize时,Spark会将两个partition进行合并到一个reducer端进行处理。平台默认为67108864(64M),用户可根据自身作业的情况酌情调整该值。当调大该值时,一个reduce端task处理的数据量变大,最终产出的数据,存到HDFS上的文件也变大。当调小该值时,相反。

(5)spark.shuffle.service.enabled、spark.dynamicAllocation.enabled

同时设置为true可开启动态资源分配,开启后可防止资源浪费情况。

spark.sql.adaptive.enabled:是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行。平台默认开启,同时强烈建议开启。理由:更好利用单个executor的性能,还能缓解小文件问题

 
 

详见:(101条消息) SparkSQL参数配置指南_清贫道人的博客-CSDN博客_spark-sql 启动参数

4.Spark完成一个数据生产任务(执行一条SQL)的基本过程如下

(1)对SQL进行语法分析,生成逻辑执行计划。

(2)从Hive metastore server获取表信息,结合逻辑执行计划生成并优化物理执行计划。

(3)根据物理执行计划向Yarn申请资源(executor),调度task到executor执行。

(4)从HDFS读取数据,任务执行,任务执行结束后将数据写回HDFS。
 


5. spark straming  计算引擎的原理 

Spark Streaming,其实就是一种Spark提供的,对于大数据,进行实时计算的一种框架。针对实时计算的特点,在RDD之上,进行了一层封装——DStream。

参考链接:https://www.jianshu.com/p/e990ccc19d25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值