欢迎投稿

今日深度:

hadoop 调优,

hadoop 调优,


红色表示有效果 蓝色表示已尝试,当前环境无效果 mapred-site.xml配置文件 mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum 查看cpu核数:cat /proc/cpuinfo |grep "cores"|uniq   8个 map 6 reduce 2
mapred.child.java.opts
默认值:-Xmx200m
说明:jvms启动的子线程可以使用的最大内存。改为-Xmx1024m,内存再大也可以继续增加。但是如果一般任务文件小,逻辑不复杂用不了那么多的话太大也浪费。
优化值:3072
mapred.jobtracker.handler.count
默认值:10
说明:JobTracker可以启动的线程数,一般为tasktracker节点的4%。
或mapred.job.tracker.handler.count      
mapreduce.tasktracker.http.threads

默认值: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配置文件

fs.inmemory.size.mb
默认值:
说明: reduce阶段用户合并map输出的内存限制。这里设置200,可根据自身硬件设备进行更改测试。

io.file.buffer.size 默认值:4096 流文件的缓冲区为4K。SequenceFiles在读写中可以使用的缓存大小,流文件的缓冲区默认值为4K。。这个参数在新版本里变为了:file.stream-buffer-size,单位bytes 。     作为hadoop缓冲区,用于hadoop读hdfs的文件和写hdfs的文件,还有map的输出都用到了这个缓冲区容量,对于现在的硬件很保守,可以设置为128k(131072),甚至是1M(太大了map和reduce任务可能会内存溢出)。通过增大它的大小能够减少I/O次数以提高性能。如果系统允许,64KB(65536字节)至128KB(131072字节)是较普遍的选择。 <property> <name>io.file.buffer.size</name> <value>131072</value> </property>
fs.inmemory.size.mb 默认值: reduce 阶段用户合并 map 输出所需的内存文件系统分配更多的内存。reduce阶段用户合并map输出的内存限制。一般设为200 ,可根据自身硬件设备进行更改测试。 <property> <name>fs.inmemory</name> <value>200</value> </property>
hdfs-site.xml配置文件 dfs.namenode.handler.count
默认值:10
说明:hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定。
尝试值:40/30/20
其他优化
  • 调整心跳间隔
对于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都无法正常执行。


www.htsjk.Com true http://www.htsjk.com/Hadoop/41702.html NewsArticle hadoop 调优, 红色表示有效果 蓝色表示已尝试,当前环境无效果 mapred-site.xml配置文件 mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum 查看cpu核数:cat /proc/cpuinfo |grep "cores...
相关文章
    暂无相关文章
评论暂时关闭