题目来源 最全腾讯等BAT大数据面试99题 以下答案仅供参考,如有错误请指正

1. Spark的Shuffle原理及调优?

  • 原理
    SparkShuffle过程与MapReduce类似;DAG阶段,以Shuffle为界分为map stage和reduce stage,map阶段进行任务计算后下发到各自partition中,同时写入磁盘,该过程为shuffle write;reduce阶段读取map计算后各分区的值进一步计算,该过程为shuffle read;
  • 调优:
    1. 尽量减少shuffle次数
    2. 必要时主动shuffle,通常用于改变并行度,提高后续分布式运行速度
    3. 合并Map端输出文件
      开启相关设置:conf.set(“spark.shuffle.consolidateFiles”,” true”)
    4. 调节map端内存缓冲区大小和reduce端内存缓冲区内存占比
      • spark.shuffle.file.buffer,默认32k

      在map task处理的数据量比较大的情况下,而你的task的内存缓冲默认是比较小的,32kb。可能会造成多次的map端往磁盘文件的spill溢写操作,发生大量的磁盘IO,从而降低性能。
      调优原则:
      spark.shuffle.file.buffer,每次扩大一倍,然后看看效果,64,128;

      • spark.shuffle.memoryFraction,0.2

      reduce端聚合内存,占比。默认是0.2。如果数据量比较大,reduce task拉取过来的数据很多,那么就会频繁发生reduce端聚合内存不够用,频繁发生spill操作,溢写到磁盘上去。而且最要命的是,磁盘上溢写的数据量越大,后面在进行聚合操作的时候,很可能会多次读取磁盘中的数据,进行聚合。
      调优原则:
      spark.shuffle.memoryFraction,每次提高0.1,看看效果。

    5. SortShuffle代替HashShuffle,避免创建多分磁盘文件(Spark2.0之后的版本官方仅保留了SortShuffle)

参考连接:Spark Shuffle原理及相关调优


2. hadoop和spark使用场景?

  • Hadoop
    离线大数据量批量计算,实时要求性低场景,大数据量存储,日志处理,个性化广告推荐
  • Spark
    内存分布式计算框架,伪实时计算,微批计算达到实时,产品实时推荐

3. spark如何保证宕机迅速恢复?

  • 适当增加Spark的StandBy Master;
  • 编写脚本定期给Master发心跳,若宕机则进行重启;

4. hadoop和spark的相同点和不同点?

  • Hadoop
    Hadoop的MR为多进程模型,系统稳定性优于Spark,但MR只有Map和Reduce两个阶段,导致表达能力欠缺,操作仅能在这两个阶段完成;同时读写HDFS时会产生大量磁盘IO操作;Hadoop适合于大数据量批量的或者高延迟的离线数据计算;

  • Spark
    Spark为基于内存的多线程模型,系统稳定性略差,但是计算速度优于Hadoop,同时因为Spark基于内存进行计算,在不对系统进行调优的情况下很容易出现OOM等系统问题,导致任务结束无法继续;提供丰富的算子转换操作;使数据处理不单单拘泥于Map和Reduce,计算模型更加灵活;Spark适合低延迟内存密集型的数据计算;


5. RDD持久化原理?

通过调用cache()和persist()方法将计算后的数据持久化到内存中;
其中cache()的默认实现即为persist(MEMORY_ONLY);
persist()有可选项:

  • MEMORY_ONLY:仅存于内存,无法存储的partition会被重新计算;
  • MEMORY_AND_DISK:存于内存和磁盘,无法存储的partition会被写入磁盘,需要时从磁盘读取
  • MEMORY_ONLY_SER:仅存于内存,但会序列化;序列化减少内存开销,但取用时反序列化会导致CPU占用过高
  • MEMORY_AND_DISK_SER:同 MEMORY_AND_DISK,但会被序列化
  • DISK_ONLY:仅存于磁盘;
  • MEMORY_ONLY_2/MEMERY_AND_DISK_2:尾部加2表示会进行备份,防止数据丢失

6. checkpoint检查点机制?

SparkStreaming中的容错保证机制,保证程序出错时,仍可以从检查点恢复,保证数据高可用,同时可以减少回溯时间尽快重新开始计算


7. checkpoint和持久化机制的区别?

持久化是将数据保存在磁盘中,RDD的lineage仍旧保持不变,但持久化更容易丢数据,节点故障会导致数据从磁盘和内存中消失;检查点机制会将数据保存到高可用的文件系统中,与此同时lineage发生改变,检查点之前的lineage消失,只有当前点的状态;


8. Spark Streaming和Storm有何区别?

  • SparkStreaming 秒级实时计算;RDD 本质是小批量的计算达到实时;但也因此吞吐量高于Storm
  • Storm 毫秒级实时计算;数据收到即处理;可以实时调整并行度;
    所以:对实时性要求高或者数据量存在不稳定的情况下可选Storm,峰值动态调整并行度;对实时性要求一般可选SparkStreaming

9. RDD机制?

RDD弹性分布式数据集,一种数据结构,所有算子基于RDD执行;RDD具有很好的容错性,当节点错误partition数据丢失,可通过lineage的关系回溯重新计算partition的值;RDD的弹性体现在于RDD上自动进行内存和磁盘之间权衡和切换的机制。


10. Spark streaming以及基本工作原理?

SparkStreaming是一个秒级实时的,高吞吐量,利用多种算子和转换完成数据处理的流失批处理框架;
streaming接收数据后,将数据划分为一个个的batch交给spark引擎处理,处理后汇总成一个数据流,其中数据依然是一个个batch组成的;


11. DStream以及基本工作原理?

Dstream是一个抽象概念,代表一个持续不断的数据源,可由Kafka,flume等主动生成,也可由map,reduce等算子被动生成;
Dstream内部不断产生RDD,RDD为一个batch,每个RDD中包含一个时间段的数据;


12. spark有哪些组件?

Master管理集群;
worker计算节点;
Driver运行main函数;
Spark Context管理Spark生命周期,Client用户提交程序


13. spark工作机制?

用户Client端提交程序,Driver运行程序main方法,生成Spark Context上下文;生成dag图,根据rdd间依赖关系划分task,将task提交到executor中执行;


14. Spark工作的一个流程?

spark工作流程图

  • 构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
  • 资源管理器分配Executor资源并启动Executor,Executor运行情况将随着心跳发送到资源管理器上;
  • SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
  • Task在Executor上运行,运行完毕释放所有资源。

参考链接 Spark 工作流程图


15. spark核心编程原理?

  • 定义初始RDD来源,可以为本地文件,HDFS或者输入流;
  • 对RDD进行计算,通过算子转换等操作
  • 循环往复程,第一个计算完了以后,数据可能就会到了新的一批节点上,也就是变成一个新的RDD。然后再次反复,针对新的RDD定义计算操作
  • 获得最终数据保存数据

参考链接 Spark核心编程原理


16. spark基本工作原理?

首先在本地客户端(client)编写spark程序,然后将程序打成jar包,在某台能够连接到spark集群的机器上提交spark程序,spark程序会被提交到spark集群上运行。


17. spark性能优化有哪些?

分配更多资源;
调整并行度;
重构RDD架构以及RDD持久化;
广播大变量;
使用Kryo序列化;
使用fastutil优化数据格式;
调节数据本地化等待时长;

参考链接 Spark性能调优 密码:ibean.top,如果分享关闭请留言


18. updateStateByKey详解?

  • 大数量updateBykey不适合,可以采用redis
  • key超时,如何清空,来节约内存
    由于已存在状态的key,无论是否在新批次里有数据,都会调用updateFunc。
    返回None就可以清空超时key
  • 初始状态
    对于状态的算子一定要开启checkpoint,实际就是指定checkpoint目录
    checkpoint频率:5-10个滑动窗口

参考链接
sparkstreaming状态管理upstatebykey
sparkstreaming状态管理外部存储篇


19. 宽依赖和窄依赖?

  • 窄依赖就是指父RDD的每个分区只被一个子RDD分区使用
    窄依赖
  • 宽依赖就是指父RDD的每个分区都有可能被多个子RDD分区使用
    宽依赖

参考链接 Spark宽依赖与窄依赖


20. spark streaming中有状态转化操作?

有状态转化: 依赖之前的批次数据或者中间结果来计算当前批次的数据,包括updateStatebyKey()和window()

参考链接 SparkStreaming入门教程(四)有状态和无状态的转化操作


21. spark常用的计算框架?

Spark Core用于离线计算,Spark SQL用于交互式查询,Spark Streaming用于实时流式计算,Spark MLlib用于机器学习,Spark GraphX用于图计算。
Spark主要用于大数据的计算,而hadoop主要用于大数据的存储(比如hdfs、hive和hbase等),以及资源调度yarn。Spark+hadoop的组合是未来大数据领域的热门组合


22. spark整体架构?


23. 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。


24. 搭建spark集群步骤?

  • 安装spark包
  • 修改 spark-env. sh
  • 修改slaves文件
  • 分发spark包,安装spark集群
  • 启动spark集群
  • 查看集群状态,spark集群的默认web管理页面端口为8080,url为http://master:8080

25. Spark的三种提交模式是什么?

  • Spark内核架构,即standalone模式,基于Spark自己的Master-Worker集群;
  • 基于Yarn的yarn-cluster模式;
  • 基于Yarn的yarn-client模式。

如果要切换到第二种和第三种模式,将之前提交spark应用程序的spark-submit脚本,加上–master参数,设置为yarn-cluster,或yarn-client即可。如果没设置就是standalone模式


26. spark内核架构原理?


27. Spark yarn-cluster架构?

Yarn-cluster用于生产环境,优点在于driver运行在NM,没有网卡流量激增的问题。缺点在于调试不方便,本地用spark-submit提交后,看不到log,只能通过yarm application-logs application_id这种命令来查看,很麻烦。
(1)将spark程序通过spark-submit命令提交,会发送请求到RM(相当于Master),请求启动AM;
(2)在yarn集群上,RM会分配一个container,在某个NM上启动AM;
(3)在NM上会启动AM(相当于Driver),AM会找RM请求container,启动executor;
(4)RM会分配一批container用于启动executor;
(5)AM会连接其他NM(相当于worker),来启动executor;
(6)executor启动后,会反向注册到AM。

参考链接 Spark on Yarn两种模式剖析


28. Spark yarn-client架构?

Yarn-client用于测试,因为driver运行在本地客户端,负责调度application,会与yarn集群产生大量的网络通信,从而导致网卡流量激增,可能会被公司的SA警告。好处在于,直接执行时本地可以看到所有的log,方便调试。
(1)将spark程序通过spark-submit命令提交,会发送请求到RM,请求启动AM;
(2)在yarn集群上,RM会分配一个container在某个NM上启动application;
(3)在NM上会启动application master,但是这里的AM其实只是一个ExecutorLauncher,功能很有限,只会去申请资源。AM会找RM申请container,启动executor;
(4)RM会分配一批container用于启动executor;
(5)AM会连接其他NM(相当于worker),用container的资源来启动executor;
(6)executor启动后,会反向注册到本地的Driver进程。通过本地的Driver去执行DAGsheduler和Taskscheduler等资源调度。
和Spark yarn-cluster的区别在于,cluster模式会在某一个NM上启动AM作为Driver。

参考链接 Spark on Yarn两种模式剖析


29. SparkContext初始化原理?

  • TaskScheduler如何注册application,executor如何反向注册到TaskScheduler;
  • DAGScheduler;
  • SparkUI。

参考链接 sparkContext原理剖析


30. Spark主备切换机制原理剖析?

  • spark master的主备切换可以基于两种机制,一种是基于文件系统的,一种是基于zookeeper的
    • 基于文件系统的主备切换机制在active master挂掉之后,需要我们手动去切换到standby master;
    • 而基于zookeeper的主备切换机制在active master挂掉之后,可以实现自动的切换到standby master。
  • 这里要说的master主备切换机制就是,在在active master挂掉之后切换到standby master,master会做哪些操作。

参考链接
spark主备切换机制剖析
spark的主备切换极致原理剖析


31. spark支持故障恢复的方式?

  • 通过血缘关系lineage,当发生故障的时候通过血缘关系回溯,再执行一遍来一层一层恢复数据;
  • 通过checkpoint()机制,将数据存储到持久化存储中来恢复数据。

32. spark解决了hadoop的哪些问题?

    • MR:抽象层次低,需要使用手工代码来完成程序编写,使用上难以上手;
    • Spark:Spark采用RDD计算模型,简单容易上手。
    • MR:只提供map和reduce两个操作,表达能力欠缺;
    • Spark:Spark采用更加丰富的算子模型,包括map、flatmap、groupbykey、reducebykey等;
    • MR:一个job只能包含map和reduce两个阶段,复杂的任务需要包含很多个job,这些job之间的管理以来需要开发者自己进行管理;
    • Spark:Spark中一个job可以包含多个转换操作,在调度时可以生成多个stage,而且如果多个map操作的分区不变,是可以放在同一个task里面去执行;
    • MR:中间结果存放在hdfs中;
    • Spark:Spark的中间结果一般存在内存中,只有当内存不够了,才会存入本地磁盘,而不是hdfs;
    • MR:只有等到所有的map task执行完毕后才能执行reduce task;
    • Spark:Spark中分区相同的转换构成流水线在一个task中执行,分区不同的需要进行shuffle操作,被划分成不同的stage需要等待前面的stage执行完才能执行。
    • MR:只适合batch批处理,时延高,对于交互式处理和实时处理支持不够;
    • Spark:Spark streaming可以将流拆成时间间隔的batch进行处理,实时计算。
    • MR:对于迭代式计算处理较差;
    • Spark:Spark将中间数据存放在内存中,提高迭代式计算性能。

33. 数据倾斜的产生和解决办法?

参考链接 Spark性能调优 【六、数据倾斜解决方案】 密码:ibean.top,如果分享关闭请留言


34. spark 实现高可用性:High Availability?

  • 基于文件系统的单点恢复(Single-Node Recovery with Local File System)
  • 基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)

参考链接 Spark:Master High Availability(HA)高可用配置的2种实现


35. spark实际工作中,是怎么来根据任务量,判定需要多少资源的?


36. spark中怎么解决内存泄漏问题?

  1. driver端
    • 可以增大driver的内存参数:spark.driver.memory (default 1g)
    • DAGScheduler和Spark Context运行在Driver端,rdd的stage切分由driver完成;当程序算子过多可能会切分出大量stage,占用driver内存
  2. map过程产生大量对象
    • 单个map产生大量对象导致;
    • 不增加内存的情况下,减少每个task的大小;可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map
  3. 数据不平衡导致内存溢出,解决方案与2相似,采用repartition的方式;
  4. shuffle后内存溢出

参考链接 spark 如何防止内存溢出