YARN生产上的优化

1.yarn生产上的资源管理(至关重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
	 假设一台机器:48物理内存  8个core-->16个vcore
Linux本身要占用内存+空留:20%=9.6个G(空留是根据实际机器的内存来决定的,如果内存大,可以考虑空留15%)
剩余:80%=38.4G=38G
DN进程:生产上4G
如何修改DN的内存配置信息:进入hadoop-env.sh脚本,
HADOOP_NAMENODE_OPTS=-Xmx1024m
HADOOP_DATANODE_OPTS=-Xmx1024m (在前面追加,如下图所示)
NM进程:生产上4G
如何修改NM的内存配置信息:进入yarn-env.sh脚本,
export YARN_RESOURCEMANAGER_HEAPSIZE=1024
export YARN_NODEMANAGER_HEAPSIZE=1024
DN和NM部署在同一台机器上是为了:数据本地化
NN RM 经常性部署同一台 说白了 集群节点少
(正常情况下,DataNode进程和NodeManager进程部署在同一台机器: 数据本地化
比如:在NM上运行task任务,task任务需要数据,数据是放在当前机器的hdfs上面的,发现当前
有DataNode进程,节点上有需要的数据,那就只需要从当前节点拿数据就行了。但是如果发现当
前机器上没有数据,要去另外的机器上拿数据,那就会通过网络,这时候会网络消耗,计算就会
变慢了。)

资源内存: 38G-4-4=30G(这30G是做什么?就是运行container容器)
yarn.nodemanager.resource.memory-mb 30*1024MB(这是总的大小)
默认配置
yarn.scheduler.minimum-allocation-mb 1024 (最小可分配容器的大小)
yarn.scheduler.maximum-allocation-mb 8192 (最大可分配容器的大小)
(分配的容器的大小就是根据上面的参数来进行分配的)
30G 30G/1G=30个container
30G 30/8=3个container ...6G (还留有6个G的内存被浪费掉)
30个~3个(这样是不合理的)

生产一:
yarn.nodemanager.resource.memory-mb 30*1024MB
yarn.scheduler.minimum-allocation-mb 2G
yarn.scheduler.maximum-allocation-mb 30G
15个~1个
(这个是大作业的情况。要看每个公司的作业情况,如果作业特别大的情况,就设成和总的一样
大)
(容器最小2G,就是这台机器最多可以运行15个容器,容器最大30G,就是这台机器最多可以运行1
个容器。那这台机器可以运行1-15个容器。
当你去请求资源的时候,它先给你分配一个最小的值,比如说2G,然后你如果不够,给你加比如
说1G,直到加到最大比如说30G。(这个是有参数可以去配置的,在hadoop官网没有,在cdh官网
是可以找到的)


生产二:
yarn.nodemanager.resource.memory-mb 32G(可以将预留空间再缩小一点,这样留给container容器的空间会大一点)(这个由30G调整到32G,就需要从预留的20%里面
拿出2G出来。这样32/8=4个容器,可以整除,不会浪费了)

yarn.scheduler.minimum-allocation-mb 2G
yarn.scheduler.maximum-allocation-mb 8G
16个~4个

生产三:
如果物理机的内存是256G:(我们预留的空间可以按15%来算)

yarn.nodemanager.resource.memory-mb 168G
yarn.scheduler.minimum-allocation-mb 4G
yarn.scheduler.maximum-allocation-mb 24G
16个~4个

再生产中很容易遇到这样一种情况:container p memory oom :(意思是你的最大connertion内存不够用)
遇到这种情况,我们首先先把这任务kill掉,然受修改参数,将分配的内存调大一些。

生产默认 不做修改
yarn.nodemanager.pmem-check-enabled true (表示如果 container tast任务超过内存 就会 kill 掉进程,
检查容器内存,一个是物理内存,一个是虚拟内存,虚拟内存是物理内存的
2倍,哪个超了都会被kill 掉)
yarn.nodemanager.vmem-check-enabled true
yarn.nodemanager.vmem-pmem-ratio 2.1
物理内存 1m 虚拟内存 2.1m

新版本参数
yarn.nodemanager.resource.pcores-vcores-multiplier 1 (老的是2,现在是1,需要手动把它修改成2)


yarn.nodemanager.resource.memory-mb
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
这些参数的需要看官网里的默认配置yarn-default.xml。
比如:yarn.nodemanager.resource.memory-mb如果设置成-1:
Amount of physical memory, in MB, that can be allocated for containers. If set to -1and yarn.nodemanager.resource.detect-hardware-capabilities is true, it is automatically calculated(in case of Windows and Linux). In other cases, the default
is 8192MB.
yarn.nodemanager.resource.detect-hardware-capabilities:Enable auto-detection of nodecapabilities such as memory and CPU.(默认是false)


CPU:
yarn.nodemanager.resource.cpu-vcores 12(一般vcore是16个,但是我们还要分给其他进程。)
yarn.scheduler.minimum-allocation-vcores 1
yarn.scheduler.maximum-allocation-vcores 4

container: 2G 3c
container:
memory 16c~4c
vcores 12c~3c


> 生产调优的重点:
> 在生产中,运行task时所需要的资源需要由内存和vcore共同来决定,它俩时相互影响的,如果vcore
> 最小的只有3个crontainer,那么memory也只能分到3个crontainer,那么3*8=24G,还余6个G
> 的内存就会被浪费掉,所以yarn生产调优 需要计算好内存和vcore 的之间的数据。如果vore分给
> 它16个,那么vcore就可以分成16个~4个crontainer容易,最大利用了资源。

详细可以参考 博客 :http://blog.itpub.net/30089851/viewspace-2127851/
在这里插入图片描述
在这里插入图片描述

本文标题:YARN生产上的优化

文章作者:skygzx

发布时间:2019年04月07日 - 11:58

最后更新:2019年04月07日 - 19:44

原始链接:http://yoursite.com/2019/04/07/YARN生产上的优化/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%