几段白话文讲明白Spark工作原理(面试必会)

去面试大数据的时候,面试官一定会问你一些常见的大数据组件以及其工作流程是否熟悉,下面几次会分享大数据面试干货,赶快学起来吧。

一、 Spark的Application工作原理

  1. 首先启动自己的程序 Application
  2. Spark—submint(shell)提交任务
  3. 开启Driver进程,执行Application
  4. SparkContext 初始化(进行资源的申请、任务的分配和监控),构造出来两个实例
  5. DAGSchedule 和TaskSchedule
  6. TaskScheduler 通过他的后台进程连接Master
  7. Master收到Application注册请求后,会使用自己的资源算法,在Spark集群的Worker上启动相应的Executor
  8. Master通知Worker启动Executor
  9. Worker为Application启动Executor 进程
  10. Executor启动后向TaskSchedule 反向注册
  11. Executor都反向注册到Driver上,SparkContext 结束自己 的初始化
  12. 编写自己的程序逻辑
  13. DAG触发一次Action 形成一个完整的DAG,对应一个job
  14. Job提交DAG到 DAGSchedule
  15. DAGSchedule会将DAG划分为多个Stage,每个Stage对应一个TaskSet—(Stage划分算法@1)
  16. TaskSchedule会将每一个TaskSet里面的Task提交到Executor中执行(序列化)----(Task分配算法)
  17. Executor里面有线程池,Executor每收到一个Task,用TaskRunner封装Task,然后从线程池取出一根线程执行Task
  18. TaskRunner将我们编写的代码,要执行的算子或函数,拷贝,反序列化 ,执行Task
  19. Task在Executor上运行把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。

斗胆解读:
1.Task分两种:ShuffleMapTask 和ResultTask,只有最后一个Stage才是ResultTask,之前的Stage都是ShuffleMapTask。
2.整个Spark程序的执行,就是Stage分批提交TaskSet到Executor执行 ,每个Task针对RDD的一个partioton,执行我们定义的算子或函数。

注释:
@1:其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法

问答点:

1.RDD是什么?存数据吗?

答:弹性的分布式数据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集,里面不存数据,只记录了对它做了哪些操作的数据集片段(所谓的依赖血统),不能直接对它做修改

2.RDD有什么特性?

答:容错性、持久性

3.哪些操作会产生Shuffle

答:触发的 shuffle 操作包括 repartition 操作,如 repartition 和 coalesce,‘ByKey 操作(除了 counting 之外)像 groupByKey 和 reduceByKey,和 join 操作,像 cogroup 和 join.

4.Spark有哪些组件?
答:

(1)master:管理集群和节点,不参与计算。
(2)worker:计算节点,进程本身不参与计算,和master汇报
(3)Driver:运行程序的main方法,创建spark context对象
(4)spark context:控制整个application的生命周期,包括dagsheduler和task scheduler等组件
(5)client:用户提交程序的入口

5.Spark为什么比mapreduce快?
答:

1)基于内存计算,减少低效的磁盘交互
2)高效的调度算法,基于DAG
3)容错机制Linage,精华部分就是DAG和Lingae

6.Spark读取数据,是几个Partition呢?
答:

从两个方面介绍和回答,一是说下 partition 是什么,二是说下 partition 如何建的
1)spark中的partion是弹性分布式数据集RDD的最小单元,RDD是由分布在各个节点上的partition组成的。partition是指的spark在计算过程中,生成的数据在计算空间内最小单元,同一份数据(RDD)的partion大小不一,数量不定,是根据application里的算子和最初读入的数据分块数量决定的,这也是为什么叫“弹性分布式”数据集的原因之一。Partition不会根据文件的偏移量来截取的(比如有 3 个 Partition,1 个是头多少 M 的数据,1 个是中间多少 M 的数据,1 个是尾部多少M的数据),而是从一个原文件这个大的集合里根据某种计算规则抽取符合的数据来形成一个 Partition 。
2)如何创建分区,有两种情况,创建RDD时和通过转换操作得到RDD时。对于前者,在调用textFile和parallelize方法时候手动指定分区个数即可。例如sc.parallelize(Array(1,2,3,5,6),2)指定创建得到的RDD分区个数为2。如果没有指定partition数等于block数;对于后者,直接调用repartition方法即可。实际上分区的个数是根据转换操作对应多个RDD之间的依赖关系来确定,窄依赖子RDD由父RDD分区个数决定,例如map操作父RDD和子RDD分区个数一致;Shuffle 依赖则由分区器(Partitioner)决定,例如 groupByKey(new HashPartitioner(2))或者直接groupByKey(2)得到的新RDD分区个数等于2

7.Spark中数据的位置是被谁管理的?

答:每个数据分片都对应具体物理位置,数据的位置是被blockManager,无论数据是在磁盘,内存还是tacyan,都是由blockManager管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据学习僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值