一、大数据面试题_Spark篇
(一)SparkCore
1、hadoop 和 spark 的相同点和不同点?
-
Hadoop 底层使用 MapReduce 计算架构,只有 map 和 reduce 两种操作,表达能 力比较欠缺,而且在 MR 过程中会重复的读写 hdfs,造成大量的磁盘 io 读写操 作,所以适合高时延环境下批处理计算的应用;
-
Spark 是基于内存的分布式计算架构,提供更加丰富的数据集操作类型,主要分 成转化操作和行动操作,包括 map、reduce、filter、flatmap、groupbykey、 reducebykey、union 和 join 等,数据分析更加快速,所以适合低时延环境下计算 的应用;
-
spark与hadoop最大的区别在于迭代式计算模型。基于mapreduce框架的Hadoop 主要分为 map 和 reduce 两个阶段,两个阶段完了就结束了,所以在一个 job 里 面能做的处理很有限;spark 计算模型是基于内存的迭代式计算模型,可以分为 n 个阶段,根据用户编写的 RDD 算子和程序,在处理完一个阶段后可以继续往下 处理很多个阶段,而不只是两个阶段。所以 spark 相较于 mapreduce,计算模型 更加灵活,可以提供更强大的功能。
-
但是 spark 也有劣势,由于 spark 基于内存进行计算,虽然开发容易,但是真正 面对大数据的时候,在没有进行调优的轻局昂下,可能会出现各种各样的问题, 比如 OOM 内存溢出等情况,导致 spark 程序可能无法运行起来,而 mapreduce 虽然运行缓慢,但是至少可以慢慢运行完。
2、 spark 如何保证宕机迅速恢复?
- 适当增加 spark standby master
- 编写 shell 脚本,定期检测 master 状态,出现宕机后对 master 进行重启操作
3、RDD 持久化原理?
spark 非常重要的一个功能特性就是可以将 RDD 持久化在内存中。
调用 cache()和 persist()方法即可。cache()和 persist()的区别在于,cache()是 persist() 的一种简化方式,cache()的底层就是调用 persist()的无参版本 persist(MEMORY_ONLY),将数据持久化到内存中。
如果需要从内存中清除缓存,可以使用 unpersist()方法。RDD 持久化是可以手动 选择不同的策略的。在调用 persist()时传入对应的 StorageLevel 即可。
具体可参考文章:Spark中RDD的持久化
4、checkpoint 检查点机制?
-
应用场景:当 spark 应用程序特别复杂,从初始的 RDD 开始到最后整个应用程序 完成有很多的步骤,而且整个应用运行时间特别长,这种情况下就比较适合使用 checkpoint 功能。
-
原因:对于特别复杂的 Spark 应用,会出现某个反复使用的 RDD,即使之前持久 化过但由于节点的故障导致数据丢失了,没有容错机制,所以需要重新计算一次 数据
Checkpoint 首先会调用 SparkContext 的 setCheckPointDIR()方法,设置一个容错的 文件系统的目录,比如说 HDFS;然后对 RDD 调用 checkpoint()方法。之后在 RDD 所处的 job 运行结束之后,会启动一个单独的 job,来将 checkpoint 过的 RDD 数 据写入之前设置的文件系统,进行高可用、容错的类持久化操作。
检查点机制是我们在 spark streaming 中用来保障容错性的主要机制,它可以使 spark streaming 阶段性的把应用数据存储到诸如 HDFS 等可靠存储系统中,以供 恢复时使用。具体来说基于以下两个目的服务:
- 控制发生失败时需要重算的状态数。Spark streaming 可以通过转化图的谱系 图来重算状态,检查点机制则可以控制需要在转化图中回溯多远。
- 提供驱动器程序容错。如果流计算应用中的驱动器程序崩溃了,你可以重启 驱动器程序并让驱动器程序从检查点恢复,这样 spark streaming 就可以读取 之前运行的程序处理数据的进度,并从那里继续。
具体可参考文章:Spark中checkpoint检查点机制
5、spark 有哪些组件?
master:管理集群和节点,不参与计算。
worker:计算节点,进程本身不参与计算,和 master 汇报。
Driver:运行程序的 main 方法,创建 spark context 对象。
spark context:控制整个 application 的生命周期,包括 dagsheduler 和 task scheduler 等组件。
client:用户提交程序的入口。
6、spark 工作机制?
用户在 client 端提交作业后,会由 Driver 运行 main 方法并创建