原官网。http://spark.apache.org/docs/latest/cluster-overview.html
术语 | 含义 |
---|---|
Application | 基于spark构建的用户程序代码。由集群上的一个driver program 和多个executor |
Application jar | 一个包含用户Spark应用的Jar |
Driver program | 这是一个进程,运行我们application里的main()方法,并创建SparkContext() |
Cluster manager | 集群管理器,这是一个外部的服务,为了在集群上申请资源(e.g. standalone manager,Mesos,YARN),就是通过CM在YARN,Mesos…上申请资源,所以叫集群管理器 |
Deploy mode | 部署模式,决定了你的driver跑在哪里。–deploy-mode “client” (本地)or “cluster”(集群) |
Worker node | 一个运行我们应用程序代码的节点 ,对于YARN来说就是nodemanager |
Executor | 这是一个在worker上启动的一个进程,如果用YARN,那我们的Executor就跑在Container里面,一个executor能够运行多个task,能够存数据,放在内存或者磁盘上面。每一个应用程序有它自己Executor。 |
Task | 一个工作的最基本的单元,会被发送到executor上面执行 |
Job | 这是一个并行的计算,一个计算里面包含了多个task,只要遇到一个action就是一个Job。 |
Stage | 每个作业被分成较小的任务组,称为阶段,彼此依赖(类似于MapReduce中的map和reduce阶段); 你会在驱动程序的日志中看到这个术语。 |
Spark application是运行在集群上的一组独立的进程,通过主程序(叫做驱动程序)里的sparkcontext对象协调。
具体来说,为了在集群上运行,SparkContext可以连接到集中Cluster manager (spark自己独立的集群管理器,或者是Mesos,或者是YARN),CM去申请资源,一旦申请并连接成功,spark会在集群上面executor,这些executor进程能够进行计算并存储我们的数据。然后,它(Driver programm)将你的应用程序的代码传到executor上面去。最终,SparkContext将你的tasks发送到executors上面去执行。
关于这种架构有几点有用的注意事项:
1、每一个application有它自己的executor进程,独立于其他application,这些进程存在于整个作业的生命周期并以多线程的形式运行我们的tasks(一个executor能够运行多个task)。这样可以在调度方(driver)(每个驱动程序调度自己的任务)和执行方(executor)(在不同JVM中运行的不同application中的tasks)之间隔离应用程序。然而,这意味着不同application之间无法分享数据,除非你将数据写在一个外部存储系统(alluxio框架,一个分布式内存的数据框架)
2、Spark与底层集群管理器(CM)无关。只要它可以获取执行executor进程,并且这些进程相互通信,即使在支持其他应用程序的集群管理器(例如Mesos / YARN)上运行它也相对容易。
3、drvier program必须在其生命周期内监听并接受来自其executor的传入连接。因此,驱动程序必须是来自工作节点的网络可寻址的。
4、因为driver在集群上调度任务,所以它应该靠近work节点运行,最好是在同一局域网上运行。如果您想远程向群集发送请求,最好向driver打开RPC并让它从附近提交操作,而不是远离工作节点运行驱动程序。