默认值:-Xmx200m
说明:jvms启动的子线程可以使用的最大内存。改为-Xmx1024m,内存再大也可以继续增加。但是如果一般任务文件小,逻辑不复杂用不了那么多的话太大也浪费。
默认值:10
说明:JobTracker可以启动的线程数,一般为tasktracker节点的4%。
默认值:40
说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。
io.sort.factor
默认值:10
排完序的文件的合并时的打开文件句柄数。int类型,Map端和Reduce端使用
该属性设置在Map端和Reduce端都使用到的对文件Sort时一次合并的最大流,其默认值是10,即一次合并10个流。在集群中,将其适当增大能够提高并行度以缩短合并所需时间。有利于减少合并次数,进而减少map对磁盘的读写频率,有可能达到优化作业的目的。
<property>
<name>io.sort.factor</name>
<value>100</value>
</property>
io.sort.mb
默认值:100
排序文件的内存缓存大小。int类型,Map端使用该属性设置对Map输出进行排序时使用的环形内存缓冲区的大小,以M字节为单位,默认是100M。如果允许,应该增加它的值来减少磁盘溢写的次数以提高性能。
<property>
<name>io.sort.mb</name>
<value>200</value>
</property>
优化值:300
io.sort.spill.percent
默认值:0.80
当缓冲占用量为该值时,线程需要将内容先备份到磁盘中。即Map开始做spill(溢写)操作的阈值(buffer size * spill percent = 100MB * 0.8 = 80MB)。内容缓冲区默认大小为100M时,溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。如果你确认map输出的数据基本有序,排序时间很短,可以将这个阈值适当调高,更理想的,如果你的map输出是有序的数据,那么可以把buffer设的更大,阈值设置为1。
<property>
<name>io.sort.spill.percent</name>
<value>0.80</value>
</property>
11、mapred.job.tracker.handler.count
默认值:10
作业跟踪管理器的管理线程数,线程数比例是任务管理跟踪器数量的0.04。较大集群的话,可调大些,比如64。
<property>
<name>mapred.job.tracker.handler.count</name>
<value>10</value>
</property>
mapred.reduce.parallel.copies
默认值:5
在复制阶段时reduce并行传送的值。reuduce shuffle阶段并行传输数据的数量。将Map输出复制到Reduce的线程的数量。对于较大集群,根据需要可以将其增大到20-50,增加了Reduce端复制过程的并行数,提高了系统性能。
<property>
<name>mapred.reduce.parallel.copies</name>
<value>5</value>
</property>
core-site.xml配置文件
默认值:
说明: reduce阶段用户合并map输出的内存限制。这里设置200,可根据自身硬件设备进行更改测试。
默认值:10
说明:hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定。
- 调整心跳间隔
对于300台以下的集群 可以把心跳设置成300毫秒(默认是3秒)mapreduce.jobtracker.hearbeat.interval.min | mapred.hearbeats.in.second | mapreduce.jobtracker.heartbeats.scaling.factor
- 启用外心跳
为了减少任务分配延迟(比如我们的任务心跳设置为10秒钟,当有一个任务挂掉了之后,他就不能马上通知jobtracker),所以hadoop引入了外心跳,外心跳是任务运行结束或者任务运行失败的时候触发的,能够在出现空闲资源时第一时间通知jobtracker,以便他能够迅速为空闲资源分配新的任务外心跳的配置参数是 mapreduce.tasktracker.outofband.hearbeat
- map task调优
合理调整io.sort.record.percent值,可减少中间文件数据,提高任务执行效率. (map task的输出结果将被暂时存放到一个环形缓冲区中,这个缓冲区的大小由参数"io.sort.mb"指定,单位MB,默认是100MB, 该缓冲区主要由两部分组成,索引和实际数据,默认情况下,索引占整个buffer的比例为io.sort.record.percent,默认是5%, 剩余空间存放数据,仅当满足以下任意一个条件时才会触发一次flush,生成一个临时文件,索引或者数据空间使用率达到比例为 io.sort.spill.percent的80%)
所以具体调优参数如下: io.sort.mb | io.sort.record.percent | io.sort.spill.percent
- 使用JVM重用
mapred.job.reuse.jvm.aum.tasks | mapreduce.job.jvm.num.tasks = -1
- hive
- 设置好内存至关重要
Hadoop集群安装完毕后,第一件事就是修改bin/hadoop-evn.sh文件设置内存。主流节点内存配置为32GB,典型场景内存设置如下
NN: 15-25 GB
JT:2-4GB
DN:1-4 GB
TT:1-2 GB,Child VM 1-2 GB
集群的使用场景不同相关设置也有不同,如果集群有大量小文件,则要求NN内存至少要20GB,DN内存至少2GB。
推荐理由:几个组件中NN对内存最为敏感,它有单点问题,直接影响到集群的可用性;JT同样是单点,如果JT内存溢出则所有MapReduce Job都无法正常执行。