几道Spark面试必问题-附答案解析

科技   2024-12-23 08:02   日本  


1、Spark的join有哪些?

a. Broadcast Hash Join

  • 当一个表相对较小(可以通过broadcast提示或配置自动触发),可以将其广播到每个节点的内存中。
  • 每个节点然后对其本地的大表数据进行遍历,并直接与内存中的小表匹配。

b. Shuffle Hash Join

  • 类似于Broadcast Hash Join,但不涉及广播。相反,两个表都会基于连接键被重新分区(即Shuffle)。
  • 然后在每个分区内部执行Hash Join。
  • 这种方式要求有足够的内存来存储较大的表的一个分区的数据。

c. Sort Merge Join

  • 当两个表都很大时使用,这两个表首先会被根据连接键排序。
  • 排序后,两边的数据流可以按照顺序进行合并,从而实现高效的连接操作。
  • 它需要先对输入数据按连接键排序,这通常通过Shuffle完成。

2、Spark(内存计算)的shuffle过程,和MR的区别

MapReduce Shuffle过程

  • Mapper输出的结果会写入缓存,随后经过分区、排序、合并等步骤,最终写入磁盘。
  • Reducer从各个Mapper所在的机器上拉取对应的Partition数据并进行归并处理。

Spark Shuffle过程

Spark的Shuffle机制有几种不同的实现方式,主要包括HashShuffle和SortShuffle。

1. HashShuffle

HashShuffle是早期的Shuffle实现,存在一些性能问题:

  • 普通运行机制:每个Map任务为每个Reducer创建一个独立的文件,导致m*n个文件(m为Map任务数,n为Reducer任务数),文件数量过多。
  • 合并机制:为了减少文件数量,可以通过配置参数让多个Map任务共享文件,但这仍然会产生大量的小文件,增加了GC压力和I/O开销。

2. SortShuffle

SortShuffle是当前默认的Shuffle实现,分为两种模式:

普通机制(默认)
  • 按Key分区:Map任务根据Key的哈希值将其分配到不同的分区。写入缓冲区:中间结果首先写入内存中的缓冲区。
  • 溢写(Spill):当内存不足时,数据会溢写到磁盘。每次溢写都会生成一个临时文件。
  • 归并(Merge):所有溢写文件会被归并成一个索引文件(index file)和一个数据文件(data file)。这一步骤可以进行预聚合(如reduceByKey等操作),以减少数据量。
  • 读取和归并:在Reduce阶段,Spark会从各个Map任务所在的节点拉取对应的分区数据,并进行归并处理。
Bypass运行机制
  • 条件:当shuffle read task的数量小于spark.shuffle.sort.bypassMergeThreshold(默认200)时,启用Bypass机制。
  • 不聚合类操作:适用于非聚合类的Shuffle算子(如groupByKey、join等),而不是reduceByKey这样的聚合类操作。
  • 直接写入磁盘:中间结果直接写入磁盘,而不需要先写入内存缓冲区,减少了内存压力。
  • 单个文件:每个Map任务只会生成一个文件,避免了大量小文件的问题。

3、小文件问题怎么处理

Hadoop: CombineFileInputFormat

Hive:

① 使用 hive 自带的 concatenate 命令,自动合并小文件

alter tabletest1 concatenate;

②如果数据源本身就是大量小文件;在Map输入的时候, 把小文件合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

③如果是动态分区插入数据,产生大量的小文件=maptask个数 * 分区数;

select * from table DISTRIBUTEBYrand();

④如果reduce个数越多, 小文件越多:设置reduce数量

set mapreduce.job.reduces=10;

Spark: 只考虑输出情况coalesce()方法和repartition()方法 或者用宽依赖shuffle

4、Hive on Spark和Spark on Hive有什么区别

Hive on Spark:语法是Hivesql, Hive既作为存储元数据、解析SQL和优化,,执行引擎变成了Spark,Spark负责采用RDD执行。

Spark on Hive :语法是sparkSQL,加载Hive的配置文件,获取Hive的元数据信息,sparkSQL来操作Hive表中的数据,执行引擎是Spark

--END--

扫下方二维码,限时领取优惠券,加入VIP社群,获得更多实用技术知识和工作经验,探索大数据的无限可能性!并且有很多大数据面试经验,面试技巧,简历修改等。

五分钟学大数据-VIP社群 是高质量圈子,无任何广告营销及杂乱无用内容!

一个人走得更快,一群人才能走得更远,加入VIP社群,学习持续进步。

想了解星球提供的具体服务?点击查看👉加入大数据VIP社群,限时开放!



非常欢迎大家加我个人微信有关大数据的问题我们在群内一起讨论

长按上方扫码二维码,加我微信,拉你进群

五分钟学大数据
大数据领域原创技术号,专注于大数据研究,包括 Hadoop、Flink、Spark、Kafka、Hive、HBase 等,深入大数据技术原理,数据仓库,数据治理,前沿大数据技术
 最新文章