1.RDD,DataFrame,DataSet的区别?
RDD:分布式数据集
DataFrame:一个不可变的分布式数据集,是一种数据结构,为数据提供了Schema视图,可以把他当做是数据库的一张表,底层是RDD
DataSet:DataSet是DataFrame的扩展,具有RDD的有点以及SparkSql优化执行引擎的优点
2.Spark的控制算子有哪些,分别有什么作用?
控制算子:cache persist checkpoint
cache:将RDD持久化到内存中,后续可以直接访问内存中的RDD,避免了重复计算
persist:将RDD持久化到内存或者磁盘中,持久化方式可以通过参数指定
checkpoint:将RDD持久化到外部存储系统中,这样即使Spark集群发生故障,也可以从外部存储系统中恢复RDD
3.Yarn的Client提交和Cluster提交?
Client提交:
1.应用程序的代码和依赖都存储在客户端中
2.适用于小规模数据,简单易用,调试方便
3.客户端将应用程序提交到RescourseManager,RescourseManager根据客户端提交的信息启动ApplicationMaster
Cluster提交:
1.应用程序的代码和依赖都存储在分布式文件系统中
2.适用于大规模数据,数据都存储在分布式文件系统上的共享资源中,减少了与RescourseManager的通信
3.客户端将应用程序提交到RescourseManager,只需要指定应用程序的存储位置和其他配置信息,然后启动ApplicationMaster
4.Spark 单表 SQL 分组聚合查询数据倾斜如何解决
为了减少 Shuffle 数据量以及 Reduce 端的压力,通常 Spark SQL 会在 Map 端做一个预聚合,就是在 Shuffle 前将同一分区内相同 Key 的记录先进行一个预计算,再将结果进行 Shuffle,发送到 Reduce 端做汇总,类似 MR MapTask 的提前 Combiner,所以执行计划中 HashAggregate 通常成对出现。适用场景:聚合类的 Shuffle 操作,部分 Key 数据量较大,且大 Key 的数据分布在很多不同的切片。
解决逻辑:
两阶段聚合(加盐局部聚合 + 去盐全局聚合)+ Map-Side 聚合(将 groupByKey 算子转换为 reduceByKey算子,reduceByKey 可以在 Map 端预聚合,类似于 MapReduce 中的 Combiner)。首先,通过 map 算子给每个数据的 Key 添加随机数前缀,对 Key 进行打散,将原先一样的 Key 变成不一样的 Key,然后进行第一次聚合,这样就可以让原本被一个 Task 处理的数据分散到多个 Task 上去做局部聚合;随后,去除掉每个 Key的前缀,再次进行聚合。
此方法对于由 groupByKey、reduceByKey 这类算子造成的数据倾斜有比较好的效果,仅仅适用于聚合类的 Shuffle 操作,适用范围相对较窄。如果是 JOIN 类的 Shuffle 操作,还得用其他的解决方案。
5.查看 SQL 执行计划的关键字是什么,有什么用?
xplain 可以看到SQL的物理执行计划和逻辑执行计划,以及计划进行了什么优化,划分了哪些Stage等等。
- 并行度调优:根据执行计划中的Stage信息,合理配置每个Stage的并行任务数,以达到资源利用率最大化。
- 减少Shuffle:根据执行计划中Shuffle产生的数据量,考虑通过Join Reorder、Repartition等方式来减少Shuffle数据。
- 数据倾斜优化:从执行计划的数据大小统计发现数据倾斜情况,使用Salting、Histogram等技术进行优化。
- 广播大表:发现执行计划中有大表Join小表的情况,考虑使用Broadcast Join来避免全表Shuffle。
- 合理使用内存:根据执行计划中的数据量统计结果,调整存储内存和执行内存的比例。