字节跳动大数据开发面经答案汇总之Spark篇上集

1.Spark有哪几种部署模式

  • 本地模式:常用于本地开发程序与测试
  • 集群模式:
  • standalone模式:只使用spark自身节点的运行模式
  • yarn模式:yarn作为资源调度框架的运行模式
  • mesos模式:Mesos与Yarn同样是一款资源调度管理系统,可以为Spark提供服务

2.spark on yarn的工作流程

  • 首先spark的客户端将作业提交给yarn的RM,然后RM会分配container,并且选择合适的NM启动ApplicationMaster,然后AM启动Driver,紧接着向RM申请资源启动executor,Executor 进程启动后会向 Driver 反向注册,全部注册完成后 Driver 开始执行main 函数,当执行到行动算子,触发一个 Job,并根据宽依赖开始划分 stage(阶段的划分),每个 stage 生成对应的 TaskSet(任务的切分),之后将 task 分发到各个 Executor 上执行。

3.怎样提高并行度 相关参数

    各个stage的task的数量,也就代表了spark作业在各个stage的并行度

    spark.defalut.parallelism

4.client和cluster模式的区别

  • client模式下,driver运行在客户端;
  • cluster模式下,driver运行在yarn集群

5.Spark shuffle的过程

  • spark的shuffle分为两种实现,分别为HashShuffle(spark1.2以前)和SortShuffle(spark1.2以后)
  • HashShuffle分为普通机制和合并机制,分为write阶段和read阶段,write阶段就是根据key进行分区,开始先将数据写入对应的buffer中,当buffer满了之后就会溢写到磁盘上,这个时候会产生mapper的数量*reduer的数量的小文件,这样就会产生大量的磁盘IO,read阶段就是 reduce去拉取各个maptask产生的同一个分区的数据;HashShuffle的合并机制就是让多个mapper共享buffer,这时候落盘的数量等于reducer的数量*core的个数,从而可以减少落盘的小文件数量,但是当Reducer有很多的时候,依然会产生大量的磁盘小文件。
  • SortShuffle分为普通机制和bypass机制
  • 普通机制:map task计算的结果数据会先写入一个(默认5M)中,每写一条数据之后,就会判断一下,是否达到了阈值,如果达到阈值的话,会先尝试增加内存到当前内存的2倍,如果申请不到才会溢写,溢写的时候先按照key进行分区和排序,然后将数据溢写到磁盘,最后会将所有的临时磁盘文件合并为一个大的磁盘文件,同时生成一个索引文件,然后reduce task去map端拉取数据的时候,首先解析索引文件,根据索引文件再去拉取对应的数据。
  • bypass机制:将普通机制的排序过程去掉了,它的触发条件是而当shuffle map task数量小于200(配置参数)并且算子不是聚合类的shuffle算子(比如reduceByKey)的时候,该机制不会进行排序,极大的提高了其性能。

6.讲讲Spark为什么比Hadoop快

  • MapReduce需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了;而Spark不需要将计算的中间结果写入磁盘,这得益于Spark的RDD弹性分布式数据集和DAG有向无环图,中间结果能够以RDD的形式存放在内存中,这样大大减少了磁盘IO。(假设有多个转换操作,那么spark是不需要将第一个job的结果写入磁盘,然后再读入磁盘进行第二个job的,它是直接将结果缓存在内存中)
  • MapReduce在shuffle时需要花费大量时间排序,而spark在shuffle时如果选择基于hash的计算引擎,是不需要排序的,这样就会节省大量时间。
  • MapReduce是多进程模型,每个task会运行在一个独立的JVM进程中,每次启动都需要重新申请资源,消耗了大量的时间;而Spark是多线程模型,每个executor会单独运行在一个JVM进程中,每个task则是运行在executor中的一个线程。

7.RDD是什么,有什么特点

  • 它翻译过来就叫做,是一种数据结构,可以理解成是一个集合。在代码中的话,RDD是一个抽象类。还有一个非常重要的特点:RDD是不保存数据的,仅仅封装了计算逻辑,也就是你直接打印RDD是看不见具体值的。

8.RDD的血缘

  • 多个连续的RDD的依赖关系,称之为血缘关系;每个RDD会保存血缘关系

9.宽窄依赖

  • 宽依赖:父的RDD的一个分区的数据会被子RDD的多个分区依赖,涉及到Shuffle
  • 窄依赖:父的RDD的一个分区的数据只会被子RDD的一个分区依赖

10.stage划分

  • 对于窄依赖,不会进行划分,也就是将这些转换操作尽量放在在同一个 stage中,可以实现流水线并行计算。 对于宽依赖,由于有 shuffle 的存在,只能在父 RDD 处理完成后,才能开始接下来的计算,也就是说需要要划分 stage(从后往前,遇到宽依赖就切割stage

11.Transform和Action算子分别列举一些常用的,他们的区别是什么

  • 转换算子主要是将旧的RDD包装成新的RDD,行动算子就是触发任务的调度和作业的执行。
  • 转换算子:map flatMap filter reducebykey union
  • 行动算子:collect foreach take
#如果可以选,你最想从事什么工作##数据人的面试交流地##我的求职思考##大数据开发面经##23届找工作求助阵地#
全部评论

相关推荐

5 25 评论
分享
牛客网
牛客企业服务