Hadoop性能调优

来源:互联网 发布:微信企业号java源码 编辑:程序博客网 时间:2024/05/21 19:23

一.操作系统调优

1.避免使用swap分区

2.调整内存分配策略

系统内核根据vm.overcommit_memory的值来决定分配策略,值为0,1,2。

0表示内核将检查是否有足够的可用内存供应用进程使用,如果有则申请允许,否则内存申请失败

1表示内核允许分配所有的物理内存,而不管内存的内存状态如何

2表示内核允许分配超过所有物理内存和交换空间的总和,通过vm.overcommit_ratio的值设置允许超过的比例

建议设置为2.

二.Hadoop参数调优

1.hdfs-site.xml

<property>  <name>dfs.block.size</name>  <value>134327728</value></property>

hadoop块的大小通常设置为128M

<property>  <name>dfs.namenode.handler.count</name>  <value>40</value></property>

NameNode和DataNode通信的线程数默认为10

<property>  <name>dfs.datanode.max.xcievers</name>  <value>65536</value></property>
对于DataNode如同Linux上的文件句柄的限制,当DataNode上的连接数超过这个配置的设置,DataNode就会拒绝连接。

<property>  <name>dfs.balance.bandwidthPerSec</name>  <value>20485760</value></property>
执行start-balancer.sh的带宽,默认1048576(1MB/s)

<property>  <name>dfs.replication</name>  <value>3</value></property>
hdfs上文件的副本数,默认为3.

2.core-site.xml

<property>  <name>io.file.buffer.size</name>  <value>131072</value></property>
hadoop缓存区大小,用于hadoop读写hdfs文件,和map中间结果的输出。默认为4kb。

<property>  <name>fs.inmemory.size.mb</name>  <value>200</value></property>

reduce阶段合并map输出的内存限制。

3.mapred-site.xml


<property>  <name>mapred.tasktracker.map.tasks.maximum</name>  <value></value></property>


map任务的槽数,同时运行map任务的最大数量,默认为2

<property>  <name>mapred.tasktracker.reduce.tasks.maximum</name>  <value></value></property>

reduce任务槽数,同时运行的reduce任务的最大数量,默认为2(每个节点的所有槽数加起来不能超过节点的cpu数)

<property>  <name>mapred.max.split.size</name>  <value>134217728</value></property>
InputSplit的个数等于mapred.min.split.size和min(mapred.max.split.size, dfs.block.size)的最大值。mapred.min.split.size, mapred.max.split.size和dfs.block.size都可以影响inputsplit的个数。而inputsplit的个数决定map的个数,所以可以通过修改mapred.max.split.size和mapred.min.split.size来达到增加或者减少map任务的个数。最好使inputsplit的大小和块大小一致以实现本地化。

<property>  <name>mapred.min.split.size</name>  <value>134217728</value></property>


<property>  <name>mapreduce.jobtracker.heartbeat,interval.min</name>  <value>2000</value></property>

JobTracker和TaskTracker之间心跳间隔的最小值,默认为3000.

<property>  <name>mapreduce.jobtracker.heartbeats.scaling.factor</name>  <value>0.01</value></property>
默认0.01,表示每增加100个节点,心跳增加100*0.01=1秒

<property>  <name>mapred.job.tracker.handler.count</name>  <value>40</value></property>
jobtracker处理各个TaskTracker的RPC请求,默认为10

<property>  <name>tasktracker.http.threads</name>  <value>40</value></property>
TaskTracker处理reduce任务发送的请求的HTTP服务器的线程数,应该与reduce任务槽数和被允许处理的数据的分数成正比,默认为10

<property>  <name>mapred.compress.map.output</name>  <value>true</value></property>
Map中间任务默认不采取压缩,设置为true会对中间结果压缩,减少中间结果数据带宽传输需要。还可以设置mapred.map.output.compression.codec选择压缩算法

<property>  <name>mapred.job.reuse.jvm.num.tasks</name>  <value>-1</value></property>
JVM重用设置,默认为1,表示一个JVM只能启动一个任务,设置为-1表示1个JVM启动的任务数不受限制。

<property>  <name>mapred.map.tasks.speculative.execution</name>  <value>true</value></property>

<property>  <name>mapred.reduce.tasks.speculative.execution</name>  <value>true</value></property>
以上两个参数分别是开始Map/Reduce任务的推测机制,推测机制可以有效的防止因为瓶颈而导致整个任务运行缓慢,注意:推测执行会抢占系统资源,默认为true

<property>  <name>mapred.local.dir</name>  <value>/data/tmp1,/data2/tmp2,/data3/tmp3</value></property>

mapreduce中间结果存放的本地路径,设置多盘有助于提高IO效率。

<property>  <name>mapred.child.java.opts</name>  <value>-Xmx2024m</value></property>
TaskTracker的java子进程的java参数,默认-Xmx200M。也就是一个任务获取的最大内存,不止可以配置heap,还可以配置GC,eg:-Xmx1024M -verbose:gc

<property>  <name>mapred.map.child.java.opts</name>  <value>-Xmx1024m</value></property>
Map任务进程的java参数,解决mapred.child.java.opts粗粒度问题,默认为-Xmx200M

<property>  <name>mapred.reduce.child.java.opts</name>  <value>-Xmx1024m</value></property>
Reduce任务执行的java参数,解决mapred.child.java.opts粗粒度问题,默认为-Xmx200M

<property>  <name>io.sort.mb</name>  <value>100</value></property>

Map任务的环形缓冲区,默认100m

<property>  <name>io.sort.spill.percent</name>  <value>0.80</value></property>

Map任务输出到环形缓冲区的阈值,一旦缓冲区内容占缓冲区比例超过这个值,就将缓冲区刷写到mapred.local.dir目录。默认0.8,建议不低于0.5

<property>  <name>mapred.reduce.parallel.copies</name>  <value>25</value></property>

该值为reduce从TaskTracker复制map任务输出的工作线程数。默认为5,如果过大会导致大量数据同时在网络传输,引起IO压力,比较科学的设定为4*lgN,N为集群大小

<property>  <name>mapred.job.shuffle.input.buffer.percent</name>  <value>0.7</value></property>

该值为shuffle中复制阶段耗费的reduce任务内存比,默认0.7,reduce任务内存为mapred.reduce.child.java.opts

<property>  <name>mapred.job.shuffle.merge.percent</name>  <value>0.66</value></property>

当内存使用率超过该值,将触发一次合并操作,将内存中的数据刷写到磁盘上,默认0.66

<property>  <name>mapred.reduce.slowstart.completed.maps</name>  <value>0.05</value></property>
该值控制reduce启动的时机,默认0.05,即map任务完成数目达到5%时,启动reduce任务,可适当调高,但reduce任务启动过早或过晚都会导致任务时间增加。

<property>  <name>io.sort.fator</name>  <value>10</value></property>

map端和reduce端合并策略,表示一个合并的文件数目,默认为10,设置过大会使内存消耗过大,但设置过小会增加合并次数。


调优原则:

1)增大作业并行度,如增加map数量

2)保证任务执行有足够资源

3)保证前两条后,尽可能为shuffle提供资源



























0 0
原创粉丝点击