目录
四. 简述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算子,并简述功能
- 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的区别,哪一种更具优势?
- reduceByKey
按照key进行聚合,在shuffle之前有预聚合(combine)操作,返回结果为RDD[k,v]。
2. groupByKey
按照key进行分组后直接shuffle(无预聚合)。
预聚合可以提高执行性能,在不影响业务逻辑的情况下,建议优先使用reduceByKey。