yarn和mapreduce资源调优

yarn和mapreduce资源调优,第1张

YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下:

(1)yarn.nodemanager.resource.memory-mb

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

(2)yarn.scheduler.minimum-allocation-mb

单个容器可申请的最少物理内存量,默认是1024(MB),如果一个容器申请的物理内存量少于该值,则该对应的值改为这个数。

(3) yarn.scheduler.maximum-allocation-mb

单个容器可申请的最多物理内存量,默认是8192(MB)

目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。在YARN中,CPU相关配置参数如下:

(1)yarn.nodemanager.resource.cpu-vcores

表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物

理CPU总数。

(2)yarn.scheduler.minimum-allocation-vcores

单个容器可申请的最小虚拟CPU个数,默认是1,如果一个容器申请的CPU个数少于该数,则该对应的值改为这个数

(3)yarn.scheduler.maximum-allocation-vcores

单个容器可申请的最多虚拟CPU个数,默认是4

3.mapreduce---Memory调优

(1)yarn.app.mapreduce.am.resource.mb

MR AppMaster需要的内存,默认是1536M

(2)yarn.app.mapreduce.am.command-opts

MR AppMaster的Java opts ,默认是 -Xmx1024m

(3)mapreduce.map.memory.mb

每个map task所需要的内存,默认是1024M。应该是大于或者等于Container的最小内存

(4)mapreduce.reduce.memory.mb

每个reduce task所需要的内存,默认是1024M

(5)mapreduce.map.java.opts

map task进程的java.opts,默认是 -Xmx200m

(6)mapreduce.reduce.java.opts

reduce task进程的java.opts,默认是 -Xmx200m

特别注意:

mapreduce.map.memory.mb >mapreduce.map.java.opts

mapreduce.reduce.memory.mb >mapreduce.reduce.java.opts

mapreduce.map.java.opts / mapreduce.map.memory.mb

=0.70~0.80

mapreduce.reduce.java.opts / mapreduce.reduce.memory.mb

=0.70~0.80

在yarn container这种模式下,JVM进程跑在container中,mapreduce.{map|reduce}.java.opts 能够通过Xmx设置JVM最大的heap的使用,

一般设置为0.75倍的memory.mb,

则预留些空间会存储java,scala code等

4.mapreduce---CPU调优

(1)mapreduce.map.cpu.vcores

map task的虚拟核数,默认为1

(2)mapreduce.reduce.cpu.vcores

reduce task的虚拟核数,默认为1

(3)yarn.app.mapreduce.am.resource.cpu-vcores

am的虚拟核数,默认为1

假设机器的物理配置 64G 16cores

装完系统还剩 62G

预留15~20% 14G:DN 4G + NM 1G=5G 9G

DN进程: 生产4G

1000m

hadoop-env.sh

HADOOP_NAMENODE_OPTS=-Xmx1024m

HADOOP_DATANODE_OPTS=-Xmx4096m

NM进程: 生产1G

yarn-env.sh

export YARN_RESOURCEMANAGER_HEAPSIZE=1024

export YARN_NODEMANAGER_HEAPSIZE=1024

部署同一台: 数据本地化

NN RM 经常性部署同一台 说白了 集群节点少

yarn.nodemanager.resource.memory-mb : 48G 计算总内存 固定经验计算值

yarn.nodemanager.resource.cpu-vcores : 24

yarn.scheduler.minimum-allocation-mb : 4G

yarn.scheduler.minimum-allocation-vcores: 2

yarn.scheduler.maximum-allocation-mb : 8G

yarn.scheduler.maximum-allocation-vcores : 4 固定经验值(不要超过5个)

http://blog.itpub.net/30089851/viewspace-2127851/

http://blog.itpub.net/30089851/viewspace-2127850/

理想情况下, YARN     应用发出资源请求时应该立刻给予满足。但是在实际生产环境中资源是有限的,

在一个繁忙的集群上,一个应用经常需要等待才能分配到所需要的资源。

YARN     调度器的工作就是根据既定策略为应用能够分配资源。调度是一个难题,

并没有一个所谓    “最好”     的调度策略,在    YARN     提供了多种调度器和可配置策略供我们选择

YARN     中有三种调度器可用: FIFO  调度器( FIFO Scheduler ),容量调度器( Capacity Scheduler )

和公平调度器( Fair Scheduler )。

下面来详细介绍一下这三种调度方式

FIFO Scheduler(FIFO     调度器):

        FIFO     调度器将所有提交的应用放置在一个队列中,按照提交的顺序(先进先出)运行应用。

首先为队列中的第一个应用的请求分配资源,当第一个应用的请求被满足后在依次为队列中的下一个应用服务。

FIFO     调度器的优点是,简单易懂,不需要任何配置,但是不适合共享集群。大的应用会占用集群中的所有资源,

所以在队列中的所有应用必须等待知道轮到自己运行。在一个共享集群中,更适合使用容量调度器或者公平调度器。

这两种调度器都允许长时间运行的作业能够及时完成,同时也允许正在进行较小的临时查询的用户能够在合理的

时间内能够及时运行并且得到返回结果。

Capacity Scheduler( 容量调度器 ):

        容量调度器允许多个组织共享一个     Hadoop     集群,每个组织可以分配到全部集群资源的一部分。

每个组织对的应用被分配到一个专门的队列,每个队列被配置为可以使用一定的集群资源。队列可以进一步按层次划分,

这样每个组织内的不同用户能够共享该组织队列所分配的资源。在一个队列内,使用    FIFO     调度策略对应用进行调度。

        单个作业使用的资源不会超过其队列的资源容量。在队列中有多个作业,并且该队列资源不足时,这时如果集群中

仍有可使用资源,容量调度器可能会将空余的资源分配给队列中的作业,哪怕这样做会超出该队列的资源容量。

这也被称为    “d性队列”     ( queue elasticity )。

        正常 *** 作时,容量调度器不会通过强行终止作业来抢占容器(container)。因此,如果一队列一开始资源够用,然后随着程序的运行或是需求的增长,资源开始不够用时,那么合格队列就只能等待其他队列释放容器资源。缓解这种情况的方法是,为队列设置一个最大的容量限制,这样这个队列就不会过多的侵占其他队列资源的容量了。当然,这样做是以牺牲队列d性作为代价的,因此需要不断的尝试和失败中找出一个最合理的配置。

        如果属性 yarn.scheduler.capacity.<queue-path>.user-limit-factor    设置为大于一(默认值)时,

那么一个作业可以使用超过其队列容量的资源。

HDP ( Ambari)    方式搭建的     Hadoop     集群,默认实现为(容量调度器)

Fair Scheduler(公平调度器):

        公平调度器旨在为所有运行的应用公平分配集群资源。接下来解释资源是如何在队列之间公平共享的。

想象两个用户     A    和    B, 分别拥有自己的队列。当     A     启动一个作业,在    B     没有需求是    A     用户

会分配到全部可用资源:当    A     的作业仍在运行是    B     启动一个作业,一段时间后,按照我们先前看到的

方式,每个作业都用到了集群中一般的资源。这时,如果    B     启动第二个作业并且其他作业仍在运行(A作业和B作业),

那么     B     启动的第二个作业将和    B     启动的第一个作业共享资源,也就是说     B     的每个作业占用四分之一的集群资源,

而    A     用户的作业仍然占用一半的集群资源。实现了资源在用户之间的公平共享。

CDH     方式搭建的    Hadoop     集群,默认实现为(公平调度器)

Delay Scheduler  (延迟调度):

        所有的    YARN     调度器都试图以本地请求为重。在一个繁忙的集群上,如果一个应用请求某个节点,

那么极有可能此时有其他容器正在该节点上运行。显而易见的处理是,放宽本地性需求,在同一机架中分配一个容器。

然而,通过时间发现,此时如果等待一小段时间(不超过几秒),能够戏剧性的增加在所请求的节点上分配到一个容器的

机会,从而可以提高集群的效率。这个特性称之为延迟调度。容量调度器和公平调度器都支持延迟调度。

        当使用延迟调度是,调度器不会简单的使用他收到的第一个调度机会,而是等待设定的最大数目的调度机会发生,然后

才放宽本地性限制并接受下一个调度机会。

以上几种调度方式相关的配置不做过多的描述,有兴趣的同学可以查看相关文档。

            


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11322158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存