Spark on Yarn

Spark on Yarn

1. Spark on Yarn模式优势

与其余计算框架共享集群资源(eg.Spark框架与MapReduce框架同时运行,若是不用Yarn进行资源分配,MapReduce分到的内存资源会不多,效率低下);资源按需分配,进而提升集群资源利用率等。node

相较于Spark自带的Standalone模式,Yarn的资源分配更加细致web

Application部署简化,例如Spark,Storm等多种框架的应用由客户端提交后,由Yarn负责资源的管理和调度,利用Container做为资源隔离的单位,以它为单位去使用内存,cpu等。缓存

Yarn经过队列的方式,管理同时运行在Yarn集群中的多个服务,可根据不一样类型的应用程序负载状况,调整对应的资源使用量,实现资源弹性管理。安全

2. Yarn框架基本原理


                                                                                                      Yarn框架图

2.1 名词解释(简述)

Client做为提交分布式程序的客户端,上传资源文件和JAR包到HDFS提供集群使用通常是client实现的。客户端除了能够直接从RM获得App Master的消息,获得做业的运行状况外,还能够直接与App Master沟通。网络

ResourceManager负责将集群的资源分配给各个应用使用。多线程

Container做为资源分配和调度的基本单位,其中封装了的资源如内存,CPU,磁盘,网络带宽等。每一个任务会被分配一个Container,并在该Container中执行且只能使用其封装的资源。app

NodeManager做为计算节点,负责启动Container,同时经过心跳不断的和RM沟通,描述该Worker节点的资源( CPU,内存,硬盘和网络带宽等)情况。框架

AppMaster 对应客户端提交的一个应用,客户端每提交一个应用,RM会在Worker节点上给它分配一个全局惟一的App master,App master能够在任何一台Worker节点上启动,负责管理做业的整个生命周期,包括通知NM建立Container,管理Container等。分布式

Yarn能够在History Server中查看运行了那些做业,在Hadoop将来版本中还能够经过Histort Server中了解App Master的工做(调度)细节(eg.使用哪台机器上的CPU,内存,处理了什么数据等)。oop

 

2.2 工做流程(简述)

1. RM收到客户端的请求后,会在全局查看资源,若是哪台Worker适合,其上运行的NM就为该做业生成container实例,生成的第一个Container实例,里面运行的就是App Master,App Master运行成功的时候要向RM进行注册。

2. App Master向RM申请资源(eg.10个Container),获得消息反馈后,控制NM启动Container并运行任务,Container启动后直接对App Master负责(做业的调度中心是App Master,极大的减轻的RM的负担)。

Tip:若是没有足够的container能够被申请,则会进行等待其余做业完成任务,空出Container后进行分配。

3.App Master监控容器上任务的执行状况,反馈在做业的执行状态信息和完成状态。

3. Spark on Yarn框架


                                                  Spark on Yarn框架图

Yarn提到的App Master能够理解为Spark中Standalone模式中的driver。

Container中运行着Executor,在Executor中以多线程并行的方式运行Task。

工做流程大致与Yarn相同。

 

4. 部署和使用

4.1配置

使用该模式的时候,需修改$SPARK_HOME/conf/spark-env文件,在文件中加入HADOOP_CONF_DIR 或者 YARN_CONF_DIR路径指向含有客户端配置文件的目录。这些配置会被写入分布式文件系统,YARNResourceManager会连接它们。

//HADOOP目录

export HADOOP_HOME=/usr/local/hadoop

//HADOOP下配置文件目录

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

 

4.2用yarn 运行Spark应用

Sparkon Yarn 模式又分为Yarn-Cluster模式和Yarn-Client模式。

Spark-Cluster模式中,driver程序会在application master进程中运行,客户端程序能够在应用初始化后脱离。Spark-Client模式中,driver运行在client进程中,client通常不是集群中的机器。applicationmaster仅用于向YARN请求资源。调试时通常使用yarn-client模式,便于任务进行过程和结果(log)的查看。

4.2.1 yarn-cluster

在yarn-cluster模式下启动Spark Application

列出一些经常使用的参数:

num-executors是executor的数量

driver-memory 是为driver分配的内存

executor-memory 是每一个executor使用的内存

executor-cores 是每一个executor分配的CPU

示例:

结果:

能够去ResourceManager的web ui 默认端口8088中查看结果,也能够直接去Worker节点的log下查看。


4.2.2 yarn-client

使用方式除了--master 参数改成yarn-client外,其余基本与yarn-cluster相同


执行过程和结果都会在控制台打印出来,这是由于driver运行在客户端中:



4.3 调试

提交任务后,能够在Yarn的ResourceManager对应的Web UI(默认端口为8088)中查看该Application的状态和对应的日志。


Executors和app master都运行在container中。应用完成运行后,YARN有两种处理container日志的模式:

1.若是开启了日志聚合(经过yarn.log-aggregation-enable配置),container的日志会复制到HDFS中而且删除机器上的本地日志。这样能够经过”yarn logs”命令在集群中的任意地方进行查看。

yarn logs -applicationId <app ID>

运行上述命令会打印出指定应用全部container的日志内容。

2.若是日志聚合是关闭的,日志会保存在每一台机器的目录YARN_APP_LOGS_DIR下,一般配置为$HADOOP_HOME/logs/userlogs。查看某个container的日志须要在对应主机的那些目录下进行。子目录会根据Application ID以及Container ID来肯定。

5. Sparn on Yarn 属性列表


属性名

默认值

说明

spark.yarn.applicationMaster.waitTries

10

ApplicationMaster允许SparkContext初始化失败的最大次数

spark.yarn.submit.file.replication

3

Spark和APP的JAR文件以及其余分布式存储的文件、

压缩包上传到HDFS中的副本数量

spark.yarn.preserve.staging.files

false

设置是否在本次Job运行完成后

删除使用到的文件(Spark和App的jar文件等)

spark.yarn.scheduler.heartbeat.interval-ms

5000

Spark application master向YARN心跳汇报的间隔

spark.yarn.max.executor.failures

2*executor数量,最小为3

在Application失败前,executor的最大失败次数

spark.yarn.historyServer.

address

none

Spark历史任务的地址(例如:host.com:18080),不要

包含协议头(http://)。

当Spark应用执行执行完成时,YARN ResourceManager

能够经过这个地址将ResourceManager UI和

Spark 历史任务 UI连接。

spark.yarn.dist.archives

none

将要解压到每一个executor工做目录下的压缩包用逗号分隔。

spark.yarn.dist.files

none

将要放置在每一个executor工做目录下的文件用逗号分隔

spark.yarn.executor.memoryOverhead

384

每一个executor能够分配的非堆存储(off-heap)内存,

这些内存用于如VM,

字符串常量池以及其余本地额外开销等。

spark.yarn.driver.memoryOverhead

384

每一个driver能够分配的非堆存储(off-heap)内存,

这些内存用于如VM,

字符串常量池以及其余本地额外开销等。

spark.yarn.jar

none

修改读取spark jar的地址,

Spark on Yarn默认使用安装在本地的Spark jar文件,

可是该文件也能够放在HDFS上任意能够访问到的位置。

YARN能够将他缓存在节点上,

这样就没必要在应用每次运行时再分发。

用法:能够经过”hdfs:///some/path”来指定HDFS上的jar文件。

spark.yarn.access.namenodes

none

你的Spark Application将要去链接的一个安全的

HDFS nameNodes列表。例如:

`spark.yarn.access.namenodes=

hdfs://nn1.com:8032,hdfs://nn2.com:8032`。

Spark Application首先要能访问访问该列表中

指定的namenode,Spark获取到每一个namenode的安全令牌,

这样Spark Application就能访问那些远程的HDFS集群。

spark.yarn.appMasterEnv.

[EnvironmentVariableName]

none

将环境变量经过EnvironmentVariableName添加到YARN上启

动的Application Master进程。

用户能够指定多个这样的配置来设置多个环境变量。

在yarn-cluster模式中控制Spark driver的环境变量,

在yarn-client模式中只能控制executor启动的环境变量。



6. 注意事项

Hadoop2.2以前,YARN不支持为container资源分配核心数。

Sparkexecutor使用的本地目录由YARN的配置肯定(Hadoop YARN配置yarn.nodemanager.local-dirs)。即便用户在spark配置文件中指定了spark.local.dir也会被忽略。

在yarn-cluster模式下,若是你使用本地文件,参数选项--jars能使代码中的SparkContext.addJar的功能生效。若是使用的是HDFS,HTPP,HTTPS或FTP文件则不须要--jars参数。

相关文章
相关标签/搜索