spark集群部署模式概览
元素
一个spark应用包含运行在集群里的一系列进程,它们由主程序(称作driver)里的SparkContext
对象协调。
SparkContext
可以连接不同的集群管理器( Spark的 standalone cluster manager/ Mesos/YARN),这层抽象使得spark可以利用不同的底层设施。集群管理器用于分配资源,spark应用的运行流程与其密切相关。在连接到集群管理器之后,spark首先在集群的各节点上获取executor(用来执行结算和存取数据);然后,spark将你的代码(JAR/ Python files /..)发给executor;最后,由SparkContext
分配任务给executor执行。
在这个架构中有几点值得注意:
- 各应用程序的executor进程是独立的,它们的生命周期为整个应用程序的运行周期,在多线程中运行任务。 这有利于各调度方(每个driver安排自己的任务)和各执行方(不同应用程序的任务运行在不同JVM中)之间彼此隔离。但是,这也意味着在不写入外部存储的情况下,不能跨Spark应用程序(SparkContext的实例)共享数据。
- Spark对底层群集管理器是不可见的。只要可以获取executor进程,并且彼此进行通信,即使在也支持其他应用程序(例如Mesos / YARN)的集群管理器上运行spark也很容易。
- driver必须在其生命周期中侦听并接收其executors的传入连接(例如,请参阅网络配置部分中的spark.driver.port)。因此,工作节点必须能从网络中寻址到驱动程序。
- 因为driver负责调度集群上的任务,所以它应该靠近工作节点运行,最好在一个局域网内。 如果要远程发送请求到集群,最好是向driver发起一个RPC,并让其从附近提交操作,而不是在远离工作节点的位置直接运行驱动程序。
集群管理器分类
目前支持如下几种管理器:
- Standalone - Spark内置,可以方便的部署集群
- Apache Mesos - 常用的集群管理器,可运行Hadoop Mapreduce 和服务程序
- Hadoop YARN - Hadoop2的资源管理器
- Kubernetes(试验性) - 试验性支持,开发中,更多可参加项目主页
应用提交
使用spark-submit脚本,可以将应用程序提交到一个任意类型的集群中运行,这里是详细文档:[application submission guide] 。
监控
每个driver都有一个web界面,可以监控其上运行的任务、executors和存储使用情况。具体参见:monitoring guide
任务调度
术语
术语 | 含义 |
Application | Spark应用程序。包括driver程序和集群上的executor |
Application jar | 一个jar包包含了用户的spark应用。用户jar包中不应该引入Hadoop/spark的库,它们会在运行时被添加 |
Driver program | 运行main()函数并且创建 |
Cluster manager | 用来从集群获取资源的外部服务 (例如standalone manager, Mesos, YARN) |
Deploy mode | 决定driver进程在哪里运行。”cluster” 模式下运行在集群内;”client”模式下,submitter在集群外运行driver |
Worker node | 集群内可以运行Application的节点 |
Executor | 一个worker节点上运行的负责执行任务和存储数据的进程。每个Application拥有自己的executor |
Task | 可以发送给executor执行的任务单位 |
Job | 由多个Task组成的并行计算,响应Spark动作(例如save,collect)而产生;driver日志中可以看到此术语 |
Stage | 每个job被分成更小的任务,称为相互依赖的stage(类似于Map、Reduce);driver日志中可以看到此术语 |