hadoop 参数调优及测试

hadoop参数优化#

hadoop验证版本为2.6.4,其它版本酌情参考
core-site.xml

参数名 默认值 说明
hadoop.tmp.dir /tmp/hadoop-${user.name} hadoop中间临时文件最好单独指定目录,比如mr split信息,stag信息
io.file.buffer.size 4096 设置IO操作缓冲区大小,较大的缓存都可以提供更高的数据传输,但这也就意味着更大的内存消耗和延迟。这个参数要设置为系统页面大小的倍数,以byte为单位,默认值是4KB,一般情况下,可以设置为64KB(65536byte)
fs.trash.interval 0 建议开启回收站功能,此参数定义.Trash目录下文件被永久删除前保留的时间
topology.script.file.name -- 集群节点比较多时,建议配置机架感知。脚本示例:rack_awareness

hdfs-site.xml

参数名 默认值 说明
dfs.namenode.handler.count 10 服务线程个数,调大一些,一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小
dfs.datanode.handler.count 10 服务线程个数,根据CPU核数盒实际测试决定,一般是比核数多几个
dfs.datanode.max.transfer.threads 4096 datanode所允许同时执行的发送和接受任务的数量,类似于linux上的文件句柄限制
dfs.namenode.name.dir file://${hadoop.tmp.dir}/dfs/name 多个位置冗余备份,一份在本地,另外一份NFS
dfs.datanode.data.dir file://${hadoop.tmp.dir}/dfs/data 多个位置分布式存储,尽量多分布几个分区目录
dfs.datanode.failed.volumes.tolerated 0 定义整个DataNode声明失败前允许多少个硬盘出现故障。任何一个本地磁盘出故障时,它的默认行为认定整个DataNode失效。可以配成硬盘数量的30%
dfs.client.read.shortcircuit false 建议改为true开启短路径读
dfs.domain.socket.path   设置短路径读的socket path,/var/run/hadoop-hdfs/dn._PORT 保证/var/run/hadoop-hdfs/组可写,组为root
dfs.blocksize 134217728 新文件默认块大小,默认128M,可以根据集群规模调整,mapper数基本由输入文件的block数决定,block小引起很多小任务
dfs.hosts -- 该文件中dfs.hosts的格式是用换行符来分割主机名或者IP地址,不在列表内的主机不允许加入集群。
dfs.host.exclude -- 类似dfs.hosts,HDFS可以通过指定文件把相关节点排除在外,可以安全的卸载节点
dfs.datanode.balance.bandwidthPerSec 1048576 balancer 在DataNode之间移动数据块来保证负载均衡。如果不对平衡操作进行带宽限制,那么它会很快就会抢占所有的网络资源,影响Mapreduce作业和其它服务,太小则均衡太慢。通过此参数设置每秒最大占用带宽,这个值的单位是byte,网络带宽一般都是用bit来描述的。在设置的时候,要先计算好。
dfs.datanode.du.reserved 0 datanode会上报配置目录的空间大小总和,默认都用于dfs存储,可以预留一部分空间给别的服务,也可以减少一些无谓监控告警

mapred-site.xml

参数名 默认值 说明
mapreduce.cluster.local.dir ${hadoop.tmp.dir}/mapred/local MR存储中间数据,最好多分及格目录,逗号隔开
mapreduce.shuffle.readahead.bytes 4194304 默认为4M,ShuffleHandler在发送文件时使用posix_fadvise管理操作系统cache,可以增加预取长度提高shuffle效率
mapreduce.ifile.readahead.bytes 4194304 默认为4M,ifile预取长度
mapreduce.tasktracker.outofband.heartbeat false 建议设成ture,在完成任务时让TaskTracker发送一个 out-of-band心跳来减少延迟
mapreduce.jobtracker.heartbeat.interval.min 300 增加TaskTracker-to-JobTracker 心跳间隔,对小集群可以增加MR性能,可以改成1000
mapred.reduce.slowstart.completed.maps 0.05 此属性设置当map任务完成多少的时候启动reduce任务,许多小任务可以设成0,大任务设成0.5
mapreduce.map.speculative true map任务推测执行,如果计算资源紧张,任务执行本身很耗资源情况下可以考虑设置成false。需要时通过任务参数制定 。
mapreduce.reduce.speculative true reduce任务推测执行,建议关闭,需要时通过任务参数制定
mapreduce.task.io.sort.mb 100 以MB为单位,默认100M,根据map输出数据量的大小,可以适当的调整buffer的大小,注意是适当的调整,不是越大越好。
mapreduce.map.sort.spill.percent 0.8 buffer中达到80%时,进行spill
mapreduce.map.output.compress false map输出是否压缩,建议开启减少io和网络消耗
mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.DefaultCodec 建议使用snappy压缩 org.apache.hadoop.io.compress.SnappyCodec
mapreduce.output.fileoutputformat.compress.type RECORD 输出SequenceFiles是的压缩类型,建议改成BLOCK
mapreduce.map.java.opts -- 可以指定一些JVM参数用于调优
mapreduce.jobtracker.handler.count 10 jobtracker rpc的线程数,一般推荐为tasktracker节点数的40%
mapreduce.tasktracker.http.threads 40 获取map输出的工作线程数,可根据集群规模和硬件配置调整
mapreduce.tasktracker.map.tasks.maximum 2 tasktracker同时运行map任务数,一般可配为CPU核数或1.5倍核数
mapreduce.tasktracker.reduce.tasks.maximum 2 tasktracker同时运行reduce任务数,一般可配为CPU核数或1.5倍核数
mapreduce.reduce.shuffle.input.buffer.percent 0.7 reduce用于接受map输出buffer占堆大小的比例,类似于map端的mapreduce.task.io.sort.mb,shuffle最大使用的内存量。如果 map 输出很大而且在 reduce 到排序阶段本地磁盘 I/O 很频繁,应该尝试增加这个值。
mapreduce.reduce.shuffle.parallel.copies 5 shuffle阶段copy线程数,默认是5,一般可以设置为 4*logN N为集群大小
mapreduce.job.jvm.num.tasks 1 默认为1,设置为 -1,重用jvm

yarn-site.xml

参数名 默认值 说明
yarn.scheduler.minimum-allocation-mb 1024 一次申请分配内存资源的最小数量
yarn.scheduler.maximum-allocation-mb 8192 一次申请分配内存资源的最大数量
yarn.nodemanager.resource.memory-mb 8192 默认值为8192M,节点所在物理主机的可用物理内存总量
yarn.nodemanager.resource.cpu-vcores 8 NodeManager总的可用虚拟CPU个数,根据硬件配置设定,简单可以配置为CPU超线程个数

如何调优#

一般系统调优的基本步骤

衡量系统现状,了解现有硬件和软件环境,目前的关键系统指标。
设定调优目标,确定优先解决的问题,评估设计调优目标
寻找性能瓶颈,根据现有监控数据,找出瓶颈点。
性能调优,找出收益比(效果/代价)比较高的策略实施
衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈)
性能调优结束

在集群安装部署时应收集业务对系统的需求及特点(数据量,读写特点,计算量等),同时做好硬件的规划和初始测试(对服务器的IO/net/cpu做基本测试,保证加入集群服务器硬件没有问题)。下面主要从硬件规划和软件调优方面讨论hadoop集群的调优。

设计基准测试用例#

怎么看你的调整有效果?怎么看你是否找到了瓶颈点?要有一个对比的基线,才能比较出你的调整能改善多少性能。Hadoop提供线程测试基线应用。比如用于 HDFS I/O 测试的 TestDFSIO 和 dfsthroughput(包含在 hadoop--test.jar 中)、用于总体硬件测试的 Sort(包含在 hadoop--examples.jar 中)。可以根据自己的测试需求选择任何基准。

在所有这些基准中,当输入数据很大时,Sort 可以同时反映 MapReduce 运行时性能(在 “执行排序” 过程中)和 HDFS I/O 性能(在 “把排序结果写到 HDFS” 过程中)。另外,Sort 是 Apache 推荐的硬件基准。(http://wiki.apache.org/hadoop/Sort)

可以先测试HDFS的写入和读写性能,然后通过Sort基线测试计算和整体性能。

IO测试,会在最后输出相关统计数据

写入10个文件,每个文件5G[root@localhost ~]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.4-tests.jar TestDFSIO -write -nrFiles 10 -size 5GB

读10个文件,每个文件5G[root@localhost ~]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.4-tests.jar TestDFSIO -read -nrFiles 10 -size 5GB

Sort基线测试

生成测试数据[root@localhost ~]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar randomwriter -Dtest.randomwriter.maps_per_host=10 -Dtest.randomwrite.bytes_per_map=50G random-data

运行排序[root@localhost ~]# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar sort random-data sorted-data

基线配置参数可以都使用默认的配置参数,然后一轮一轮修改参数,通过对比结果和服务器监控数据来做对比。

监控数据分析#

在做调优之前集群应该已经有基本的资源监控 比如 CPU、文件IO、网络IO、内存。如果没有则需要安装监控工具或监控脚步完成主机性能参数收集,常用工具(nmon/nmonanalyser,dstat等等)。

性能瓶颈的表象:资源消耗过多、外部处理系统的性能不足、资源消耗不多但程序的响应速度却仍达不到要求。

我们分析性能的主要来源数据就是主机监控数据和MR计算过程中的计数器数据等等,常见的分析点:

  1. work节点的CPU资源是否有效利用,一般维持在70%左右,如果不到40%表面没有充分利用CPU

  2. 观察磁盘IO是否有压力,CPU wa比例是不是很大

  3. 观察网络流量是否正常

  4. MR性能主要看shuffle阶段的计数器的表现,spill IO是否为瓶颈等

  5. 内存方面结合JVM优化进行调整

结合前面讲的一些优化参数点,反复测试分析结果。解决高层次性能瓶颈后再考虑应用级别的优化,比如文件格式,序列化性能,这方向调优可以使用JVM/HotSpot原生profile能力。

你可能感兴趣的:(hadoop)