呕心沥血整理的13道Spark必问面试题

本文详细解答了13个Spark面试关键问题,涵盖Spark部署方式、RDD血缘关系、宽窄依赖、transformation算子、缓存与checkpoint机制、共享变量、数据库连接优化、join操作、wordcount及topN实现等,是Spark开发者面试必备知识点。
摘要由CSDN通过智能技术生成

目录

一. Spark有几种部署方式?请分别简要论述

二. Spark提交作业参数

三. 如何理解Spark中RDD的血缘关系?

四. 简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?

五. 请列举Spark的transformation算子,并简述功能

七. 请描述Repartition和Coalesce联系与区别

八. 分别简述Spark中的缓存机制与checkpoint机制,并指出两者的区别与联系。

九. 简述Spark中共享变量(广播变量和累加器)的基本原理与用途。

十. 当Spark涉及到外部数据库的操作时,如何减少Spark运行中的数据库连接数?

十一. SparkSQL中join操作与left join操作的区别?

十二. 请手写出wordcount的Spark代码实现(Scala)

十三. 如何使用Spark实现topN的获取(描述思路或使用伪代码)

往期精选

转载是一种动力 分享是一种美德, 欢迎关注 大数据与数据仓库公众号


一. Spark有几种部署方式?请分别简要论述

spark主要有如下四种部署方式,分别如下:

1. Local

Spark运行在一台机器上,通常用于代码测试或者学习。

2. Standalone

构建一个基于Master与Slaves的资源调度集群,Spark任务提交给Master运行。

3. Yarn

Spark客户端直连Yarn,不需要额外构建Spark集群。包含yarn-client和yarn-cluster两种模式,主要区别在于Driver程序的运行节点。

4. Mesos

国内公司用的比较少。

二. Spark提交作业参数

在提交任务时的几个重要参数如下:

参数 注释
executor-cores 每个executor使用的内核数(默认为1) 官方建议2-5个
num-executors 启动executors的数量(默认为2)
executor-memory executor内存大小(默认1G)
driver-cores driver使用内核数(默认为1)
driver-memory driver内存大小(默认512M)

如下所示为个提交任务的样例

spark-submit \
  --master local[8]  \
  --driver-cores 2   \
  --driver-memory 16g \
  --executor-cores 4 \
  --num-executors 10 \
  --executor-memory 8g \
  --class PackageName.ClassName XXXX.jar \
  --name "Spark Job Name" \
  InputPath      \
  OutputPath

三. 如何理解Spark中RDD的血缘关系?

RDD在血缘依赖方面分为两种,分别是窄依赖(Narrow Dependencies)与宽依赖(Wide Dependencies),它在数据容错以及划分任务时候起到重要作用。

四. 简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?

Stage划分: 根据RDD之间的依赖关系的不同将Job划分成不同的Stage,当遇到宽依赖时划分新的Stage。

Task个数:每个Stage是一个TaskSet,Stage根据分区数被划分成多个Task。

五. 请列举Spark的transformation算子,并简述功能

  1. map(func)

返回一个新的RDD,上游RDD中的每一个输入元素经过func函数转换后返回新的RDD.

2. mapPartitions(func)

与map类似,但其在RDD的每一个分区上独立运行。对于有m个元素,n个分区的RDD,mapPartitions被调用n次(调用次数与分区个数一致)。

3. reduceByKey(func,[numTask])

在一个(K,V) 的RDD上调用,返回一个(K,V)的RDD,reduce函数可以将具有相同key值的元素聚合到一起,reduce任务的并行度可以通过第二个可选的参数来配置。

4. aggregateByKey (zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U

在kv对的RDD中,按key将value进行分组合并,合并时将每个value和初始值作为seq函数的参数进行计算,返回的结果作为一个新的kv对,然后再将结果按照key进行合并,最后将每个分组的value传递给combine函数进行计算(先将前两个value进行计算,将返回结果和下一个value传给combine函数,以此类推),将key与计算结果作为一个新的kv对输出。

六. Spark常用算子reduceByKey与groupByKey的区别,哪一种更具优势?

  1. reduceByKey

按照key进行聚合,在shuffle之前有预聚合(combine)操作,返回结果为RDD[k,v]。

2. groupByKey

按照key进行分组后直接shuffle(无预聚合)。

预聚合可以提高执行性能,在不影响业务逻辑的情况下,建议优先使用reduceByKey。

七. 请描述Rep

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值