Spark 集群模式OverView

下面的内容直接翻译自 http://spark.apache.org/docs/latest/cluster-overview.html
会有少量自己的扩展补充,当然理解或翻译上的问题,有错请指正,下面正式开始。

本文简单介绍了Spark是如何在集群上运行的,这能让我们更好的理解涉及的各个模块。想了解应用是如何在cluster上启动的同学可以研读 http://spark.apache.org/docs/latest/submitting-applications.html

组件介绍

    Spark 应用运行时就像在集群上相互独立运行一组程序,它们之间通过主程序(称为驱动程序)的SparkContext相互协调。

   特别的,为了在集群上运行,SparkCntext能够连接到多种类型的集群管理器上(不仅仅是Spark自己的独立集群管理器,Mesos、YARN),这样就能在跨应用协调资源。一旦链接成功,Spark就获得了集群节点上执行器的状态,执行器将实际运行应用或为应用存储数据。然后,向执行器发送应用码(在Jar或Python文件中定义,在启动时传递给SparkContext的一致)。最后,SparkContext向执行器发送任务。

上图中必须提到的几点:
1. 每个应用都有自己的执行器进程,这个进程持续应用的整个过程中,用多线程执行任务。隔离各个应用是有好处的,在调度侧,每个驱动程序只需要调度自己的任务,在执行侧,不同应用的任务运行在不同的JVM中。同样,这样也意味着如果不适用外部存储,不同应用间无法共享数据。
2. Spark 不在乎下层集群管理器。 只要能够获取执行器进程信息,并且与它们能够相互通信,就能够运行,不管下层集群管理器还支持其他应用(如,Mesos,YARN)。
3. 驱动程序在整个生命周期里必须监听并接受执行器的连接,具体的例子参考网络配置章节 http://spark.apache.org/docs/latest/configuration.html#networking的spark.driver.port and spark.fileserver.port。因此,驱动程序对它的工作节点而言必须是网络可达的。
4.因为驱动程序负责任务在集群中的执行排序,需要尽量接近工作节点,最好是在同个局域网中。如果,还是有需要操作远程集群请求,在临近网络做操作,并且使用RPC,会优于在离工作节点很远的地方运行驱动程序

集群管理
目前Spark系统支持3种集群管理器:
1.Standalone - Spark自带的集群管理器,能够方便的启动集群
2.Apache Mesos - 一种能够运行Hadoop MapReduce 和服务应用的通用集群管理器
3.Hadoop YARN - Hadoop 2中的资源管理器
另外,Spark也有 EC2 launch scripts 能够方便的在Amazon EC2上运行Standalone 集群

提交应用
应用可以通过 spark-submit 提及到集群,详见 http://spark.apache.org/docs/latest/submitting-applications.html

监控
每个驱动程序都有一个端口为4040的web页面,显示当前运行任务、执行器、存储使用等信息。在浏览器中输入http://<driver-node>:4040就能访问。详见 http://spark.apache.org/docs/latest/monitoring.html

任务调度
Spark能够跨应用(集群管理器层)或应用内部(如果存在多个计算过程)进行资源分配控制。详见 http://spark.apache.org/docs/latest/job-scheduling.html

词汇表
下列名称解释能够帮助我们集群的概念。

应用(Application)- 在Spark上创建的用户程序,包括驱动程序和集群上的执行器。
Jar应用(Application jar) - Jar包含了用户Spark应用。某些情况下,用户想创建一个包括应用和它之上的依赖lib的 uber jar。但用户的Jar不能包括Hadoop和Spark lib,这些lib会在运行时加入
驱动程序(Driver program)- 执行应用中main()方法并且创建Sparkcontext的进程。
集群管理器(Cluster Manger)- 一个用于获取集群资源信息的外部服务,例如standalone manager、Mesos、YARN
发布模式(Deploy Mode)- 以驱动程序运行位置区分。集群(cluster)模式下,框架在集群内部启动驱动程序;终端(client)模式下,应用提及者在集群外部启动驱动程序。
工作节点(Worker node)- 集群中任意一台能够运行应用代码的节点。
执行器(Executor)- 在工作节点上为一个应用启动的一个进程,能够运行任务、在内存或磁盘上存储数据。每个应用都要自己的执行器。
任务(Task)- 发送给执行器的工作单元。
工作(Job)- 包含多个任务的一个并行运算,由Spark操作(例如,save,cellect)的响应产生(原文,A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action,后面半句不是很理解 ,望指点)。在驱动日志中会经常看到。
阶段(Stage)- 每个工作(Job)会分成一些称为Stage的更小的想好依赖任务(task)组(有点像MapReduce中的map 和Reduce)。同样,在驱动日志中会经常看到。

猜你喜欢

转载自farness.iteye.com/blog/2262100