Spark集群部署


一、Spark运行时架构

在分布式环境下,Spark集群采用的是主从结构。在一个Spark集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个节点称为驱动器(Driver)节点,与之对应的节点称为执行器(executor)节点。两种节点一起被称为一个Spark应用(application)。

1、驱动器节点

驱动器是执行程序中main()方法的进程,用来创建SparkContext、RDD,并执行RDD转化操作和行动操作的代码。其职责为:

(1)把用户程序转化为任务
驱动器程序负责把用户程序转为多个物理执行的单元,这些单元也被称为任务(task)。Spark程序其实是隐式创建出了一个由操作组成的逻辑上的有向无环图(Directed Acyclic Graph),简称DAG。即程序从输入数据创建一系列RDD,再使用转化操作派生出新的RDD,最后使用行动操作收集或存储结果RDD中的数据。驱动器程序运行过程中,会把这个逻辑图转为物理执行计划。

Spark会对逻辑执行计划作一些优化,比如将连续的映射转为流水线化执行,将多个操作合并到一个步骤中。这样Spark就把逻辑计划转为一系列步骤(stage)。而每个步骤又由多个任务组成。这些任务会被打包并发送到集群中。任务是Spark中最小的工作单元,用户程序通常需要启动成百上千个独立任务。

(2)为执行器节点调度任务
有了物理执行计划之后,Spark驱动器程序必须在各执行器进程间协调任务的调度。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对应用中的所有执行器节点有完整的记录。每个执行器节点代表一个能够处理任务和存储RDD数据的进程。

Spark驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。当任务执行时,执行器进程会把缓存数据存储起来,而驱动器进程同样会跟踪这些缓存数据的位置,并且利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。

2、执行器节点

Spark执行器节点是一种工作进程,负责在Spark作业中运行任务,任务间相互独立。Spark应用启动时,执行器节点就被同时启动,并且始终伴随整个Spark应用的生命周期而存在。

执行器有两大作用:
(1)负责运行组成Spark应用的任务,并将结果返回给驱动器进程。
(2)通过自身块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存存储。RDD是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

3、集群管理器

Spark依赖于集群管理器来启动执行器节点,在某些特殊情况下,驱动器节点也需要依赖于集群管理器来启动。集群管理器是Spark中可插拔式组件,除了Spark自带的独立集群管理器,Spark也可以运行在其他外部集群管理器上。

Spark文档中始终使用驱动器节点和执行器节点的概念来描述执行Spark应用的进程。而主节点(master)和工作节点(worker)的概念则被用来分别表述集群管理器中的中心化的部分和分布式的部分。

4、集群运行流程

(1)用户通过spark-submit脚本提交应用。
(2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法。
(3)驱动器程序与集群管理器通信,申请资源以启动执行器节点。
(4)集群管理器为驱动器程序启动执行器节点。
(5)驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。
(6)任务在执行器程序中进行计算并保存结果。
(7)如果驱动器程序的main()方法退出,或者调用了SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。

二、使用sprk-submit部署应用

1、spark-submit的一般格式

bin/spark-submit [options] <app jar | python file> [app options]

其中:
(1)[options]
是传给spark-submit的标记列表,可以用spark-submit --help列出所有可以接收的标记
(2)<app jar | python file>
表示包含应用入口的JAR包或Python脚本
(3)[app options]
传给程序中main()方法的参数

spark-submit常用标记:

标记含义
–master表示要连接的集群管理器,可接收选项见下表
–deploy-mode可在本地(客户端client)启动驱动器程序,spark-submit会将驱动器程序运行在spark-submit被调用的这台机器上(默认是本地模式)。也可在集群中的一台工作节点机器(集群cluster)上启动,在此模式下,驱动器程序会被传输并执于集群的一个工作节点上
–class运行Java或Scala程序时应用的主类
–name应用的显示名,会显示在Spark的网页用户界面中
–jars需要上传并放到应用的CLASSPATH中的JAR包的列表。如果应用依赖于少量第三方的JAR包,可以把它们放在这个参数里
–files需要放到应用工作目录中的文件的列表,这个参数一般用来放需要分发到各节点的数据文件
–py.files需要添加到PYTHONPATH中的文件的列表,其中可以包含.py、.egg以及.zip文件
–executor-memory执行器进程使用的内存量,以字节为单位,可以使用后缀指定更大的单位,比如512m或1g
–driver-memory驱动器进程使用的内存量,以字节为单位,可以使用后缀指定更大的单位,比如512m或1g

spark-submit的–master标记可接收的值:

描述
spark://host:port连接到指定端口的Spark独立集群上,默认情况下Spark独立节点使用7077端口
yarn连接到一个YARN集群,在YARN上运行时,需要设置环境HADOOP_CONF_DIR指向Hadoop配置目录,以获取集群信息
local运行本地模式,使用单核
local[N]运行本地模式,使用N个核心
local[*]运行本地模式,使用尽可能多的核心

2、依赖冲突

当用户应用与Spark本身依赖同一个库时可能会发生依赖冲突,导致程序崩溃。通常表现为Spark执行作业过程中抛出NoSuchMethodError、ClassNotFundException,或其他与类加载相关的JVM异常。对于这种问题有两种解决方法:
(1)修改应用,将其使用的依赖库版本与Spark所使用的相同。
(2)使用shading方式打包应用,这可以用另一个命名空间保留冲突的包,并自动重写应用的代码使得它们使用重命名的版本,此方式简单粗暴但很有效。

三、集群管理器

1、独立集群管理器

Spark可以运行在各种集群管理上,并通过集群管理器访问集群中的机器。独立集群管理器由一个主节点和几个工作节点组成,各自都分配有一定量的内存和CPU核心。提交应用时,可以配置执行器进程使用的内存量,以及所有执行器进程使用的CPU核心总数。

(1)提交应用
独立集群支持两种部署模式,在客户端(client)模式下,驱动器程序会运行在执行spark-submit的机器上,可以直接看到驱动器程序的输出。

在集群(cluster)模式下,驱动器程序会作为某一个工作节点上一个独立的进程运行在独立集群管理器内部。它也会连接主节点来申请执行器节点。这种模式下本地电脑关机不会影响程序运行,且可以通过集群管理器的网页用户界面访问应用的日志。
向spark-submit传递–deploy-mode cluster参数可以切换到集群模式。

使用spark-submit的–executor-memory为执行器进程申请内存时,如果超过了集群所能提供的内存总量,则集群管理始终无法为应用分配执行器节点。

(2)配置资源用量
I 执行器进程内存
可以通过spark-submit的–executor-memory参数来配置。每个应用在每个工作节点上最多拥有一个执行器进程(但一台机器上可以运行多个从节点),因此此项设置能够控制执行器节点占用工作节点的多少内存。此设置荐默认值是1GB。

II 占用核心总数的最大值
这是一个应用中所有执行器进程所占用的核心总数,默认是无限。可以通过spark-submit的–total-executor-cores参数来设置这个值,或在Spark配置文件中设置spark.cores.max的值。

(3)资源调度策略
可通过配置属性spark.deploy.spreadOut来选择调度策略。(这会影响到集群上所有应用,必须在启动独立集群管理器之前设置好)
其值默认为true,此情况下独立集群管理器会为每个应用使用尽可能分散的执行器进程。比如:一个20个物理节点的集群,每个节点四核,使用–executor-memory 1G 和–total-executor-cores 8 提交应用,这样Spark会在不同机器上启动8个执行器进程,每个1GB内存。这样做,以尽可量实现对于运行在相同机器上的分布式文件系统如HDFS的数据本地化,因为这些文件系统通常也把数据分散到所有物理节点上。

也可以将其值配置为false来要求Spark把执行器进程合并到尽量少的工作节点中。这种情况下,前面的应用就只会得到两个执行器节点,每个有1GB内存和4个核心。

(4)高可用
若需要集群中的主节点拥有高度可用性,可使用ZooKeeper来维护多个备用的主节点,并在一个主节点失败时切换到新的主节点上。

2、Hadoop YARN

YARN集群管理器可以让多种数据处理框架运行在一个共享的资源池上(可以配置多个资源队列),且通常安装在与HDFS相同的物理节点上。Spark在YARN集群上运行时,YARN可以让Spark在存储数据的物理节点上运行,以快速访问HDFS中的数据。

和独立集群管理器一样,有两种将应用连接到集群的模式:

(1)客户端模式
在spark-submit脚本提交应用程序时可以通过参数列表中–master yarn-client设置
此模式下应用的驱动器程序运行在提交应用的机器上,如本地电脑。

(2)集群模式
在spark-submit脚本提交应用程序时可以通过参数列表中–master yarn-cluster设置。在此模式下驱动器程序也运行在一个YARN容器内部。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值