让Spark运行在YARN上(Spark on YARN)

在Spark Standalone模式下,集群资源调度由Master节点负责。Spark也可以将资源调度交给YARN来负责,其好处是YARN支持动态资源调度。Standalone模式只支持简单的固定资源分配策略,每个任务固定数量的core,各Job按顺序依次分配资源,资源不够时排队等待。这种策略适用单用户的场景,但在多用户时,各用户的程序差别很大,这种简单粗暴的策略很可能导致有些用户总是分配不到资源,而YARN的动态资源分配策略可以很好地解决这个问题。关于资源调度,第3章中还会详细讲解。

另外,YARN作为通用的资源调度平台,除了为Spark提供调度服务外,还可以为其他子系统(比如Hadoop MapReduce、Hive)提供调度,这样由YARN来统一为集群上的所有计算负载分配资源,可以避免资源分配的混乱无序。

在Spark Standalone集群部署完成之后,配置Spark支持YARN就相对容易多了,只需要进行如下两步操作。

(1) 在conf/spark-env.sh中增加一项配置HADOOP_CONF_DIR,指向Hadoop集群的配置文件目录,比如:

export HADOOP_CONF_DIR=/usr/local/rt_cluster/hadoop-2.6.0/conf

这里配置同样需要分发至所有节点。

(2) 重启集群。

另外,即便不部署Hadoop集群,Spark程序还是可以访问HDFS文件的:添加一些依赖的jar文件,然后通过以hdfs://开头的完整路径即可。但缺点也很明显,因为HDFS与Spark节点是分离的,数据移动成本很高,大部分情况下都会大于计算成本,因此应用的局限性很明显,不适合大数据量时的计算。

经过上述的部署,Spark可以很方便地访问HDFS上的文件,而且Spark程序在计算时,也会让计算尽可能地在数据所在的节点上进行,节省移动数据导致的网络IO开销。

Spark程序由Master还是YARN来调度执行,是由Spark程序在提交时决定的。以计算圆周率Pi的示例程序为例,Spark程序的提交方式是:

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
    --master spark://<active-master-ip>:<port> \
    lib/spark-examples*.jar \
    10

其中参数--master决定调度方式:如果该参数的值以spark://开头,则使用Spark自己的Master节点来调度;如果其值是yarn-clientyarn-cluster,则是使用YARN来调度,而YARN的具体地址会从前面配置的Hadoop配置目录下的配置文件中得到。

YARN调度有如下两种模式。

  • yarn-cluster模式。YARN会先在集群的某个节点上为Spark程序启动一个称作Master的进程,然后Driver程序会运行在这个Master进程内部,由这个Master进程来启动Driver程序,客户端完成提交的步骤后就可以退出,不需要等待Spark程序运行结束。这是一种非常适合生产环境的运行方式。
  • yarn-client模式。跟yarn-cluster模式类似,这也有一个Master进程,但Driver程序不会运行在Master进程内部,而是运行在本地,只是通过Master来申请资源,直至程序运行结束。这种模式非常适合需要交互的计算。

Spark程序在运行时,大部分计算负载由集群提供,但Driver程序本身也会有一些计算负载。在yarn-cluster模式下,Driver进程在集群中的某个节点上运行,基本不占用本地资源。而在yarn-client模式下,Driver会对本地资源造成一些压力,但优势是Spark程序在运行过程中可以进行交互。所以,建议只在有交互需求的情况下才使用yarn-client模式,其他都使用yarn-cluster模式。

下面还是以计算圆周率为例来说明,因为不需要本地交互,所有可以使用yarn-cluster模式来运行:

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn-cluster \
    lib/spark-examples*.jar \
    10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人分享

Spark on Yarn 架构解析

我们都知道yarn重构根本的思想,是将原有的JobTracker的两个主要功能资源管理器 和 任务调度监控 分离成单独的组件。新的架构使用全局管理所有应用程序的...

2271
来自专栏Hadoop实操

0463-如何使用SQuirreL通过JDBC连接CDH的Hive(方式二)

Fayson在前面的《0459-如何使用SQuirreL通过JDBC连接CDH的Hive(方式一)》简单的介绍了SQuirreL SQL Client的安装、注...

1053
来自专栏行者悟空

Spark之集群概述

1423
来自专栏喵了个咪的博客空间

[喵咪大数据]Hadoop单机模式

千里之行始于足下,学习大数据我们首先就要先接触Hadoop,上节介绍到Hadoop分为Hadoop-HDFS,Hadoop-YARN,Hadoop-Mapred...

3196
来自专栏个人分享

Hadoop on Yarn 各组件详细原理

  运行在独立的节点上的ResourceManager和NodeManager一起组成了yarn的核心,构建了整个平台。ApplicationMaster和相应...

1231
来自专栏Hadoop实操

如何指定Spark1作业中Driver和Executor使用指定范围内端口

在CDH集群中提交Spark作业,大家也都知道Spark的Driver和Executor之间通讯端口是随机的,Spark会随选择1024和65535(含)之间的...

1786
来自专栏Hadoop实操

如何修改CDH集群的DataNoe节点HOSTNAME

在使用CDH集群的过程中,会涉及到修改集群DataNode的HOSTNAME,在修改HOSTSNAME的时候需要注意什么,如何让新修改HOSTSNAME的CDH...

5135
来自专栏Hadoop实操

如何指定Spark2作业中Driver和Executor使用指定范围内端口

在CDH集群中提交Spark作业,大家也都知道Spark的Driver和Executor之间通讯端口是随机的,Spark会随选择1024和65535(含)之间的...

6812
来自专栏分布式系统和大数据处理

安装和配置Hadoop集群(3节点)

在 安装和配置Hadoop(单节点) 这篇文章中,已经进行了Hadoop单机伪集群模式的部署。生产环境中,Hadoop都是以集群方式进行安装和部署的,否则,就不...

1812
来自专栏简单聊聊Spark

Spark性能调优九之常用算子调优

        前面介绍了很多关于Spark性能的调优手段,今天来介绍一下Spark性能调优的最后一个点,就是关于Spark中常用算子的调优。废话不多说,直接进...

1471

扫码关注云+社区