组件
Spark应用程序运行在集群上的独立进程中,由驱动程序中的SparkContext
对象调度。
SparkContext可以连接到几种集群管理器(例如Standalone,Mesos和YARN),这些集群管理器可以为应用程序分配资源。连接完成后,Spark从集群节点上申请executor,它负责执行计算过程并存储数据。接着Spark将应用程序代码发送到各个executor中。最后,SparkContext将task发送给executor执行。
有几点需要注意:
- 每个应用程序都有自己的executor进程,这些executor会一直存在直到应用程序终结,并以多线程方式执行task。这样的好处是可以从调度层面(驱动程序调度任务)和executor层面(不同应用程序的task运行在不同的JVM中)上彼此隔离。同时也意味着数据无法跨应用程序共享,除非将数据写入外部存储系统。
- Spark对底层的集群管理器一无所知。只要它能够申请executor进程,让executor彼此间通信,就可以运行在各种集群管理器上。
- 驱动程序必须能够监听并接收来自executor的连接请求。
- 因为驱动程序在集群上调度task,所以它最好离工作节点足够近,最好是同一局域网。
术语
下面列出了Spark常用定义:
- Application:用户代码,由驱动程序和executor组成。
- Application jar:包含Spark应用程序的jar包。
- Driver Program:执行应用程序
main()
函数的进程,负责创建SparkContext。 - Cluster manager:申请资源的外部服务(例如Standalone,Mesos和YARN)。
- Deploy mode:分为集群模式和本地模式。
- Worker node:集群中可以执行应用程序的节点。
- Executor:在工作节点上负责执行任务的进程。
- Task:发送给executor的工作单元。
- Job:由多个任务组成的并行计算,这些任务对应着Spark的action算子(例如
save
,collect
)。可以在驱动日志中看到这个术语。 - Stage:每个job会分成几个彼此依赖的stage。