〇、前言
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的数据持久化缓存机制,可以在分区故障之后通过上游血缘重新计算,从而达到快速恢复、用户无感的效果。
真题回顾
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)。
真题回顾
5.哪些操作是宽依赖的操作?
具有宽依赖的transformations 包括: sort, reduceByKey, groupByKey, join, 和调用rePartition函数的任何操作.
真题回顾
6.join操作都是宽依赖的操作吗?
如果join操作的两个RDD的分区器的分区数相同,分区规则为 partitionId = Key.hashCode % numPartitions,此时,相同的key在同一个分区内,就是窄依赖。
如果join操作的两个RDD没有分区器或分区数量不同,那么这个join操作是宽依赖,会执行shuffle操作。
真题回顾
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也遍历完成。
真题回顾
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.
真题回顾
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的工作负载。
标签:join,真题,--,分区,RDD,key,Spark,数据 From: https://blog.csdn.net/m0_73359763/article/details/141831181