[Hadoop]-调优篇-Yarn

YARN作为资源调度管理组件,对YARN的的优化主要呈现在CPU和内存两方面

1.内存篇

  在YARN集群中,平衡内存,CPU和磁盘的资源是比较重要的.一般来说,每两个Container使用一块磁盘和一个CPU核可以是使资源得到比较充分的利用

  对YARN而言的内存可用资源,是指在排除操作系统或其它应用程序占用之外剩下的部分,才是可用资源

  可以参考如下表格:

每台机器的内存 系统需要的内存 HBASE需要的内存
4G 1G 1G
8GB 2G 1G
16G 2G 2G
24G 4G 4G
48G 6G 8G
64G 8G 8G
72G 8G 8G
96GB 12GB 16GB
128GB 24GB 24GB
255GB 32GB 32GB
512GB 64GB 64GB

  计算每台机器最多可以拥有多少个Container,可以使用下面的公式:

    containers = min (2*机器CPU核数, 1.8*机器上挂载的磁盘个数, (机器总内存) / MIN_CONTAINER_SIZE)

    说明: MIN_CONTAINER_SIZE是指container最小的容量大小,这需要根据具体情况去设置,可以参考下面的表格  

每台机器可用的内存 Container最小值
小于4GB 256MB
4GB到8GB之间 512MB
8GB到24GB之间 1024MB
大于24GB 2048MB

  根据上面的计算后,YARN和MapReduce的资源最终可以这样设置

配置文件 配置设置 默认值 计算值
yarn-site.xml yarn.nodemanager.resource.memory-mb 8192 MB = containers * RAM-per-container
yarn-site.xml yarn.scheduler.minimum-allocation-mb 1024MB = RAM-per-container
yarn-site.xml yarn.scheduler.maximum-allocation-mb 8192 MB = containers * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb 1536 MB = 2 * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts -Xmx1024m = 0.8 * 2 * RAM-per-container
mapred-site.xml mapreduce.map.memory.mb 1024 MB = RAM-per-container
mapred-site.xml mapreduce.reduce.memory.mb 1024 MB = 2 * RAM-per-container
mapred-site.xml mapreduce.map.java.opts   = 0.8 * RAM-per-container
mapred-site.xml mapreduce.reduce.java.opts   = 0.8 * 2 * RAM-per-container

  举个例子:  一台机器,128G内存、32核CPU的机器,挂载了7个磁盘

         根据上面的图表,系统保留内存为24G,在不使用HBASE的情况下,可以认为YARN的可用资源为104G

         可用资源104G,计算Container最大值为13个 <= min (2*32, 1.8* 7 , (128-24)/2) = min (64, 12.6 , 51) = 13

       每个Container平均内存大小为8G <=max (2, (124-24)/13) = max (2, 8) = 8

       可以支持平均8G,明显有点偏大(浪费)了,既然可以支持到平均8G,那就继续设置,降为2G,这样可以产生的更多的Container

配置文件 配置设置 计算值
yarn-site.xml yarn.nodemanager.resource.memory-mb = 52 * 2 =104 G
yarn-site.xml yarn.scheduler.minimum-allocation-mb = 2G
yarn-site.xml yarn.scheduler.maximum-allocation-mb = 52 * 2 = 104G
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb = 2 * 2=4G
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts = 0.8 * 2 * 2=3.2G
mapred-site.xml mapreduce.map.memory.mb = 2G
mapred-site.xml mapreduce.reduce.memory.mb = 2 * 2=4G
mapred-site.xml mapreduce.map.java.opts = 0.8 * 2=1.6G
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * 2=3.2G

        另外还有几个参数:

          yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1

          yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true

          yarn.nodemanager.vmem-pmem-ratio:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true

          第一个参数的意思是当一个map任务总共分配的物理内存为2G的时候,该任务的container最多内分配的堆内存为1.6G,可以分配的虚拟内存上限为2*2.1=4.2G。

          照这样算下去,每个节点上YARN可以启动的Map数为104/2=52个

2.CPU篇

  相较内存的设置,CPU的要简单的多.因为YARN中引入了一个虚拟CPU的概念,YARN中的核都是指虚拟CPU.它的设计初衷是表述不同的CPU之间的计算能力差异.

  比如一个高性能CPU的计算能力是另一种便宜版的两倍,就可以在高性能这边设置1:2的物理虚拟核比.

  YARN的CPU设置如下:

    yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的虚拟CPU个数,默认是8.

                        注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数

    yarn.scheduler.minimum-allocation-vcores:单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数

    yarn.scheduler.maximum-allocation-vcores:单个任务可申请的最多虚拟CPU个数,默认是32

  这些默认值在实际生产集群中是不合适,生产集群一般都是高核服务器,这里应该以自己的集群重新调试参数.(比如一般的32核服务器,就要设置为31核,留一个操作系统)

3.调度器优化

  详见 YARN调度器篇

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

猜你喜欢

转载自www.cnblogs.com/NightPxy/p/9212430.html
今日推荐