Spark常见面试问题介绍

1.Spark的Shuffle原理及调优?

答:参考:spark的shuffle和Hadoop的shuffle(mapreduce)的区别和关系是什么?

(1)shuffle原理

当使用reduceByKey、groupByKey、sortByKey、countByKey、join、cogroup等操作的时候,会发生shuffle操作。

Spark在DAG调度阶段将job划分成多个stage,上游stage做map操作,下游stage做reduce操作,其本质还是MR计算架构。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce的输入,这期间涉及到序列化和反序列化、跨节点网络IO和磁盘读写IO等,所以说shuffle是整个应用过程特别昂贵的阶段。

与MapReduce计算框架一样,spark的shuffle实现大致如下图所示,在DAG阶段以shuffle为界,划分stage,上游stage做map task,每个map task将计算结果数据分成多份,每一份对应到下游stage的每个partition中,并将其临时写到磁盘,该过程就叫做shuffle write;下游stage叫做reduce task,每个reduce task通过网络拉取指定分区结果数据,该过程叫做shuffle read,最后完成reduce的业务逻辑。举例:上游stage有100个map task,下游有1000个reduce task,那么这100个map task中每个map task都会得到1000份数据,而这1000个reduce task中的每个reduce task都会拉取上游100个map task对应的那份数据,即第一个reduce task会拉取所有map task结果数据的第一份,以此类推。

在map阶段,除了map的业务逻辑外,还有shuffle write的过程,这个过程涉及序列化、磁盘IO等耗时操作;在reduce阶段,除了reduce的业务逻辑外,还有shuffle read过程,这个过程涉及到网络IO、反序列化等耗时操作。所以整个shuffle过程是极其昂贵的。

因为shuffle是一个涉及CPU(序列化反序列化)、网络IO(跨节点数据传输)以及磁盘IO(shuffle中间结果落地)的操作,所以应当考虑shuffle相关的调优,提升spark应用程序的性能。

(2)shuffle调优

(2-1)程序调优;

首先,尽量减少shuffle次数;

//两次shuffle

rdd.map().repartition(1000).reduceByKey(+,3000)

//一次shuffle

Rdd.map().repartition(3000).reduceByKey(+)

然后必要时主动shuffle,通常用于改变并行度,提高后续分布式运行速度;

rdd.repartition(largerNumPartition).map()

最后,使用treeReduce&treeAggregate替换reduce&aggregate。数据量较大时,reduce&aggregate一次性聚合,shuffle量太大,而treeReduce&treeAggregate是分批聚合,更为保险。

(2-2)参数调优;

spark.shuffle.file.buffer:map task到buffer到磁盘

默认值:32K

参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会溢写到磁盘;

调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如64k),从而减少shuffle write过程中溢写磁盘文件的次数,也就可以减少磁盘IO次数,进而提升性能。在实践中发现,合理调节该参数,性能会有1到5%的提升。

spark.reducer.maxSizeFlight:reduce task去磁盘拉取数据

默认值:48m

参数说明:该参数用于设置shuffle read task的buffer缓冲大小,而这个buffer缓冲决定了每次能够拉取多少数据。

调优建议:如果作业可用的内存资源较为充足的话,可以增加这个参数的大小(比如96M),从而减少拉取数据的次数,也就可以减少网络传输的次数,进而提升性能。在实践中发现,合理调节该参数,性能会有1到5%的提升。

Spark.shuffle.io.maxRetries

默认值:3

参数说明:shuffle read task从shuffle write task所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,时会自动进行重试的。该参数就代表了可以重试的最大次数,如果在指定次数内拉取属于还是没有成功,就可能会导致作业执行失败。

调优建议:对于那些包含了特别耗时的shuffle操作的作业,建议增加重试最大次数(比如6次),可以避免由于JVM的full gc或者网络不稳定等因素导致的数据拉取失败。在实践中发现,对于超大数据量(数十亿到上百亿)的shuffle过程,调节该参数可以大幅度提升稳定性。

Spark.shuffle.io.retryWait

默认值:5s

参数说明:shuffle read task从shuffle write task所在节点拉取属于自己的数据时,如果拉取失败了每次重试拉取数据的等待时间间隔,默认是5s;

调优建议:建议加大时间间隔时长,比如60s,以增加shuffle操作的稳定性。

spark.shuffle.memoryFraction

默认值:0.2

参数说明:该参数代表了executor内存中,分配给shuffle read task进行聚合操作的内存比例,默认是20%;

调优建议:如果内存充足,而且很少使用持久化操作,建议调高和这个比例,给shuffle read的聚合操作更多内存,以避免由于内存不足导致聚合过程中频繁读写磁盘。在实践中发现,合理调节该参数可以将性能提升10%。

Spark.shuffle.manager

默认值:sort

参数说明:该参数用于设置shuffleManager的类型。Spark1.5以后有三个可选项:hash、sort和tungsten-sort。Tungsten-sort与sort类似,但是使用了tungsten计划中的堆外内存管理机制,内存使用效率提高。

调优建议:由于sort shuffleManager默认会对数据进行排序,因此如果你的业务逻辑中需要该排序机制的话,则使用默认的sort ShuffleManager就可以;但是如果你的业务逻辑不需要对数据进行排序,那么建议参考后面的几个参数调优,通过bypass机制或优化的hash ShuffleManager来避免排序操作,同时提供较好的磁盘读写性能。这里要注意的是,tungsten-sort要慎用,因为之前发现了一些相应的bug。

Spark.shuffle.sort.bypassMergeThreshold

默认值:200

参数说明:当shuffleManager为sortshuffleManager时,如果shuffle read task的数量小于这个阈值,则shuffle write过程中不会进行排序操作,而是直接按照未经优化的hashShuffleManager的方式去写数据,但是最后会将每个task产生的所有临时磁盘文件都合并成一个文件,并会创建单独的索引文件。

调优建议:当你使用sortShuffleManager时,如果的确不需要排序操作,那么建议将这个参数调大一些,大于shuffle read task的数量,那么此时就会自动启用bupass机制,map-side就不会进行排序,减少了排序的性能开销。但是这种方式下,依然会产生大量的磁盘文件,因此shuffle write性能有待提高。

Spark.shuffle.consolidateFiles

默认值:false

参数说明:如果使用hashShuffleManager,该参数有效。如果设置为true,那么就会开启consilidate机制,会大幅度合并shuflle write的输出文件,对于shuffle read task数量特别多的情况下,这种方法可以极大地减少磁盘IO开销,提升性能。

调优建议:如果的确不需要sortHashShuffle的排序机制,那么除了使用bypass机制,还可以尝试将spark.shuffle.manager参数手动调节为hash,使用hashShuffleManager,同时开启consolidate机制。在实践中尝试过,发现其性能比开启了bypass机制的sortshuffleManager要高出10%到30%。

2.hadoop和spark使用场景?

答:Hadoop/MapReduce和Spark最适合的都是做离线型的数据分析,但Hadoop特别适合是单次分析的数据量“很大”的情景,而Spark则适用于数据量不是很大的情景。

(1)一般情况下,对于中小互联网和企业级的大数据应用而言,单次分析的数量都不会“很大”,因此可以优先考虑使用Spark。

(2)业务通常认为Spark更适用于机器学习之类的“迭代式”应用,80GB的压缩数据(解压后超过200GB),10个节点的集群规模,跑类似“sum+group-by”的应用,MapReduce花了5分钟,而spark只需要2分钟。

3.spark工作机制?

答:用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。

执行add算子,形成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler。 task scheduler会将stage划分为task set分发到各个节点的executor中执行。

4.Spark的特点是什么?

(1)速度快:Spark基于内存进行计算(当然也有部分计算基于磁盘,比如shuffle)。

(2)容易上手开发:Spark的基于RDD的计算模型,比Hadoop的基于Map-Reduce的计算模型要更加易于理解,更加易于上手开发,实现各种复杂功能,比如二次排序、topn等复杂操作时,更加便捷。

(3)超强的通用性:Spark提供了Spark RDD、Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技术组件,可以一站式地完成大数据领域的离线批处理、交互式查询、流式计算、机器学习、图计算等常见的任务。

(4)集成Hadoop:Spark并不是要成为一个大数据领域的“独裁者”,一个人霸占大数据领域所有的“地盘”,而是与Hadoop进行了高度的集成,两者可以完美的配合使用。Hadoop的HDFS、Hive、HBase负责存储,YARN负责资源调度;Spark复杂大数据计算。实际上,Hadoop+Spark的组合,是一种“double win”的组合。

(5)极高的活跃度:Spark目前是Apache基金会的顶级项目,全世界有大量的优秀工程师是Spark的committer。并且世界上很多顶级的IT公司都在大规模地使用Spark。

以上就简单为大家分享几个有关Spark常见的面试问题,若想了解更多有关大数据岗位面试问题,欢迎私聊。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值