Yarn最佳实践

来源:互联网 发布:类似于上瘾的网络剧 编辑:程序博客网 时间:2024/04/28 13:51

Yarn最佳实践

转载:http://blog.csdn.net/jiangshouzhuang/article/details/52595781

本篇博客,我将讨论Yarn资源管理方面的最佳实践,如果有写的不对的地方,请朋友们多多指教。本篇文章也参考了网上的一些资料。

 

Hadoop2中引入Yarn组件,将MRv2(Yarn)分为两个主要组件,一个是资源管理,一个是作业调度和监控,并且使用独立的守护进程,全局的ResourceManager(RM)以及每个应用程序的ApplicationMaster(AM)。

 

ResourceManager(RM)和NodeManager(NM)组成了数据计算框架。ResourceManager在系统的应用之间调节资源使用。

 

下面先看一下Yarn的体系架构,如图所示:

具体Yarn的详细介绍,请访问

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html查看。

 

下面将介绍的内容如下:

1.      如何计算和分配资源多少资源给Yarn

2.      Yarn中分配的最小和最大分配的单元

3.      虚拟和物理内存检查

4.      Mapper,Reducer和AM的资源请求

5.      资源的瓶颈

 

1.      如何计算和分配资源多少资源给Yarn

Yarn能够管理3类系统资源,包括Memory,CPU和Disks。可以通过设置环境变量YARN_NODEMANAGER_OPTS来启动NM。

比如,我们可以在NodeManager节点上查询strings /proc/<pid_for_NM>/environ。

environ的值能够被yarn-site.xml中配置如下参数覆盖:

yarn.nodemanager.resource.memory-mb

yarn.nodemanager.resource.cpu-vcores

 

我们可以通过查看RM的UI来查询各个NodeManager 节点的资源情况,比如“Mem Avail”,“VCores Avail”:

 

如果内存过多地分配给Yarn,huge swap可能被使用并且内核OOM killer可能被触发去杀掉Container进程。

os::commit_memory(0x0000000000000000,xxxxxxxxx, 0) failed;

error=’Cannot allocate memory’ (errno=12)

 

2.      Yarn中分配的最小和最大分配的单元

在yarn-site.xml中有配置Yarn使用内存的最小值和最大值。

配置项

默认值

yarn.scheduler.minimum-allocation-mb

1024

yarn.scheduler.maximum-allocation-mb

8192

yarn.scheduler.minimum-allocation-vcores

1

yarn.scheduler.maximum-allocation-vcores

32

根据上面默认的配置,意味着RM只能分配给container的内存大于

yarn.scheduler.minimum-allocation-mb,但是大小不能超过

yarn.scheduler.maximum-allocation-mb的值。

RM分配给container的CPU也要满足最小和最大值的条件。

如果修改了上面的配置项的值,需要重启RM。

 

下面我们举个例子,如果一个job的每个map container(mapreduce.map.memory.mb=1025)需要1025MB内存,RM将分配一个2048MB(2*yarn.scheduler.minimum-allocation-mb)的container。

 

如果你有一个非常大的MR job,比如它需要9999MB map container,那么这个job将被终止,相关的AM日志信息如下:

MAP capability required is more than the supported maxcontainer capability in the cluster.

Killing the Job. mapResourceRequest: 9999maxContainerCapability:8192

 

如果是一个Spark on Yarn的job请求的内存超过yarn.scheduler.maximum-allocation-mb大小,相关的错误如下:

Exception inthread "main" Java.lang.IllegalArgumentException:

Required executor memory (9999+6886 MB) is above the maxthreshold (8192 MB) of this cluster!

 

如果你遇到上面的两种情况,可以增加yarn.scheduler.maximum-allocation-mb的值,并重启RM。

 

3.      虚拟和物理内存检查

NodeManager能够监控container的内存利用率(虚拟和物理内存)。如果它的虚拟内存超过“yarn.nodemanager.vmem-pmem-ratio* mapreduce.reduce.memory.mb或者mapreduce.map.memory.mb”的值,

同时设置“yarn.nodemanager.vmem-check-enabled”的值为true的话,那么此container将会被终止。

 

如果它的物理内存超过“mapreduce.reduce.memory.mb”或“mapreduce.map.memory.mb”大小,此container将会被终止,前提是设置“yarn.nodemanager.pmem-check-enabled”的值为true。

 

可以通过在yarn-site.xml中设置如下的值来覆盖默认值:

配置项

默认值

yarn.nodemanager.vmem-check-enabled

false

yarn.nodemanager.pmem-check-enabled

true

yarn.nodemanager.vmem-pmem-ratio

2.1

 

如果因为虚拟内存问题的话,错误日志可能为:

Current usage:347.3 MB of 1 GB physical memory used;

2.2 GB of 2.1 GB virtual memory used. Killing container.

 

如果是物理内存问题的话,错误日志可能为:

Current usage:2.1GB of 2.0GB physical memory used;

1.1GB of 3.15GB virtual memory used. Killing container.

 

 

4.      Mapper,Reducer和AM的资源请求

MapReduce v2的job有3中不同的container类型,Mapper,Reducer和AM。

Mapper和Reducer能够请求资源有内存、CPU和disk。而AM仅仅能够请求内存和CPU。

下面为这三种container类型的相关配置:

Mapper:

mapred-default.xml的配置项

mapreduce.map.memory.mb

1024

mapreduce.map.java.opts

-Xmx900m

mapreduce.map.cpu.vcores

1

 

Reducer:

mapred-default.xml的配置项

mapreduce.reduce.memory.mb

3072

mapreduce.reduce.java.opts

-Xmx2560m

mapreduce.reduce.cpu.vcores

1

 

AM:

mapred-default.xml的配置项

yarn.app.mapreduce.am.resource.mb

1536

yarn.app.mapreduce.am.command-opts

-Xmx1024m

yarn.app.mapreduce.am.resource.cpu-vcores

1

 

 

每个container实际上是一个JVM进程,上面配置项的java-opts的-Xmx值是分配的内存大小。一个最好的实践做法是设置其大小为0.8 * (container内存分配的大小)。比如,mapper的container大小为mapreduce.map.memory.mb=4096,那么我们可以设置mapreduce.map.java.opts=-Xmx3277m。

 

其实有很多因素会影响每个container的内存需求,包括Mappers/Reducers数量,文件类型(Text,Parquet,ORC),数据压缩算法,操作类型(sort,group by,aggregation,join),数据倾斜等。

 

另外,需要指定每个container的最小内存需求,有时我们需要平衡job性能和资源容量。例如,有些jobs排序时需要一个相对大的mapreduce.task.io.sort.mb值,为了避免或减少spill文件的数量。如果整个系统有足够的内存容量,那么我们可以同时增加mapreduce.task.io.sort.mb和container内存的值以获取更好的job性能。

 

 

 

5.      资源的瓶颈

既然这里存在三种类型的资源,不同jobs的containers对资源的需求也不一样,所以可能会导致一种资源的瓶颈问题。假如我们的集群环境为1000GB RAM,16 Cores,16disks,并且每一个container需要10GB RAM,1 core,0.5 disks,那么最多可以并行运行10个Mappers,因为这里CPU成为瓶颈。


0 0