本文简短概述下spark如何在集群上运行,使得更简单地理解涉及到的组件。可以通过读”应用提交指南”来学习在一个集群上加载应用。
组件
spark应用作为独立的进程集运行在集群上,在主应用(称为驱动程序)中通过SparkContext来协调调度。
特别地,运行在集群上,SparkContext能够连接多种类型的集群管理者(spark自己的集群管理,Mesos或YARN),实现跨应用分配资源。一旦连接上,spark需要集群节点上的执行者进程为你的应用运行计算和存储数据。接下来会发送你的应用代码(由发送给Spark
Context的JAR或Python文件定义)给执行者。最后,SparkContext发送任务为给执行者运行。
这个结构中有些有用的事项需要注意:
1、每个应用有自己的执行进程,会保留到整个应用周期,以多线程方式运行任务。这样在调度(每个驱动调度自己的任务)和执行(来自不同应用的任务运行在不同的JVM中)方面有隔离应用的益处。然后,这样也意味着数据无法跨不同的spark应用(SparkContext实例)共享,除非把数据写入额外的存储系统中。
2、spark对于底层集群管理器是不可知。只要它能获取执行进程,并且进程间相互沟通,那么spark运行在支持其他应用的集群管理器(比如Mesos/YARN)上就相对简单。
3、驱动程序必须监听和接受整个生命周期(参见spark.driver.port in the network config section)中从执行者进程中进来的连接。按这样,驱动程序对于工作节点来说必须是网络可寻址的。
4、因为驱动调度集群中的任务,运行应该靠近工作节点,优先选择相同的本地区域网络。如果你想远程请求集群,最好是打开一个RPC给驱动,并从近处提交操作,而不是在离工作节点远处运行驱动。
集群管理器类型
系统目前支持三种集群管理器:
1、standalone—spark内置的简单集群管理器,方便创建集群
2、Apache Mesos—通用集群管理器,能够运行Hadoop MapReduce和服务程序。
3、Hadoop YARN—Hadoop2中的资源管理器。
4、Kubernetes(实验性的)—除了以上,还对Kubernetes提供实验性的支持。Kubernetes是一个开源平台,提供以容器为中心的基础设施。Kubernetes支持正在apache-spark-on-k8s Github组织中积极开发。文档见项目的README。
提交应用
使用spark-submit脚本可以提交应用给任意一种集群。应用提交指南 描述了如何去做。
监控
每个驱动程序有一个网页界面,一般使用4040端口,呈现有关正在运行的任务、执行者和存储使用情况的信息。简单地在网页浏览器中访问http://:4040就可以使用界面。监控指南 描述了其他的监控选项。
工作调度
Spark控制着跨应用(在集群管理器层面)和应用间(如果一个SparkContext上有多个计算工作)的资源分配。工作调度概述 做了更具体的描述。
词汇表
下面的表格总结了谈到集群概念时会看到的术语。
Term | Meaning |
application | 建立在Spark上的用户应用,由一个驱动程序和集群上的执行者组成 |
application jar | jar包含用户的Spark应用。有时候用户会建立一个“uber jar”,包含应用和它的依赖。用户jar不应该包括Hadoop或Spark库,这些会在运行时加进来。 |
Driver program | 运行应用main()函数和创建SparkContext的进程 |
Cluster manager | 获取集群资源的外部服务(比如独立管理器、Mesos、YARN) |
deploy node | 判别驱动程序运行的地方。在集群模式下,框架在集群内部启动驱动。在客户端模式下,提交者在集群外部启动驱动。 |
worker node | 集群中能够运行应用代码的任何节点 |
executer | worker node中为一个应用启动的进程,然后运行任务,保留跨任务的数据在内存或硬盘上。每个应用都有自己的执行者。 |
task | 发给一个执行者的一组工作 |
job | 并行计算包含多个tasks,这些tasks由Spark action回复催生。你会在驱动日志中看到。 |
stage | 每个工作分成更小的任务集,称为stages,彼此以来(类似于MapReduce中的map和reduce stage);你会在驱动日志中看到。 |