一 spark的基本架构
Cluster Manager:用来管理资源,随着资源管理者身份的不同而改变,在standalone 模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器
Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
Driver: 程序入口,负责申请资源和后续整个application执行的管理
Executor:执行器,是为某个Application运行在worker node上的一个进程
Task:application的最小执行单元
注意:
(1)每个应用程序都获得自己的执行进程,这些进程在整个应用程序的持续时间内保持不变,并在多线程中运行任务。这有利于在调度方(每个驱动程序安排自己的任务)和执行方(在不同JVM中运行的不同应用程序的任务)之间彼此隔离应用程序。但是,这也意味着数据在不写入外部存储系统的情况下在不同的Spark应用程序(SparkContext的实例)之间不能共享。
(2)Spark与底层集群管理器无关。只要可以获取执行程序进程,并且这些进程彼此通信,即使在也支持其他应用程序(例如Mesos / YARN)的集群管理器上运行它也是可以的。
(3)驱动程序必须在其生命周期中监听并接收其执行器的传入连接,因此,驱动程序必须能够从worker进行网络寻址。
(4)因为驱动程序调度集群上的任务,所以它应该靠近worker运行,最好在相同的局域网上运行。如果要远程发送请求到集群,最好是向驱动程序打开一个RPC,并从附近提交操作,而不是从远离worker的机器上运行驱动程序。
二 spark的运行模式
(1) local模式(本地模式)
local模式主要是开发时候用来验证开发的application逻辑是否错误,使用多个线程模拟spark的分布式计算,在提交任务的时候,不写默认为local模式。
(2) standalone模式(独立模式)
本地模式,主要是资源自己管理,也就是说master充当clustermanager的角色,负责整个集群的资源调度及管理。
以下是提交任务时候的一些参数
./bin/spark-submit \
–class org.apache.spark.examples.SparkPi \
–master yarn \
–deploy-mode cluster \
–executor-memory 1G \
–num-executors 1 \
/path/to/examples.ja
我们可以在master那更改选择使用哪种模式,standalone模式还分为cluster模式和client模式,二者区别主要是driver的位置不同,使用client的模式,driver会随着application的提交启动在客户端,它的好处在于生成的日志信息详细,它的坏处在于任务多的时候启动的driver也多,集中在client上导致client压力太大,而cluster模式会将driver启动在一台资源不紧张的worker上,所以cluster更适用与正式运行代码,而client适合用于调试代码。
(3)yarn模式
yarn模式就是使用yarn资源管理系统充当clustermanager,负责整个集群的资源管理,yarn模式也分cluster模式和client模式,和(2)描述一致。
在yarn模式下简单的执行流程:
1)在客户端提交代码,有客户端向resourcemanager进行注册
2)resourcemanager会启动一个applicationmaster进程和一个driver进程,启动
driver也就意味着启动了DAGScheduler和TaskScheduler。
3)driver会通过applicationmaster间接的向resourcemanager申请程序执行所需要的资源,
4)resourcemanager接收到申请后会返回container(里面放的都是资源--钱)
5)从container里启动executor,然后executor向driver反向注册,告诉driver自己的信息
6)driver每遇到一个action就创建一个Job任务,会把创建的这个Job任务提交给DAGScheduler,DAGScheduler会把这个Job任务划分成为多个stage,会为每个stage创建一个TaskSet的集合。TaskScheduler会把TaskSet集合里面的每个task对象发送给Executor。Executor接收到task,都会启动一个TaskRunner去封装这个task,然后把task丢到线程池里面去运行。
(4) mesos模式
mesos也是一个资源调度系统。是spark自家的
在mesos上的执行流程
1)通过spark-submit提交任务到spark-mesos-dispatcher
2)spark-mesos-dispatcher 把通过driver 提交到mesos master,并收到任务ID
3)mesos master 分配到slaver 让它执行任务
4) spark-mesos-dispatcher,通过任务ID查询任务状态