字节跳动大数据开发面经答案汇总之Spark篇下集
12.Spark 能产生shuffle的算子
- reduceByKey、sortByKey
- repartition、coalesce
- join、cogroup
13.Spark里的reduce by key和group by key两个算子在实现上的区别并且说一下性能
- groupByKey只能分组,不能聚合,而reduceByKey包含分组和聚合两个功能
- reduceByKey会在shuffle前对分区内相同key的数据进行预聚合(类似于MapReduce的combiner),减少落盘的数据量,而groupByKey只是shuffle,不会进行预聚合的操作,因此reduceByKey的会高一些
14.Spark内存管理
- spark分为堆内内存和堆外内存,堆内内存由JVM统一管理,而堆外内存直接向操作系统进行内存的申请,不受JVM控制
spark.executor.memory
和spark.memory.offHeap.size
- 堆内内存又分为存储内存和执行内存和其他内存和预留内存,存储内存主要存放缓存数据和广播变量,执行内存主要存放shuffle过程的数据,其他内存主要存放rdd的元数据信息,预留内存和其他内存作用相同。
15.看过Spark底层源码没有
- 看过,比如spark shuffle源码,...
16.Spark 数据倾斜
见之前的文章
17.用Spark遇到了哪些问题
- 聚合函数导致内存溢出
- 广播join导致内存溢出
- 数据倾斜
18.Spark join的有几种实现 *
- 包括 broadcast hash join,shuffle hash join,sort merge join,前两种都是基于hash join;broadcast 适合一张很小的表和一张大表进行join,shuffle适合一张较大的小表和一张大表进行join,sort适合两张较大的表进行join。
- 先说一下hash join吧,这个算法主要分为三步,首先确定哪张表是build table和哪张表是probe table,这个是由spark决定的,通常情况下,小表会作为build table,大表会作为probe table;然后构建hash table,遍历build table中的数据,对于每一条数据,根据join的字段进行hash,存放到hashtable中;最后遍历probe table中的数据,使用同样的hash函数,在hashtable中寻找join字段相同的数据,如果匹配成功就join到一起。这就是hash join的过程
- broadcast hash join分为broadcast阶段和hash join阶段,broadcast阶段就是 将小表广播到所有的executor上,hash join阶段就是在每个executor上执行hash join,小表构建为hash table,大表作为probe table
- shuffle hash join分为shuffle阶段和hash join阶段,shuffle阶段就是 对两张表分别按照join字段进行重分区,让相同key的数据进入同一个分区中;hash join阶段就是 对每个分区中的数据执行hash join
- sort merge join分为shuffle阶段,sort阶段和merge阶段,shuffle阶段就是 将两张表按照join字段进行重分区,让相同key的数据进入同一个分区中;sort阶段就是 对每个分区内的数据进行排序;merge阶段就是 对排好序的分区表进行join,分别遍历两张表,key相同就join输出,如果不同,左边小,就继续遍历左边的表,反之,遍历右边的表
19.背压机制应用场景 底层实现
- 背压机制就是根据JobScheduler 反馈作业的执行信息来动态调整receiver的数据接收率
20.spark RDD持久化
- 因为RDD实际上是不存储数据的,那么如果RDD要想重用,那么就需要重头开始再执行一遍,所以为了提高RDD的重用性,就有了RDD持久化
- 分类:缓存和检查点