Spark面试题

Spark

RDD的五大特性

1、分区列表,即RDD以多个partition构成,且每个分区对应一个task任务;

(分区数怎么决定?当RDD从集合创建,分区数由所分配到的资源的核数决定;当RDD从HDFS文件创建,分区数默认是文件的block块数)

2、算子是作用在每一个分区上的(分布式并行计算)

3、依赖关系,即RDD之间存在依赖关系,分为宽依赖和窄依赖

(有shuffle就是宽依赖,没有则是窄依赖。group by key, sort by key引发shuffle(跨节点跨进程的数据分发,Map端生产中间文件Data,index,Reduce端消费中间文件))

4、kv形式的RDD具有parttioner属性,决定RDD如何进行分区(hashpartitoner哈希分区和rangepartiitoner范围分区)。默认是hash分区,bykey类的算子也只能作用在kv形式的RDD上。

5、Spark为task的计算提供了最佳的计算位置,移动计算还不是移动数据。

Spark常用算子

map、flatmap、filter、groupby、groupby key、reduceby key、sortby key、foreach、foreachpartition

reduceByKey和groupByKey的区别

reduceByKey会在map端做预聚合,可以减少shu#e过程中传输的数据量,提⾼执⾏效率, groupByKey不能做预聚合

Spark部署方式

  1. Standalone:独立模式,Spark 原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中
  2. Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如 MR、Storm等。根据 Driver 在集群中的位置不同,分为 yarn client(集群外)和 yarn cluster(集群内部)
  3. Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 Yarn。
  4. K8S : 容器式部署环境。

Spark任务调度和资源调度流程

1.启动集群后,Worker节点会向Master节点汇报资源情况,Master掌握了集群资源情况。
2.当Spark提交一个Application后,根据RDD之间的依赖关系将Application形成一个DAG有向无环图。任务提交后,Spark会在Driver端创建两个对象:DAGScheduler和TaskScheduler。
3.DAGScheduler是任务调度的高层调度器。DAGScheduler的主要作用就是将DAG根据RDD之间的宽窄依赖关系划分为一个个的Stage,然后将这些Stage以TaskSet的形式提交给TaskScheduler(TaskScheduler是任务调度的低层调度器,这里TaskSet其实就是一个集合,里面封装的就是一个个的task任务,也就是stage中的并行task任务)
4.TaskSchedule会遍历TaskSet集合,拿到每个task后会将task发送到计算节点Executor中去执行。
5.task在Executor线程池中的运行情况会向TaskScheduler反馈,
6.当task执行失败时,则由TaskScheduler负责重试,将task重新发送给Executor去执行,默认重试3次。如果重试3次依然失败,那么这个task所在的stage就失败了。
7.stage失败了则由DAGScheduler来负责重试,重新发送TaskSet到TaskSchdeuler,Stage默认重试4次。如果重试4次以后依然失败,那么这个job就失败了。job失败了,Application就失败了。
8.TaskScheduler不仅能重试失败的task,还会重试执行速度比其他task慢太多的task。如果有运行缓慢的task那么TaskScheduler会启动一个新的task来与这个运行缓慢的task执行相同的处理逻辑。两个task哪个先执行完,就以哪个task的执行结果为准。这就是Spark的推测执行机制。

Spark shuffle

首先shuffle是连接map和Reduce的桥梁,作用是将map端的结果数据经过一系列操作后传递给Reduce端。在Spark中主要有两种shuffle方式,一种是基于hash的shuffle,一种是基于sort的shuffle。在Spark的初始版本中,使用的是hash shuffle,就是对相同的 key 执行 hash 算法,从而将相同 key 都写入同一个磁盘文件中,而每一个磁盘文件对应下游 stage 的一个 task。其最大的不足在于产生大量的中间磁盘文件,使内存和磁盘I/O产生巨大的开销,所以在后续的Spark版本中对其进行了优化,增加了文件合并机制,大大减少了磁盘文件,但是依然很多,对内存和磁盘I/O的负担依然很大。之后在Spark1.1版本就引入了基于sort的shuffle机制,这种shuffle机制先把上游的结果写入到内存,达到一定阙值后,就对其进行排序并溢泻到磁盘,最终合并为一个数据文件,因为所有的结果都在一个文件中,所以还需要有一个索引文件来指定下游各个task的数据的开始偏移量和结尾偏移量。这种方式实现了上游每个task只产生一个磁盘文件。在后续Spark版本中,以sort shuffle为默认的shuffle机制,并删除掉了hash shuffle。但是某些情况下,比如下游是starge任务数较少时,hash shuffle相较于sort shuffle更有优势,一方面速度会比较快,另一方面节省了排序的性能开销,所以对sort shuffle的优化就是加入了bypass运行机制,这个机制其实跟hash shuffle的过程非常类似。

Repartition和Coalesce区别

关系:两者都是⽤来改变RDD的partition数量的,repartition底层调⽤的就是coalesce⽅法: coalesce(numPartitions, shuffle = true)

区别:repartition⼀定会发⽣shuffle,coalesce根据传⼊的参数来判断是否发⽣shuffle,⼀般情 况下增⼤rdd的partition数量使⽤repartition,减少partition数量时使⽤coalesce

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值