大数据面试题——Spark篇

本文详细梳理了Spark的面试重点,涵盖了Spark与Hadoop shuffle的异同、Spark工作机制、cache与persist的区别、数据本地性、Spark Master的HA、join操作优化、运行模式、资源管理、数据分区、task类型、写数据流程、RDD结构、与MapReduce的区别、性能优化策略、shuffle原理、Kafka数据源处理等多方面内容,旨在帮助读者深入理解Spark的核心概念和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简要讲述hadoop和spark的shuffle相同和差异?

1)从高层次的的角度来看,两者并没有大的差别。
它都是将 mapper(Spark 里是 ShuffleMapTask)的输出进行 partition,不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一个 stage 里的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以内存作缓冲区,边 shuffle 边 aggregate 数据,等到数据 aggregate 好以后进行 reduce() (Spark 里可能是后续的一系列操作)。
2)从低层次的角度来看
Hadoop MapReduce 是 sort-based,进入 combine() 和 reduce() 的 records 必须先 sort。这样的好处在于 combine/reduce() 可以处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,reducer 的 shuffle 对排好序的每段数据做归并)。
目前的 Spark 默认选择的是 sorted-based shuffle(以前是hash based shuffle)。
3)从实现角度来看,两者也有不少差别。
Hadoop MapReduce 将处理流程划分出明显的几个阶段:map(), spill, merge, shuffle, sort, reduce() 等。每个阶段各司其职,可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中,没有这样功能明确的阶段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。

如果我们将 map 端划分数据、持久化数据的过程称为 shuffle write,而将 reducer 读入数据、aggregate 数据的过程称为 shuffle read。那么在 Spark 中,问题就变为怎么在 job 的逻辑或者物理执行图中加入 shuffle write 和 shuffle read 的处理逻辑?以及两个处理逻辑应该怎么高效实现?
Shuffle write由于不要求数据有序,shuffle write 的任务很简单:将数据 partition 好,并持久化。之所以要持久化,一方面是要减少内存存储空间压力,另一方面也是为了 fault-tolerance。

2. Spark的工作机制?

这个知识点 南国在之前的博客中有详细讲述过,这里简要提一下。
用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。
执行rdd算子,形成dag图 传给dagscheduler,按照rdd之间的依赖关系划分stage 传给task scheduler。 task scheduler会将stage划分为task set分发到各个节点的executor中执行。

3. cache和pesist的区别

1)cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间;
2) cache只有一个默认的缓存级别MEMORY_ONLY ,cache调用了persist,而persist可以根据情况设置其它的缓存级别;
3)executor执行的时候,默认60%做cache,40%做task操作,persist最根本的函数,最底层的函数。

5. 数据本地性

在Spark中,数据本地性是指具体的task运行在哪台机器上,DAG划分stage的时候确定的。

Spark中的数据本地性有三种:

  • PROCESS_LOCAL是指读取缓存在本地节点的数据;
  • NODE_LOCAL是指读取本地节点的硬盘数据;
  • ANY是指读取非本地节点数据;

一般而言,读取数据PROCESS_LOCAL>NODE_LOCAL>ANY,尽量让数据以PROCESS_LOCAL或者NODE_LOCAL方式读取。其中PROCESS_LOCAL还和cache有关,如果RDD经常用的话将该RDD cache缓存到内存中。注意cache/persist是惰性的,所以必须经过action触发,才会真正执行缓存到内存中。

6. Spark master使用zookeeper进行HA的,有哪些元素保存在Zookeeper ?

答:Spark通过这个参数spark.deploy.zookeeper.dir指定master元数据在zookeeper中保存的位置,包括Worker,Driver和Application以及Executors。standby节点要从zk中,获得元数据信息,恢复集群运行状态,才能对外继续提供服务,作业提交资源申请等,在恢复前是不能接受请求的。另外,Master切换需要注意2点
1)在Master切换的过程中,所有的已经在运行的程序皆正常运行!因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的!
2) 在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求;

注意:Spark Master HA主从切换的过程不会影响集群中已有作业的运行,因为在程序运行之前,已经申请过资源了,driver和Executor通讯,不需要和master进行通讯的

7. 介绍一下join操作优化经验

join其实常见的就分为两类: map-side join 和 reduce-side join。
当大表和小表join时,用map-side join能显著提高效率。将多份数据进行关联是数据处理过程中非常普遍的用法,不过在分布式计算系统中,这个问题往往会变的非常麻烦,因为框架提供的 join 操作一般会将所有数据根据 key 发送到所有的 reduce 分区中去,也就是 shuffle 的过程。造成大量的网络以及磁盘IO消耗,运行效率极其低下,这个过程一般被称为 reduce-side-join。如果其中有张表较小的话,我们则可以自己实现在 map 端实现数据关联,跳过大量数据进行 shuffle 的过程,运行时间得到大量缩短,根据不同数据可能会有几倍到数十倍的性能提升。
备注:这个题目面试中非常非常大概率见到,务必搜索相关资料掌握,这里抛砖引玉。

8. 不启动Spark集群Master和worker服务,可不可以运行Spark程序?

可以,只要资源管理器第三方管理就可以,如由yarn管理,spark集群不启动也可以使用spark;
Spark集群启动的是work和master,这个其实就是资源管理框架,yarn中的resourceManager相当于master,NodeManager相当于worker,做计算是Executor,和spark集群的work和manager可以没关系,归根接底还是JVM的运行,只要所在的JVM上安装了spark就可以。

9. Spark on Yarn模式有几种类型以及Yarn集群的优点

Yarn集群有两种模式:

  • Yarn-Client模式:driver运行在本地客户端,负责调度Application,会与Yarn集群长生大量的网络通信,从而导致网卡流量激增。它的好处是执行时可在本地看到所有log,便于调试。因而它一般用于测试环境。
  • Yarn-Cluster模式:driver语行在NodeManager,每次运行都是随机分配到NodeManager机器上去,不会有网卡流量激增的问题。但他的缺点是:本地提交时看不到log,只能通过Yarn Application-log application id命令来查看。

关于这两者的区别,更多详情可参考:https://www.cnblogs.com/1130136248wlxk/articles/6289717.html

Yarn集群的优点:
1)与其他计算框架共享集群资源(eg.Spark框架与MapReduce框架同时运行,如果不用Yarn进行资源分配,MapReduce分到的内存资源会很少,效率低下);资源按需分配,进而提高集群资源利用等。
2)相较于Spark自带的Standalone模式,Yarn的资源分配更加细致
3)Application部署简化,例如Spark,Storm等多种框架的应用由客户端提交后,由Yarn负责资源的管理和调度,利用Container作为资源隔离的单位,以它为单位去使用内存,cpu等。
4)Yarn通过队列的方式,管理同时运行在Yarn集群中的多个服务,可根据不同类型的应用程序负载情况,调整对应的资源使用量,实现资源弹性管理。

10. 谈谈你对Yarn中container的理解

1)Container作为资源分配和调度的基本单位,其中封装了的资源如内存,CPU,磁盘,网络带宽等。 目前yarn仅仅封装内存和CPU
2)Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster
3)Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令。

运行在yarn中Application有以下两种类型:
1)运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;
2)运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。

11. Spark中的分区

Spark默认有两种分区:hashPartitioner和rangePartitioner
(1) hashPartitioner分区:
对于指定的key,计算其hashCode,并除以分区的个数取余;
它的不足:原始数据不均匀时容易产生数据倾斜

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值