Spark面试高频真题一--Spark基础

〇、前言

Spark是业界常用的大规模分布式数据处理引擎,也是数仓开发最常用的工具组件,通常一二三轮面试官都会或多或少的提问相关的基础问题。下面是总结的常见的面试问题和答案参考。

一、Spark基础

1.spark和hive的区别是?

HiveQL是基于MapReduce框架和HDFS进行数据处理。Spark是基于spark算子和RDD进行数据处理的数据框架。RDD自动的基于内存和磁盘混合处理,速度会更快。

spark会根据DAG进行调度优化,无shuffle或者结果输出的算子的RDD都划分为同一stage,从而提高效率(尽可能并行,减少了shuffle的次数)。

同一个stage可以线程级并行加速,比hive的进程并行启动关闭的开销少一些。

Spark有lineage容错机制,中间执行错误时可以从最近的RDD分区断点进行重跑,效率会更高。

真题回顾

抖音数据开发一面

2.rdd的弹性怎么理解?

“弹性”是指在任何时候都能进行重算。当集群中的一台机器挂掉而导致存储在其上的RDD丢失后,Spark还可以重新计算出这部分的分区的数据,但用户感觉不到这部分的内容丢失过,RDD数据集就像块带有弹性的海绵一样,不管怎样挤压(分区遭到破坏)都是完整的。

具体实现的话是通过checkpoint和persist的数据持久化缓存机制,可以在分区故障之后通过上游血缘重新计算,从而达到快速恢复、用户无感的效果。

真题回顾

58同城数据开发一面

3.mapreduce的原理,运行过程介绍一下?

mapreduce的处理过程由map和reduce两个阶段组成,map和reduce任务的逻辑由用户自定义,但需要符合框架规范。

map前会将文件进行分片,分成大小相同的文件块,输入不同的map task进行处理。

map task处理完成之后会给每一条数据一个key值,key值会决定每条数据具体去往哪一个reduce task。相同key值的数据会发送到同一个reduce task,通常key值是多对一的。 

另外map传输数据前,通常会在本地按key将数据进行排序,同一个节点的相同key的数据会合并在一起,降低传输开销。接着是reduce接收数据。这个过程就叫shuffle。

Reduce端接收到数据后,再进行reduce端的计算处理。最终多个key值的数据集合会变成同一个数据集合。

真题回顾

得物数据开发一面

3.1,哪些查询是只有map的?

select from where 

真题回顾

得物数据开发一面

4.什么是宽依赖、什么是窄依赖?

窄依赖:父 RDD 的一个分区最多只会被子RDD 的一个分区依赖;

宽依赖:父 RDD 的一个分区会被子RDD的多个分区依赖(涉及到 shuffle)。

真题回顾

TIKTOK数据开发一面

5.哪些操作是宽依赖的操作?

具有宽依赖的transformations 包括: sort, reduceByKey, groupByKey, join, 和调用rePartition函数的任何操作.

真题回顾

TIKTOK数据开发一面

6.join操作都是宽依赖的操作吗?

如果join操作的两个RDD的分区器的分区数相同,分区规则为 partitionId = Key.hashCode % numPartitions,此时,相同的key在同一个分区内,就是窄依赖。

如果join操作的两个RDD没有分区器或分区数量不同,那么这个join操作是宽依赖,会执行shuffle操作。

真题回顾

TIKTOK数据开发一面

7.join执行时有哪些类型?什么情况用hash、什么情况是sort join?

分为5类:broadcast join;shuffle hash join;sort merge join;Cartesian product join;Broadcast nested loop join.

broadcast join一般用在大表join小表的场景,会将小表广播到大表端,从maptask的节点进行关联。

shuffle hash join是用于数据量比较大的情况,仅支持等值 Join;spark.sql.join.preferSortMergeJoin 参数必须设置为 false。其实现思想是将两张表的数据key进行hash映射,相同的key会被分到相同的分区

这样就保证相同的key被分到相同的reduce task,最后在节点内进行join。

sort merge join 用于数据规模极大的情况,仅支持等值 Join,并且要求参与 Join的 Keys 可排序。实现思想是将两个表内的数据按join key排序,之后再对相应的分区内的记录进行连接。

Cartesian product join表示是笛卡尔积关联,实际是两张表数据的全射。

Broadcast nested loop join. 专门适用于非等值链接。例,tableA.id > tableB.id 。会从tableA中每取出一条数据,就遍历一遍tableB之后,直至tableA也遍历完成。

真题回顾

TIKTOK数据开发一面

8.sparkSQL怎么转化成spark任务?

具体流程如下描述:

一、SparkSQL通过parser(解析器), 把sqlText转化成UnResolved Logical Plan.(这是一棵parsed Logical Plan AST语法树).

二、SparkSQL通过Analyzer(分析器), 借助Catalog中的元数据(schema), 把UnResolved Logical Plan转化成Resolved Logical Plan.(这是一棵Analyzer Logical Plan AST语法树) .

三、SparkSQL通过Optimizer(优化器), 将执行计划转化为Optimized Logical Plan.

四、SparkSQL通过SparkPlan, 将执行计划转化为Phsical Plan.

真题回顾

TIKTOK数据开发一面

9.RBO和CBO的定义和区别?

Spark SQL 的优化器有两种优化方式:一种是基于规则的优化方式(Rule-Based Optimizer,简称为RBO);另一种是基于代价的优化方式(Cost-Based Optimizer,简称为CBO)。

RBO 是发展比较早且比较成熟的一项 SQL 优化技术,它按照制定好的一系列优化规则(谓词下推、常量替换、列裁剪、非空过滤等)对SQL语法表达式进行转换,最终生成一个最优的执行计划。

CBO 是对 RBO 的改进演化,它能根据优化规则的不同(优化 Join 类型、优化多表 Join 顺序等)生成多个执行计划,再根据统计信息 (Statistics) 和代价模型 (Cost Model) 计算得出代价最小的物理执行计划。

10.spark 中job、stage、task之间的关系?

spark中的数据都是抽象为RDD的,并且支持两种类型算子操作,transformation和action,当遇到action算子时,spark会提交一个job将之前的一系列算子真正执行。

每个spark Job在具体执行过程中因为shuffle的存在,需要将其划分为一个或多个可以并行计算的stage,划分的依据是RDD间的依赖关系,当遇到宽依赖时因需要进行shuffle操作,涉及到了不同分区之间进行数据合并,故以此为界划分不同的Stage。

Stage是由一组Task组成的并行计算,因此每个stage中可能存在多个Task,这些Task执行相同的程序逻辑,只是它们操作的数据不同。一般RDD的一个分区对应一个Task

真题回顾

字节生服数据开发一面

滴滴数据开发一面

11.小文件过多在spark web UI是什么样的一个表象?

小文件过多的表现之一是各task读取的数据量远小于一个HDFS block即128M或256M,它也会导致任务执行的效率较低,极端情况甚至会导致HDFS Namenode内存压力大(因为每个HDFS文件在NM内存中的元信息都是150字节左右,过多数量的小文件会给NM维护这么多文件信息带来压力),

另一方面的判断标准是“Stages”菜单中,某个stage的进度蓝条上task数太多达到好几万的级别,用Input或Shuffle Read量除以task数后,每个task处理的数据量远小于128或256M。

真题回顾

抖音数据开发一面

12.AQE是什么?它是什么实现原理? 

AQE(Adaptive Query Execution)是SparkSQL的一种动态优化机制,在运行时,每当ShuffleMap阶段执行完毕,AQE都会结合这个阶段的统计信息,基于既定的规则动态地调整、修正尚未执行的逻辑计划和物理计划,来完成对原始查询语句的运行时优化。

13.AQE有什么特性?

目前AQE主要有三大特性:

1、自动分区合并:在Shuffle过后,ReduceTask数据分布参差不齐,AQE将自动合并过小的数据分区。

2、Join策略调整:如果某张表在过滤之后,尺寸小于广播变量阈值,这张表参与的数据关联就会从 Shuffle Sort Merge Join 降级(Demote)为执行效率更高的 Broadcast Hash Join。

3、自动倾斜处理:结合配置项,AQE自动拆分Reduce阶段过大的数据分区,降低单个ReduceTask的工作负载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值