在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調度器負責資源的分配,而NodeManager則負責資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的「資源調度」)後,NodeManager需按照要求爲任務提供相應的資源,甚至保證這些資源應具備獨佔性,爲任務運行提供基礎的保證,這就是所謂的資源隔離。
YARN會管理集羣中全部機器的可用計算資源. 基於這些資源YARN會調度應用
(好比MapReduce)發來的資源請求,而後YARN會經過分配Container來給每一個應用
提供處理能力, Container是YARN中處理能力的基本單元, 是對內存, CPU等的封裝.java

日誌:node

Container [pid=134663,containerID=container_1430287094897_0049_02_067966] is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 1.5 GB of 10 GB virtual memory used. Killing container. Dump of the process-tree for

Error: Java heap space

問題1:Container xxx is running beyond physical memory limits
問題2:java heap spacepython

優化原則

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
101
102
103
104
105
106
107
108
109
--調節參數列表

• Yarn
- nodemanager:
> CPU:yarn.nodemanager.resource.cpu-vcores = 8
> 內存:yarn.nodemanager.resource.memory-mb = 8G
- resourcermanager
> 資源分配儘可能與NodeManager端保持一致

• Map Tasks:
> mapreduce.map.memory.mb=2240 # Container size
> mapreduce.map.java.opts=-Xmx2016m # JVM arguments for a Map task;mapreduce.map.memory.mb*0.85
> mapreduce.map.cpu.vcores=1

• Reduce Tasks:
> mapreduce.reduce.memory.mb=2240 # Container size
> mapreduce.reduce.java.opts=-Xmx2016m # JVM arguments for a Reduce task;mapreduce.map.memory.mb*0.85
> mapreduce.reduce.cpu.vcores=1

• MapReduce Application Master
> yarn.app.mapreduce.am.resource.mb=2240 # Container size
> yarn.app.mapreduce.am.command-opts=-Xmx2016m # JVM arguments for an Application Master
> yarn.app.mapreduce.am.resource.cpu-vcores=1

• Trouble Shooting
> yarn.nodemanager.vmem-pmem-ratio
> yarn.nodemanager.vmem-check-enabled

• Client
> mapreduce.job.reduces = (節點數 * reduce slot數) 的倍數

> mapreduce.client.submit.file.replication

> 編碼
- mapreduce.output.fileoutputformat.compress.codec
- mapreduce.map.output.compress.codec
- mapreduce.output.fileoutputformat.compress.type
* org.apache.hadoop.io.compress.DefaultCodec
* org.apache.hadoop.io.compress.SnappyCodec #最佳選擇
* org.apache.hadoop.io.compress.BZip2Codec / GzipCodec #壓縮比例最高,可是耗時

> io.sort
- mapreduce.task.io.sort.factor
- mapreduce.task.io.sort.mb

> mapreduce.map.sort.spill.percent

> mapreduce.reduce.shuffle.parallelcopies

> Other:io.file.buffer.szie SequenceFiles(目前比較少用,都用rcfile,parquet,orcfile)

--Yarn參數調節,根據實際硬件環境分配,後面有案例
[root@server1 ~]# python yarn-utils.py -c 32 -m 128 -d 11 -k False
Using cores=32 memory=128GB disks=11 hbase=False
Profile: cores=32 memory=106496MB reserved=24GB usableMem=104GB disks=11
Num Container=20
Container Ram=5120MB
Used Ram=100GB
Unused Ram=24GB
yarn.scheduler.minimum-allocation-mb=5120
yarn.scheduler.maximum-allocation-mb=102400
yarn.nodemanager.resource.memory-mb=102400
mapreduce.map.memory.mb=5120
mapreduce.map.java.opts=-Xmx4096m
mapreduce.reduce.memory.mb=5120
mapreduce.reduce.java.opts=-Xmx4096m
yarn.app.mapreduce.am.resource.mb=5120
yarn.app.mapreduce.am.command-opts=-Xmx4096m
mapreduce.task.io.sort.mb=2048

[root@server1 ~]# python yarn-utils.py -c 32 -m 128 -d 11 -k False
Using cores=32 memory=128GB disks=11 hbase=False
Profile: cores=32 memory=106496MB reserved=24GB usableMem=104GB disks=11
Num Container=20
Container Ram=5120MB
Used Ram=100GB
Unused Ram=24GB
yarn.scheduler.minimum-allocation-mb=5120
yarn.scheduler.maximum-allocation-mb=102400
yarn.nodemanager.resource.memory-mb=102400
mapreduce.map.memory.mb=5120
mapreduce.map.java.opts=-Xmx4096m
mapreduce.reduce.memory.mb=5120
mapreduce.reduce.java.opts=-Xmx4096m
yarn.app.mapreduce.am.resource.mb=5120
yarn.app.mapreduce.am.command-opts=-Xmx4096m
mapreduce.task.io.sort.mb=2048

--參數含義:
Option Description
-c CORES The number of cores on each host.
-m MEMORY The amount of memory on each host in GB.
-d DISKS The number of disks on each host.
-k HBASE "True" if HBase is installed, "False" if not.

-- YARN以及MAPREDUCE全部可用的內存資源應該要除去系統運行須要的以及其餘的hadoop的一些程序,總共保留的內存=系統內存+HBASE內存。

服務器總內存 系統須要內存 HBase須要內存
4GB 1GB 1GB
8GB 2GB 1GB
16GB 2GB 2GB
24GB 4GB 4GB
48GB 6GB 8GB
64GB 8GB 8GB
72GB 8GB 8GB
96GB 12GB 16GB
128GB 24GB 24GB
255GB 32GB 32GB
512GB 64GB 64GB

優化前:

yarn.nodemanager.resource.memory-mb
8GB
yarn.nodemanager.resource.cpu-vcores
32coreapache

pre Mapper 
CPU:1   [mapreduce.map.cpu.vcores ]
MEM:1G  [mapreduce.map.memory.mb ]
===> 8 map slot / node

pre Reducer
CPU:1   [mapreduce.reduce.cpu.vcores]
MEM:1G  [mapreduce.reduce.memory.mb]
===> 8 reduce slot / node 【有8G內存,實際有CPU 32個,因此只能啓動8個reduce在每一個node上】
  • map slot / reduce slot 由nodemanager的內存/CPU core上限與客戶
    端設置的單mapper, reducer內存/CPU使用值決定
  • heapsize( java.opts中的-Xmx)應根據單mapper, reducer內存進
    行調整,而與slot個數無關 => heapsize不能大於memory.mb值,一
    般設置爲memory.mb的85%左右

OOM

•內存、Heap
須要設置:
-內存:mapreduce.map.memory.mb
–Heap Size:-Xmx在mapreduce.map.java.opts作相同調整
–內存:mapreduce.reduce.memory.mb
–Heap Size:-Xmx在mapreduce.reduce.java.opts作相同調整服務器

Container 超過了虛擬內存的使用限制

– Container XXX is running beyond virtual memory limits
• NodeManager端設置,相似系統層面的overcommit問題
–yarn.nodemanager.vmem-pmem-ratio 【默認2.1,咱們的作法呢【物理內存和虛擬內存比率】值爲了15,yarn-site.xml中修改】併發

<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>10</value>
    </property>
–或者yarn.nodemanager.vmem-check-enabled,false掉 
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

調優後:

mapreduce.map.java.opts, mapreduce.map.java.opts.max.heap=1.6G
mapreduce.reduce.java.opts,mapreduce.reduce.java.opts.max.heap=3.3G
注意上面兩個參數和下面的mapper,reducer的內存有關係,是下面mem的0.85倍!app

yarn.nodemanager.resource.memory-mb=32GB
yarn.nodemanager.resource.cpu-vcores=32coreoop

pre Mapper 
CPU:2   [mapreduce.map.cpu.vcores ]
MEM:2G  [mapreduce.map.memory.mb ]
===> 16 map slot / node

pre Reducer
CPU:4   [mapreduce.reduce.cpu.vcores]
MEM:4G  [mapreduce.reduce.memory.mb]
==> 8 reduce slot / node

shuffle.parallelcopies如何計算?

(reduce.shuffle並行執行的副本數,最大線程數–sqrt(節點數 map slot數) 與 (節點數 map slot數)/2 之間 ==>結果:{12-72}
mapreduce.reduce.shuffle.parallelcopies=68

1
2
3
4
5
`排序文件時要合併的流的數量。也就是說,在 reducer 端合併排序期間要使用的排序頭
數量。此設置決定打開文件句柄數。並行合併更多文件可減小合併排序迭代次數並經過消
除磁盤 I/O 提升運行時間。注意:並行合併更多文件會使用更多的內存。如 'io.sort.
factor' 設置過高或最大 JVM 堆棧設置過低,會產生過多地垃圾回收。Hadoop 默認值爲
10,但 Cloudera 建議使用更高值。將是生成的客戶端配置的一部分。`

mapreduce.task.io.sort.factor=64

xml配置
yarn.nodemanager.vmem-pmem-ratio=10 # yarn-site.xml 的 YARN 客戶端高級配置
mapreduce.task.timeout=1800000

impala調優

Impala 暫存目錄:須要注意此目錄磁盤空間問題!最好在單獨的一個掛載點!

一、內存

-服務器端(impalad)
Mem:default_query_options MEM_LIMIT=128g

二、併發查詢

queue
    .queue_wait_timeout_ms默認只有60s
       - queue_wait_timeout_ms=600000
    .default pool設置

三、資源管理

-Dynamic Resource Pools
    .併發控制:max running queries

四、yarn資源隔離

http://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html

參考:http://www.itweet.cn