CDH构建大数据平台-集群配置优化实战之HDFS集群调优

Posted 格格巫 MMQ!!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDH构建大数据平台-集群配置优化实战之HDFS集群调优相关的知识,希望对你有一定的参考价值。

一.hdfs-default.xml

1>.dfs.namenode.handler.count

NameNode中用于处理RPC调用的线程数,即指定NameNode 的服务器线程的数量。NameNode有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用,处理程序数量越多意味着要更大的池来处理来自不同DataNode的并发心跳以及客户端并发的元数据操作)。 对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。 
  如果该值设的太小,明显的状况就是DataNode在连接NameNode的时候总是超时或者连接被拒绝,但NameNode的远程过程调用队列很大时,远程过程调用延时就会加大。症状之间是相互影响的,很难说修改dfs.namenode.handler.count就能解决问题,但是在查找故障时,检查一下该值的设置是必要的。如果前面的描述你仍然觉得很不清楚,可以看下面的python程序,假设我们大数据集群的大小为500台,那么我们可以直接看怎么计算应该设置合理值。
[root@node101.yinzhengjie.org.cn ~]# python -c ‘import math ; print int(math.log(500) * 20)’

124

[root@node101.yinzhengjie.org.cn ~]#
  其实在生产环境中,我把改值设置的较大,如果集群节点数在20左右的话,推荐设置为200。【生产案例说明:计算集群(20台)设置128启动集群所需时间是35min,而存储集群(14台)设置的是200启动的时间是15min】

2>.dfs.datanode.handler.count

数据节点的服务器线程数,默认为10。可适当增加这个数值来提升DataNode RPC服务的并发度。 在DataNode上设定,取决于系统的繁忙程度,设置太小会导致性能下降甚至报错。线程数的提高将增加DataNode的内存需求,因此,不宜过度调整这个数值。

3>.dfs.datanode.max.transfer.threads (dfs.datanode.max.xcievers)

DataNode可以同时处理的数据传输连接数,即指定在DataNode内外传输数据使用的最大线程数。 官方将该参数的命名改为dfs.datanode.max.transfer.threads。默认值为4096。推荐值为8192。

4>.dfs.namenode.avoid.read.stale.datanode

指示是否避免读取“过时”的数据节点(DataNode),这些数据节点(DataNode)的心跳消息在指定的时间间隔内未被名称节点(NameNode)接收。过时的数据节点(DataNode)将移动到返回供读取的节点列表的末尾。有关写入的类似设置,请参阅df.namenode.avoint.write.stale.datanode。默认值是flase,推荐设置为true。

5>.dfs.namenode.avoid.write.stale.datanode

指示超过失效 DataNode 时间间隔 NameNode 未收到检测信号信息时是否避免写入失效 DataNode。写入应避免使用失效 DataNode,除非多个已配置比率 (dfs.namenode.write.stale.datanode.ratio) 的 DataNode 标记为失效。有关读取的类似设置,请参阅 dfs.namenode.avoid.read.stale.datanode。 默认值是flase,推荐设置为true。

6>.dfs.datanode.balance.bandwidthPerSec (dfs.balance.bandwidthPerSec)

每个 DataNode 可用于平衡的最大带宽。单位为字节/秒。以每秒字节数的形式指定每个数据节点可用于平衡目的的最大带宽量。您可以使用以下后缀(不区分大小写):k(kilo)、m(mega)、g(giga)、t(tera)、p(peta)、e(exa)指定大小(例如128k、512m、1g等)。或者以字节为单位提供完整的大小(例如,对于128 MB,134217728)。默认是10M,我们知道服务器现在都是万兆网卡了,交换机对应端口也是10G网口的话,也就是说我们最大可以设置1.25G带宽。但是我们得考虑其他服务的传输效率,不能把所有的带宽都被DataNode 平衡数据所占用啦!推荐设置为128M~512M。

HDFS平衡器检测集群中使用过度或者使用不足的DataNode,并在这些DataNode之间移动数据块来保证负载均衡。如果不对平衡操作进行带宽限制,那么它会很快就会抢占所有的网络资源,不会为Mapreduce作业或者数据输入预留资源。参数dfs.balance.bandwidthPerSec定义了每个DataNode平衡操作所允许的最大使用带宽,这个值的单位是byte,这是很不直观的,因为网络带宽一般都是用bit来描述的。因此,在设置的时候,要先计算好。DataNode使用这个参数来控制网络带宽的使用,但不幸的是,这个参数在守护进程启动的时候就读入,导致管理员没办法在平衡运行时来修改这个值。

7>.dfs.datanode.du.reserved

当DataNode向NameNode汇报可用的硬盘大小的时候,它会把所有dfs.data.dir所列出的可用的硬盘大小总和发给NameNode。由于mapred.local.dir经常会跟DataNode共享可用的硬盘资源,因此我们需要为Mapreduce任务保留一些硬盘资源。dfs.datanode.du.reserved定义了每个dfs.data.dir所定义的硬盘空间需要保留的大小,以byte为单位。默认情况下,该值为0,也就是说HDFS可以使用每个数据硬盘的所有空间,节点硬盘资源耗尽时就会进入读模式。因此,建议每个硬盘都为map任务保留最少10GB的空间,如果每个Mapreduce作业都会产生大量的中间结果,或者每个硬盘空间都比较大(超过2TB),那么建议相应的增大保留的硬盘空间。我在生产环境中设置改值的大小为50G字节!

8>.dfs.datanode.failed.volumes.tolerated

指定数据节点(DataNode)停止提供服务之前允许失败的卷数。默认情况下,任何卷故障都会导致数据节点关闭。

当DataNode的任何一个本地磁盘出故障时,它的默认行为认定整个DataNode失效。在一个中到大型的集群中,硬盘故障是相当常见的,所以这种行为不是最优的。一个DataNode的丢失会导致一些数据块备份数下降,因此,NameNode会命令其他DataNode复制这些丢失的数据块来增加被附属。参数dfs.datanode.failed.volumes.tolerated定义整个DataNode声明失败前允许多少个硬盘出现故障。

很多人会问,为什么不能容忍所有磁盘失效的情况,这样就可以把整个DataNode的失效推迟到没有任何可工作的硬盘为止。对于一个永久的时间窗口来说,这看上去很合理的,但是实际上,对于所以的磁盘来说,管理员对于磁盘故障的处理都会早于由于正常磨损而出现的故障。只有一种情况例外,所以的硬盘在一个极短的时间内全部出现故障,这种异常情况需要立即调查。在实践中,快速的磁盘故障通常意味着驱动控制器或者某些部件故障。正因为罕见,但如果磁盘在短时间内开始出现一连串故障,最好的办法就是立即隔离。先把整个集群设置为不可用,直到找到失败的原因为止。参数dfs.datanode.failed.volumes.tolerated默认值为0,也就意味着只要有一个磁盘出现故障就会导致整个DataNode不可用,管理员可以增大该值来保证在出现部分磁盘故障时,DataNode仍能持续运行,但是需要保持谨慎的是,在极短的时间范围内出现一个或者两个磁盘故障表明一个更大的问题存在。

二.core-default.xml

1>.fs.trash.interval

垃圾桶检查点之间的分钟数。还可控制删除垃圾桶检查点目录后的分钟数。要禁用垃圾桶功能,请输入 0。 默认为禁用垃圾桶功能。为防止重要文件误删,可启用该特性。

用户经常会意外删除文件。HDFS支持回收站功能,这类似于大多数操作系统的回收站,当这个功能被启用,文件被移到用户的HDFS主目录中一个名为.Trash目录中,来保留被删除的文件,而不是立即彻底删除。fs.trash.interval定义.Trash目录下文件被永久删除前保留的时间。在文件被从HDFS永久删除前,用户可以自由地把文件从该目录下移出来并立即还原。默认值是0说明垃圾回收站功能是关闭的。

要清楚,回收站功能不是万能的,推迟删除意味着要文件所占据的空间仍不可用,除非它被永久删除。用户可以通过运行hadoop fs -expunge命令。或者干脆等待指定的时间来明确回收站清空。可以在hadoop fs -rm命令通过指定-skipTrash参数来跳过回收站从而立即删除文件。

2>.io.file.buffer.size

HDFS文件缓冲区大小,默认为4096(即4K)。不论是对硬盘或者是网络操作来讲,较大的缓存都可以提供更高的数据传输,但这也就意味着更大的内存消耗和延迟。一般情况下,可以设置为64KB(65536byte)。生产环境中我们将配置调大,可以设置为1M(1048576byte)

3>.io.native.lib.available

本地库可以加快基本操作,例如IO,压缩等。 默认值为true,因此我们可以不用配置该参数!有个了解就好。

以上是关于CDH构建大数据平台-集群配置优化实战之HDFS集群调优的主要内容,如果未能解决你的问题,请参考以下文章

hadoop之HDFS

大数据资源监控—— IDC机房集群指标获取

eBay 大数据平台的 HDFS 性能优化实践

大数据平台搭建及集群规划

Hadoop新增节点后HDFS数据均衡操作

大数据运维日记之清理磁盘