1、Spark系统架构
与Hadoop MapReduce 的结构类似,Spark 也是采用 Master-Worker 架构。
Master 节点与Worker 节点的职责如下:
1)、Master 节点上常驻Master 进程。该进程负责给Worker 进程分发Spark 任务,监控Worker 进程的存活情况以及监控Worker 进程上任务的执行情况。
2)、Worker 节点上常驻Worker 进程。该进程除了与Master 进程进行通信外,还负责管理Spark 任务的执行,如启动 Exector 来执行具体的task,以及监控task 的执行情况。
Spark 以线程的方式运行task 而不是以进程的方式运行task 的讨论:在Hadoop Map/Reduce 中,每个task 是以java 进程的方式运行。这样的好处是,每个task 独享进程资源,每个task 之间相互独立,不会相互干扰,但坏处是,task 之间不方便共享数据。例如,如果同一个机器上的不同task 想要读取同一份字典进行数据过滤的时候,需要将这个字典拷进各自的进程中,这样就能造成了数据的多次拷贝、内存资源的浪费问题。另外,在应用的执行过程中,需要不停的启动/停止新旧task,在task 的启动/停止过程中,需要做很多初始化的工作,因此采用进程的方式运行task 会降低执行的效率。为了数据共享和提高执行效率,Spark 使用线程的方式执行task,但缺点是线程间会有资源的竞争,而且 Executor JVM 的日志中会包换多个并行执行task 的运行日志,比较混乱。
1.1 用户代码基本逻辑
在Spark 中,需要注意的是数据处理流程在执行 action() 的时候,才会执行数据处理流程。如果没有action() 操作的话,Spark 是不会执行数据处理流程的。
1.2 物理执行计划
Spark 根据数据依赖关系,将逻辑处理流程转换为物理执行计划,包括执行阶段和执行任务。包括以下3个步骤:
(1) 首先确定应用会产生哪些作业(job)。
(2)其次根据逻辑处理流程中的数据依赖关系,将每个job 拆分为执行阶段(stage)。
(3) 最后,根据每个RDD 的分区个数确定执行task 的个数和种类。
为什么要拆分执行阶段?如果将每个操作当做一个任务,那么效率太低,错误容忍也比较困难。将job 拆分为任务阶段 stage 后,第1个好处是,拆分得到的stage 不会太小,也不会太大,而且是同构的,便于并行执行。第2个好处是,可以将多个操作放到一个task 中执行,使得操作可以串行、流水化处理,提高了数据处理的效率。第3个好处是,可以方便进行错误容忍处理,一个stage失效,我们只需要重新运行失效的stage,而不是重新运行整个job。