本篇博客简述 Spark 集群相关的概念。html
Spark 的"集群"不是提供运算服务的,而是一种资源分配的调度器。
执行任务的 Spark 进程做为客户端向"集群"申请资源(运算节点), "集群"分配资源之后,
这个 Spark 进程会分解一些计算工做,并把他们放到这些申请来的资源中运行。node
提交给 Spark 执行的工做称作 application
(应用),对应的主程序称做:driver program
。driver program
经过一个叫作 SparkContext
的对象来协调 Spark 集群中不一样进程的任务。数据库
具体来讲:apache
driver program
向"集群"申请到得运算节点称做 worker node;app
一旦申请到 worker node,driver program
会链接这些 worker node, 并在 worker node 上建立(acquire)执行计算的进程(executor
);分布式
接下来 driver program
将计算须要的代码和数据发给 executor
;函数
最后 SparkContext
将分解出来的 task
(任务) 发送给各个 executor
去执行。oop
过程以下图所示:ui
这里有一些注意点:spa
每一个 application
都得到本身独立的 executor
进程,这个executor
进程利用多个线程运行多个 task
。这样能够保证不一样application
的隔离性,不管是调度端(driver program
分解各自的 task
),仍是执行端(每一个executor
只跑来自同一个 application
的 task
)。不过这也意味着,不一样的 application
之间除非借助外部存储系统(例如数据库),不然是不能够共享数据的。
Spark 是不须要知道运行在什么样的 "集群" 上的。Spark 只须要能够建立进程,而且和这些进程通讯,不管是运行在什么样的集群上(eg. Mesos/YARN)均可以。
driver program
必须在整个生命周期中能够从不一样的 executor
接受链接。所以,driver program
对于 executor
来讲,
必须是网路可及的。
由于由driver program
分解 task
,它必须和 worker
节点很接近,最好在同一个局域网。
若是你不能作到这一点(例如从远程提交 application
),最好开一个 RPC,利用靠近 Spark 集群的机器来运行 driver program
实现集群的程序称为:集群管理器
。目前有三种集群管理器
:
Standalone - 这个集群管理器打包在 spark 的程序里,是最简单的集群管理器。
Apache Mesos - 一个很是成熟的分布式操做系统,能够用来运行除 Spark 之外的不少系统。
Hadoop YARN - Hadoop 的 资源管理器。
术语 | 解释 |
---|---|
Application | 在 Spark 上运行的工做, 由 driver program 和 executors 组成 |
Application jar | 包含 Application 代码的 jar 包。在一些应用场景中,jar 须要包含依赖的库。不过永远不要包含 Hadoop 和 Spark 的库 |
Driver program | 运行 Application 的main() 函数的进程,而且 SparkContext 对象在此进程中建立 |
Cluster manager(集群管理器) | 实现集群的资源调度分配的外部程序 |
Deploy mode | 用于区分 driver program 进程在哪里运行。cluster 模式下,driver 在集群中的节点上运行。 client 模式下,driver 在集群之外的地方运行 |
Worker node | 集群中运行程序的节点 |
Executor | 在 worker node 中为 各 Application 建立的进程。它会执行 Application 相关的 task,将它们的数据保存在内存中或磁盘上。 |
Task | 执行具体计算的单元,会被发送给特定的 executor 执行 |
Job | 一个由多个 task 组成的并行计算集,它们生成 Spark 动做(eg. save, collect) 的结果。这个术语会出如今 driver 的日志中 |
Stage | 每一个 job 会被分解成更小的 task 的集合,这些集合被称做 stage 。它们彼此依赖(就像 MapReduce 中的 map 和 reduce 两个 stage );这个术语会出如今 driver 的日志中 |