2.1 Spark程序运行时架构
Spark程序运行时架构是指一个Spark程序运行后程序的各个组成部分。
Spark程序运行时的架构如图 2-1 右侧方框所示,共有 3 种角色:Client(客户端),Driver(驱动程序)和Executor(执行器),它们都是进程。
●Client:负责提交Spark程序,提交的对象可以是集群管理器,也可以没有提交对象,本地运行;
集群管理器负责管理、分配、调度集群节点资源。常见的集群管理器有:Yarn、Mesos、K8s 和 Spark自带的Standalone等。
●Driver:负责此次Spark程序运行的管理和状态监控,Spark程序的一次运行,就如同一次作战行动,Driver就是此次行动的指挥员,从程序的开始到结束都由Driver全程负责;
图2-1 Spark程序运行架构图
●Executor:负责执行具体任务,Executor 可能有多个,所有 Executor 合并完成整个任务。Executor中具体执行任务的是Task,每个Task对应一个线程(每个Task不一定只占有 1 个 CPU,可以占用多个 CPU),一个 Executor 中可能会有多个 Task,每个Task的处理逻辑是一样的,只是处理数据不一样。
当Spark程序执行完退出后,图 2-1 架构中的元素:Client、Driver、Executor 也就不存在了。当一个新的Spark程序运行时,又会创建新的Client、Driver和Executor。因此,Spark架构是动态的,不像HDFS架构是固定的—HDFS中有NameNode和DataNode,它们固定运行在某个节点上,自HDFS启动后,就一直存在;
Client 和 Driver 都是一个进程,通过参数指定,可以合并在一个进程内,也可以分开,成为各自独立的进程。Client和Driver之间的状态统称为部署模式(Deploy Mode),如果Client和Driver在一个进程内,则为client模式,如果分开,则为cluster模式;
Client、Driver、Executor可以分开运行在不同的节点上,也可以运行在同一个节点上,由配置决定。
如果Spark程序要分布式运行,则需要和集群管理器交互,获得集群资源。
Client 向集群管理器发出申请,集群管理器接收请求,并为其分配合适的资源。具体选择哪种管理器,可以在Client提交时通过参数指定。每种资源管理器运行Spark程序时机制可能不一样,但不管怎样,Spark程序运行时的架构(图2-1)是不变的。其他细节,如 Executor、Task的分配、资源调度、不同资源管理器上Spark执行机制等,后续还会详细讲述。
综上所述,要构建一个Spark运行环境,除了Spark自身框架外,还需要一个集群管理器和一个存储系统用来存储输入和输出的数据,下面将依据此思路来构建一个Spark大数据处理环境。