Hadoop系列文章目錄
1、hadoop3.1.4簡單介紹及部署、簡單驗(yàn)證
2、HDFS操作 - shell客戶端
3、HDFS的使用(讀寫、上傳、下載、遍歷、查找文件、整個(gè)目錄拷貝、只拷貝文件、列出文件夾下文件、刪除文件及目錄、獲取文件及文件夾屬性等)-java
4、HDFS-java操作類HDFSUtil及junit測(cè)試(HDFS的常見操作以及HA環(huán)境的配置)
5、HDFS API的RESTful風(fēng)格–WebHDFS
6、HDFS的HttpFS-代理服務(wù)
7、大數(shù)據(jù)中常見的文件存儲(chǔ)格式以及hadoop中支持的壓縮算法
8、HDFS內(nèi)存存儲(chǔ)策略支持和“冷熱溫”存儲(chǔ)
9、hadoop高可用HA集群部署及三種方式驗(yàn)證
10、HDFS小文件解決方案–Archive
11、hadoop環(huán)境下的Sequence File的讀寫與合并
12、HDFS Trash垃圾桶回收介紹與示例
13、HDFS Snapshot快照
14、HDFS 透明加密KMS
15、MapReduce介紹及wordcount
16、MapReduce的基本用法示例-自定義序列化、排序、分區(qū)、分組和topN
17、MapReduce的分區(qū)Partition介紹
18、MapReduce的計(jì)數(shù)器與通過MapReduce讀取/寫入數(shù)據(jù)庫示例
19、Join操作map side join 和 reduce side join
20、MapReduce 工作流介紹
21、MapReduce讀寫SequenceFile、MapFile、ORCFile和ParquetFile文件
22、MapReduce使用Gzip壓縮、Snappy壓縮和Lzo壓縮算法寫文件和讀取相應(yīng)的文件
23、hadoop集群中yarn運(yùn)行mapreduce的內(nèi)存、CPU分配調(diào)度計(jì)算與優(yōu)化
本文介紹在hadoop集群中,不適用默認(rèn)的參數(shù)情況下,yarn的cpu和內(nèi)容配置。
本文依賴是hadoop集群正常運(yùn)行。
本文分為3個(gè)部分,即概述、cpu和內(nèi)存配置。
一、概述
- hadoop yarn支持內(nèi)存與CPU兩種資源的調(diào)度方式。
- YARN作為一個(gè)資源調(diào)度器,應(yīng)該考慮到集群里面每一臺(tái)機(jī)子的計(jì)算資源,然后根據(jù)application申請(qǐng)的資源進(jìn)行分配Container。
- Container是YARN里面資源分配的基本單位,具有一定的內(nèi)存以及CPU資源。
在YARN集群中,平衡內(nèi)存、CPU、磁盤的資源的很重要的,根據(jù)經(jīng)驗(yàn),每兩個(gè)container使用一塊磁盤以及一個(gè)CPU核的時(shí)候可以使集群的資源得到一個(gè)比較好的利用。
- 主要涉及參數(shù)有
yarn.nodemanager.resource.memory-mb
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.app.mapreduce.am.resource.mb
yarn.app.mapreduce.am.command-opts
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
mapreduce.map.java.opts
mapreduce.reduce.java.opts
二、內(nèi)存分配計(jì)算
本文介紹2種配置方式,即通過已知的硬件資源進(jìn)行人工計(jì)算和由輔助工具進(jìn)行計(jì)算。需要說明的是,該計(jì)算僅是方向性的計(jì)算,可以確保不出現(xiàn)大資源浪費(fèi)或因配置不當(dāng)導(dǎo)致環(huán)境不可用情況。即便本文的2種配置方式,結(jié)果還是不同的。
此處計(jì)算的就是根據(jù)已有的硬件配置(即cpu核心數(shù)、磁盤個(gè)數(shù)、內(nèi)存數(shù))計(jì)算該環(huán)境中有多少contaiers和每個(gè)contaier有多少內(nèi)存。
1、人工計(jì)算
關(guān)于 內(nèi)存 相關(guān)的配置可以參考hortonwork公司的文檔 Determine HDP Memory Configuration Settings 來配置集群。
YARN以及MAPREDUCE所有可用的內(nèi)存資源應(yīng)該要除去操作系統(tǒng)運(yùn)行需要的以及其他的hadoop的一些程序需要的,總共剩余的內(nèi)存=操作系統(tǒng)內(nèi)存+HBASE內(nèi)存。
可以參考下面的表格確定應(yīng)該保留的內(nèi)存:
計(jì)算每臺(tái)機(jī)子最多可以擁有多少個(gè)container,可以使用下面的公式:
containers = min ( 2CORES, 1.8DISKS, Total available RAM / MIN_CONTAINER_SIZE)
說明:
- CORES:機(jī)器CPU核數(shù)
- DISKS:機(jī)器上掛載的磁盤個(gè)數(shù)
- Total available RAM :每節(jié)點(diǎn)可用內(nèi)存,即減去操作系統(tǒng)和hbase需要的內(nèi)存所剩余的內(nèi)存
- MIN_CONTAINER_SIZE:指container最小的容量大小,這需要根據(jù)具體情況去設(shè)置,可以參考下面的表格。不過需要保持單位一致,即用MB或GB進(jìn)行計(jì)算。
每個(gè)container的平均使用內(nèi)存大小計(jì)算方式為:
RAM-per-container = max (MIN_CONTAINER_SIZE, Total Available RAM / containers )
通過上面的計(jì)算,YARN以及MAPREDUCE可以這樣配置:
示例:
每個(gè)節(jié)點(diǎn)128G內(nèi)存、32核CPU的機(jī)器,掛載了7個(gè)磁盤
根據(jù)上面的說明,操作系統(tǒng)保留內(nèi)存為24G,不使用HBase情況下,系統(tǒng)剩余可用內(nèi)存(Total available RAM)為104G=128G-24G
2、輔助計(jì)算
該處的計(jì)算結(jié)果與上文中的人工計(jì)算數(shù)據(jù)有差異,但總體方向上是一致的。
用法: python hdp-configuration-utils.py -c 16 -m 64 -d 4 -k True
參數(shù)說明
-c CORES 節(jié)點(diǎn)CPU核心數(shù).
-m MEMORY 節(jié)點(diǎn)總內(nèi)存G.
-d DISKS 節(jié)點(diǎn)磁盤數(shù)
-k HBASE 集群內(nèi)有安裝Hbase則參數(shù)"True" ,否則"False"
hdp-configuration-utils.py 源碼如下:
#!/usr/bin/env python
'''
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
###########################################################################################
#
# 用法: python hdp-configuration-utils.py -c 16 -m 64 -d 4 -k True
#
# -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.
#
# https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/bk_installing_manually_book/content/determine-hdp-memory-config.html
#
###########################################################################################
import optparse
from pprint import pprint
import logging
import sys
import math
import ast
''' Reserved for OS + DN + NM, Map: Memory => Reservation '''
reservedStack = { 4:1, 8:2, 16:2, 24:4, 48:6, 64:8, 72:8, 96:12, 128:24, 256:32, 512:64}
''' Reserved for HBase. Map: Memory => Reservation '''
reservedHBase = {4:1, 8:1, 16:2, 24:4, 48:8, 64:8, 72:8, 96:16, 128:24, 256:32, 512:64}
GB = 1024
def getMinContainerSize(memory):
if (memory <= 4):
return 256
elif (memory <= 8):
return 512
elif (memory <= 24):
return 1024
else:
return 2048
pass
def getReservedStackMemory(memory):
if (memory in reservedStack ):
return reservedStack[memory]
if (memory <= 4):
ret = 1
elif (memory >= 512):
ret = 64
else:
ret = 1
return ret
def getReservedHBaseMem(memory):
if (memory in reservedHBase):
return reservedHBase[memory]
if (memory <= 4):
ret = 1
elif (memory >= 512):
ret = 64
else:
ret = 2
return ret
def main():
log = logging.getLogger(__name__)
out_hdlr = logging.StreamHandler(sys.stdout)
out_hdlr.setFormatter(logging.Formatter(' %(message)s'))
out_hdlr.setLevel(logging.INFO)
log.addHandler(out_hdlr)
log.setLevel(logging.INFO)
parser = optparse.OptionParser()
memory = 0
cores = 0
disks = 0
hbaseEnabled = True
parser.add_option('-c', '--cores', default = 16, help = 'Number of cores on each host')
parser.add_option('-m', '--memory', default = 64, help = 'Amount of Memory on each host in GB')
parser.add_option('-d', '--disks', default = 4, help = 'Number of disks on each host')
parser.add_option('-k', '--hbase', default = "True", help = 'True if HBase is installed, False is not')
(options, args) = parser.parse_args()
cores = int (options.cores)
memory = int (options.memory)
disks = int (options.disks)
hbaseEnabled = ast.literal_eval(options.hbase)
log.info("Using cores=" + str(cores) + " memory=" + str(memory) + "GB" + " disks=" + str(disks) + " hbase=" + str(hbaseEnabled))
minContainerSize = getMinContainerSize(memory)
reservedStackMemory = getReservedStackMemory(memory)
reservedHBaseMemory = 0
if (hbaseEnabled):
reservedHBaseMemory = getReservedHBaseMem(memory)
reservedMem = reservedStackMemory + reservedHBaseMemory
usableMem = memory - reservedMem
memory -= (reservedMem)
if (memory < 2):
memory = 2
reservedMem = max(0, memory - reservedMem)
memory *= GB
containers = int (min(2 * cores,min(math.ceil(1.8 * float(disks)), memory/minContainerSize)))
if (containers <= 2):
containers = 3
log.info("Profile: cores=" + str(cores) + " memory=" + str(memory) + "MB" + " reserved=" + str(reservedMem) + "GB" + " usableMem=" + str(usableMem) + "GB" + " disks=" + str(disks))
container_ram = abs(memory/containers)
if (container_ram > GB):
container_ram = int(math.floor(container_ram / 512)) * 512
log.info("Num Container=" + str(containers))
log.info("Container Ram=" + str(container_ram) + "MB")
log.info("Used Ram=" + str(int (containers*container_ram/float(GB))) + "GB")
log.info("Unused Ram=" + str(reservedMem) + "GB")
log.info("yarn.scheduler.minimum-allocation-mb=" + str(container_ram))
log.info("yarn.scheduler.maximum-allocation-mb=" + str(containers*container_ram))
log.info("yarn.nodemanager.resource.memory-mb=" + str(containers*container_ram))
map_memory = container_ram
reduce_memory = 2*container_ram if (container_ram <= 2048) else container_ram
am_memory = max(map_memory, reduce_memory)
log.info("mapreduce.map.memory.mb=" + str(map_memory))
log.info("mapreduce.map.java.opts=-Xmx" + str(int(0.8 * map_memory)) +"m")
log.info("mapreduce.reduce.memory.mb=" + str(reduce_memory))
log.info("mapreduce.reduce.java.opts=-Xmx" + str(int(0.8 * reduce_memory)) + "m")
log.info("yarn.app.mapreduce.am.resource.mb=" + str(am_memory))
log.info("yarn.app.mapreduce.am.command-opts=-Xmx" + str(int(0.8*am_memory)) + "m")
log.info("mapreduce.task.io.sort.mb=" + str(int(0.4 * map_memory)))
pass
if __name__ == '__main__':
try:
main()
except(KeyboardInterrupt, EOFError):
print("\nAborting ... Keyboard Interrupt.")
sys.exit(1)
使用腳本 hdp-configuration-utils.py 來計(jì)算上面的值,具體如下(下面是針對(duì)真實(shí)的hadoop集群環(huán)境來計(jì)算的,與上文中的人工計(jì)算可能有些不同)
#查看核心數(shù)
[alanchan@server4 bigdata]$ cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id"
model name : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
model name : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
model name : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
model name : Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
physical id : 0
physical id : 0
physical id : 1
physical id : 1
#查看內(nèi)存大小
[alanchan@server4 bigdata]$ cat /proc/meminfo |grep MemTotal
MemTotal: 16333852 kB
#
[root@server4 ~]# fdisk -l |grep Disk
Disk /dev/sda: 327.5 GB, 327491256320 bytes
Disk identifier: 0x00011340
Disk /dev/mapper/VolGroup-lv_root: 318.5 GB, 318523834368 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-lv_swap: 8438 MB, 8438939648 bytes
Disk identifier: 0x00000000
uname -a # 查看內(nèi)核/操作系統(tǒng)/CPU信息的linux系統(tǒng)信息命令
head -n 1 /etc/issue # 查看操作系統(tǒng)版本,是數(shù)字1不是字母L
cat /proc/cpuinfo # 查看CPU信息的linux系統(tǒng)信息命令
hostname # 查看計(jì)算機(jī)名的linux系統(tǒng)信息命令
lspci -tv # 列出所有PCI設(shè)備
lsusb -tv # 列出所有USB設(shè)備的linux系統(tǒng)信息命令
lsmod # 列出加載的內(nèi)核模塊
env # 查看環(huán)境變量資源
free -m # 查看內(nèi)存使用量和交換區(qū)使用量
df -h # 查看各分區(qū)使用情況
du -sh # 查看指定目錄的大小
grep MemTotal /proc/meminfo # 查看內(nèi)存總量
grep MemFree /proc/meminfo # 查看空閑內(nèi)存量
uptime # 查看系統(tǒng)運(yùn)行時(shí)間、用戶數(shù)、負(fù)載
cat /proc/loadavg # 查看系統(tǒng)負(fù)載磁盤和分區(qū)
mount | column -t # 查看掛接的分區(qū)狀態(tài)
fdisk -l # 查看所有分區(qū)
swapon -s # 查看所有交換分區(qū)
hdparm -i /dev/hda # 查看磁盤參數(shù)(僅適用于IDE設(shè)備)
dmesg | grep IDE # 查看啟動(dòng)時(shí)IDE設(shè)備檢測(cè)狀況網(wǎng)絡(luò)
ifconfig # 查看所有網(wǎng)絡(luò)接口的屬性
iptables -L # 查看防火墻設(shè)置
route -n # 查看路由表
netstat -lntp # 查看所有監(jiān)聽端口
netstat -antp # 查看所有已經(jīng)建立的連接
netstat -s # 查看網(wǎng)絡(luò)統(tǒng)計(jì)信息進(jìn)程
ps -ef # 查看所有進(jìn)程
top # 實(shí)時(shí)顯示進(jìn)程狀態(tài)用戶
w # 查看活動(dòng)用戶
id # 查看指定用戶信息
last # 查看用戶登錄日志
cut -d: -f1 /etc/passwd # 查看系統(tǒng)所有用戶
cut -d: -f1 /etc/group # 查看系統(tǒng)所有組
crontab -l # 查看當(dāng)前用戶的計(jì)劃任務(wù)服務(wù)
chkconfig –list # 列出所有系統(tǒng)服務(wù)
chkconfig –list | grep on # 列出所有啟動(dòng)的系統(tǒng)服務(wù)程序
rpm -qa # 查看所有安裝的軟件包
cat /proc/cpuinfo :查看CPU相關(guān)參數(shù)的linux系統(tǒng)命令
cat /proc/partitions :查看linux硬盤和分區(qū)信息的系統(tǒng)信息命令
cat /proc/meminfo :查看linux系統(tǒng)內(nèi)存信息的linux系統(tǒng)命令
cat /proc/version :查看版本,類似uname -r
cat /proc/ioports :查看設(shè)備io端口
cat /proc/interrupts :查看中斷
cat /proc/pci :查看pci設(shè)備的信息
cat /proc/swaps :查看所有swap分區(qū)的信息
yarn_utils.py -c 4 -m 16 -d 1 =k False
[alanchan@server4 bigdata]$ python -V
Python 3.6.11
[alanchan@server4 bigdata]$ python /usr/local/bigdata/hdp-configuration-utils.py -c 4 -m 16 -d 1 -k False
Using cores=4 memory=16GB disks=1 hbase=True
Profile: cores=4 memory=16384MB reserved=0GB usableMem=16GB disks=1
Num Container=3
Container Ram=5120MB
Used Ram=15GB
Unused Ram=0GB
yarn.scheduler.minimum-allocation-mb=5120
yarn.scheduler.maximum-allocation-mb=15360
yarn.nodemanager.resource.memory-mb=15360
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
3、修改hadoop配置
1)、yarn-site.xml
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>15360</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>5120</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>15360</value>
</property>
2)、mapred-site.xml
<property>
<name>mapreduce.map.memory.mb</name>
<value>5120</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>5120</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx4096m</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>5120</value>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx4096m</value>
</property>
<!-- This is commented out so that it won't override mapred.child.java.opts.
<property>
<name>mapreduce.map.java.opts</name>
<value></value>
<description>Java opts only for the child processes that are maps. If set,
this will be used instead of mapred.child.java.opts. If -Xmx is not set,
it is inferred from mapreduce.map.memory.mb and
mapreduce.job.heap.memory-mb.ratio.
</description>
</property>
-->
<!-- This is commented out so that it won't override mapred.child.java.opts.
<property>
<name>mapreduce.reduce.java.opts</name>
<value></value>
<description>Java opts only for the child processes that are reduces. If set,
this will be used instead of mapred.child.java.opts. If -Xmx is not set,
it is inferred from mapreduce.reduce.memory.mb and
mapreduce.job.heap.memory-mb.ratio.
</description>
</property>
-->
3)、其他參數(shù)配置
- yarn.nodemanager.vmem-pmem-ratio
任務(wù)每使用1MB物理內(nèi)存,最多可使用虛擬內(nèi)存量,默認(rèn)是2.1。當(dāng)一個(gè)map任務(wù)總共分配的物理內(nèi)存為8G的時(shí)候,該任務(wù)的container最多內(nèi)分配的堆內(nèi)存為6.4G,可以分配的虛擬內(nèi)存上限為8*2.1=16.8G。另外,照這樣算下去,每個(gè)節(jié)點(diǎn)上YARN可以啟動(dòng)的Map數(shù)為104/8=13個(gè),似乎偏少了,這主要是和我們掛載的磁盤數(shù)太少了有關(guān),人為的調(diào)整 RAM-per-container 的值為4G或者更小的一個(gè)值是否更合理呢?當(dāng)然,這個(gè)要監(jiān)控集群實(shí)際運(yùn)行情況來決定了。 - yarn.nodemanager.pmem-check-enabled
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的物理內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true。 - yarn.nodemanager.vmem-pmem-ratio
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的虛擬內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true。
<property>
<description>Ratio between virtual memory to physical memory when
setting memory limits for containers. Container allocations are
expressed in terms of physical memory, and virtual memory usage
is allowed to exceed this allocation by this ratio.
</description>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
完成以上配置后,需要將配置文件復(fù)制到hadoop集群上所有的機(jī)器上,并重啟集群。
三、CPU分配計(jì)算
YARN中目前的CPU被劃分成虛擬CPU(CPU virtual Core),這里的虛擬CPU是YARN自己引入的概念,考慮到不同節(jié)點(diǎn)的CPU性能可能不同,每個(gè)CPU具有的計(jì)算能力也是不一樣的,比如某個(gè)物理CPU的計(jì)算能力可能是另外一個(gè)物理CPU的2倍,這時(shí)候,你可以通過為第一個(gè)物理CPU多配置幾個(gè)虛擬CPU彌補(bǔ)這種差異。用戶提交作業(yè)時(shí),可以指定每個(gè)任務(wù)需要的虛擬CPU個(gè)數(shù)。
在YARN中,CPU相關(guān)配置參數(shù)如下:
- yarn.nodemanager.resource.cpu-vcores
表示該節(jié)點(diǎn)上YARN可使用的虛擬CPU個(gè)數(shù),默認(rèn)是8,注意,目前推薦將該值設(shè)值為與物理CPU核數(shù)數(shù)目相同。如果你的節(jié)點(diǎn)CPU核數(shù)不夠8個(gè),則需要調(diào)減小這個(gè)值,而YARN不會(huì)智能的探測(cè)節(jié)點(diǎn)的物理CPU總數(shù)。 - yarn.scheduler.minimum-allocation-vcores
單個(gè)任務(wù)可申請(qǐng)的最小虛擬CPU個(gè)數(shù),默認(rèn)是1,如果一個(gè)任務(wù)申請(qǐng)的CPU個(gè)數(shù)少于該數(shù),則該對(duì)應(yīng)的值改為這個(gè)數(shù)。 - yarn.scheduler.maximum-allocation-vcores
單個(gè)任務(wù)可申請(qǐng)的最多虛擬CPU個(gè)數(shù),默認(rèn)是32。
對(duì)于一個(gè)CPU核數(shù)較多的集群來說,上面的默認(rèn)配置顯然是不合適的,在測(cè)試集群中,4個(gè)節(jié)點(diǎn)每個(gè)機(jī)器CPU核數(shù)為4,可以配置為
# yarn-site.xml
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>128</value>
</property>
四、其他優(yōu)化
1、Map階段
- 增大環(huán)形緩沖區(qū)大小。由100m擴(kuò)大到200m
- 增大環(huán)形緩沖區(qū)溢寫的比例。由80%擴(kuò)大到90%
- 減少對(duì)溢寫文件的merge次數(shù)。(10個(gè)文件,一次20個(gè)merge)
- 不影響實(shí)際業(yè)務(wù)的前提下,采用Combiner提前合并,減少 I/O
2、Reduce階段
- 合理設(shè)置Map和Reduce數(shù):兩個(gè)都不能設(shè)置太少,也不能設(shè)置太多。太少,會(huì)導(dǎo)致Task等待,延長處理時(shí)間;太多,會(huì)導(dǎo)致 Map、Reduce任務(wù)間競(jìng)爭(zhēng)資源,造成處理超時(shí)等錯(cuò)誤
- 設(shè)置Map、Reduce共存:調(diào)整slowstart.completedmaps參數(shù),使Map運(yùn)行到一定程度后,Reduce也開始運(yùn)行,減少Reduce的等待時(shí)間
- 規(guī)避使用Reduce,因?yàn)镽educe在用于連接數(shù)據(jù)集的時(shí)候?qū)?huì)產(chǎn)生大量的網(wǎng)絡(luò)消耗
- 增加每個(gè)Reduce去Map中拿數(shù)據(jù)的并行數(shù)
- 集群性能可以的前提下,增大Reduce端存儲(chǔ)數(shù)據(jù)內(nèi)存的大小
3、IO傳輸
采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡(luò)IO的的時(shí)間。
安裝Snappy和LZOP壓縮編碼器。文章來源:http://www.zghlxwxcb.cn/news/detail-470216.html
- map輸入端主要考慮數(shù)據(jù)量大小和切片,支持切片的有Bzip2、LZO。注意:LZO要想支持切片必須創(chuàng)建索引;
- map輸出端主要考慮速度,速度快的snappy、LZO;
- reduce輸出端主要看具體需求,例如作為下一個(gè)mr輸入需要考慮切片,永久保存考慮壓縮率比較大的gzip。
4、整體
- yarn.nodemanager.resource.memory-mb
NodeManager默認(rèn)內(nèi)存8G,需要根據(jù)服務(wù)器實(shí)際配置靈活調(diào)整,例如128G內(nèi)存,配置為100G內(nèi)存左右 - yarn.scheduler.maximum-allocation-mb
單任務(wù)默認(rèn)內(nèi)存8G,需要根據(jù)該任務(wù)的數(shù)據(jù)量靈活調(diào)整,例如128m數(shù)據(jù),配置1G內(nèi)存 - mapreduce.map.memory.mb
控制分配給MapTask內(nèi)存上限,如果超過會(huì)kill掉進(jìn)程(報(bào):Container is running beyond physical memory limits. Current usage:565MB of512MB physical memory used;Killing Container)。默認(rèn)內(nèi)存大小為1G,如果數(shù)據(jù)量是128m,正常不需要調(diào)整內(nèi)存;如果數(shù)據(jù)量大于128m,可以增加MapTask內(nèi)存,最大可以增加到4-5g。 - mapreduce.reduce.memory.mb
控制分配給ReduceTask內(nèi)存上限。默認(rèn)內(nèi)存大小為1G,如果數(shù)據(jù)量是128m,正常不需要調(diào)整內(nèi)存;如果數(shù)據(jù)量大于128m,可以增加ReduceTask內(nèi)存大小為4-5g。 - mapreduce.map.java.opts
控制MapTask堆內(nèi)存大小。(如果內(nèi)存不夠,報(bào):java.lang.OutOfMemoryError) - mapreduce.reduce.java.opts
控制ReduceTask堆內(nèi)存大小。(如果內(nèi)存不夠,報(bào):java.lang.OutOfMemoryError) - 可以增加MapTask的CPU核數(shù),增加ReduceTask的CPU核數(shù)
- 增加每個(gè)Container的CPU核數(shù)和內(nèi)存大小
- 在hdfs-site.xml文件中配置多目錄(多磁盤)
- NameNode有一個(gè)工作線程池,用來處理不同DataNode的并發(fā)心跳以及客戶端并發(fā)的元數(shù)據(jù)操作。dfs.namenode.handler.count=20 * log2 (Cluster Size),比如集群規(guī)模為10臺(tái)時(shí),此參數(shù)設(shè)置為60。
至此,已經(jīng)簡要介紹了內(nèi)存和cpu的分配計(jì)算方式,和其他的方面的調(diào)整方向。文章來源地址http://www.zghlxwxcb.cn/news/detail-470216.html
到了這里,關(guān)于23、hadoop集群中yarn運(yùn)行mapreduce的內(nèi)存、CPU分配調(diào)度計(jì)算與優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!