1.NameNode数据目录

dfs.name.dir, dfs.namenode.name.dir

指定一个本地文件系统门路,决定NN在何处寄存fsimage和editlog文件。能够通过逗号分隔指定多个门路. 目前咱们的产线环境只配大数据培训置了一个目录,并存放在了做了RAID1或RAID5的磁盘上。

2.DataNode数据目录

dfs.data.dir, dfs.datanode.data.dir

指定DN寄存块数据的本地盘门路,能够通过逗号分隔指定多个门路。在生产环境可能会在一个DN上挂多块盘。

3.数据块的正本数

dfs.replication

数据块的正本数,默认值为3

4.数据块大小

dfs.block.size

HDFS数据块的大小,默认为128M,目前咱们产线环境配置的是1G

 

5.HDFS做平衡时应用的最大带宽

dfs.datanode.balance.bandwidthPerSec

HDFS做平衡时应用的最大带宽,默认为1048576,即1MB/s,对大多数千兆甚至万兆带宽的集群来说过小。不过该值能够在启动balancer脚本时再设置,能够不批改集群层面默认值。目前目前咱们产线环境设置的是50M/s~100M/s

6.磁盘可损坏数

dfs.datanode.failed.volumes.tolerated

DN多少块盘损坏后进行服务,默认为0,即一旦任何磁盘故障DN即敞开。对盘较多的集群(例如每DN12块盘),磁盘故障是常态,通常能够将该值设置为1或2,防止频繁有DN下线。

7.数据传输连接数

dfs.datanode.max.xcievers

DataNode能够同时解决的数据传输连接数,即指定在DataNode内外传输数据应用的最大线程数。官网将该参数的命名改为dfs.datanode.max.transfer.threads,默认值为4096,推荐值为8192,咱们产线环境也是8192

8.NameNode解决RPC调用的线程数

dfs.namenode.handler.count

NameNode中用于解决RPC调用的线程数,默认为10。对于较大的集群和配置较好的服务器,可适当减少这个数值来晋升NameNode RPC服务的并发度,该参数的倡议值:集群的自然对数 * 20

python -c 'import math ; print int(math.log(N) * 20)'

咱们800+节点产线环境配置的是200~500之间

9.NameNode解决datanode 上报数据块和心跳的线程数

dfs.namenode.service.handler.count

用于解决datanode 上报数据块和心跳的线程数量,与dfs.namenode.handler.count算法统一

10.DataNode解决RPC调用的线程数

dfs.datanode.handler.count

DataNode中用于解决RPC调用的线程数,默认为3。可适当减少这个数值来晋升DataNode RPC服务的并发度,线程数的进步将减少DataNode的内存需要,因而,不宜适度调整这个数值。咱们产线环境设置的是10

11.DataNode最大传输线程数

dfs.datanode.max.xcievers

最大传输线程数 指定在 DataNode 内外传输数据应用的最大线程数。

这个值是指定 datanode 可同時解决的最大文件数量,举荐将这个值调大,默认是256,最大值能够配置为65535,咱们产线环境配置的是8192。

12.读写数据时的缓存大小

io.file.buffer.size

–设定在读写数据时的缓存大小,应该为硬件分页大小的2倍

咱们产线环境设置的为65536 ( 64K)

13.冗余数据块删除

在日常保护hadoop集群的过程中发现这样一种状况:

某个节点因为网络故障或者DataNode过程死亡,被NameNode断定为死亡,HDFS马上主动开始数据块的容错拷贝;当该节点从新增加到集群中时,因为该节点上的数据其实并没有损坏,所以造成了HDFS上某些block的备份数超过了设定的备份数。通过观察发现,这些多余的数据块通过很长的一段时间才会被齐全删除掉,那么这个工夫取决于什么呢?

该工夫的长短跟数据块报告的间隔时间无关。Datanode会定期将以后该结点上所有的BLOCK信息报告给NameNode,参数dfs.blockreport.intervalMsec就是管制这个报告距离的参数。

hdfs-site.xml文件中有一个参数:

<property>

<name>dfs.blockreport.intervalMsec</name>

<value>3600000</value>

<description>Determines block reporting interval in milliseconds.</description>

</property>

其中3600000为默认设置,3600000毫秒,即1个小时,也就是说,块报告的工夫距离为1个小时,所以通过了很长时间这些多余的块才被删除掉。通过理论测试发现,当把该参数调整的稍小一点的时候(60秒),多余的数据块的确很快就被删除了

14.新增块提早汇报

当datanode上新写完一个块,默认会立刻汇报给namenode。在一个大规模Hadoop集群上,每时每刻都在写数据,datanode上随时都会有写完数据块而后汇报给namenode的状况。因而namenode会频繁解决datanode这种快汇报申请,会频繁地持有锁,其实十分影响其余rpc的解决和响应工夫。

通过提早快汇报配置能够缩小datanode写完块后的块汇报次数,进步namenode解决rpc的响应工夫和处理速度。

<property>

<name>dfs.blockreport.incremental.intervalMsec</name>

<value>300</value>

</property>

咱们产线环境HDFS集群上此参数配置为500毫秒,就是当datanode新写一个块,不是立刻汇报给namenode,而是要期待500毫秒,在此时间段内新写的块一次性汇报给namenode。

15.增大同时关上的文件描述符和网络连接下限

应用ulimit命令将容许同时关上的文件描述符数目下限增大至一个适合的值。同时调整内核参数net.core.somaxconn网络连接数目至一个足够大的值。

补充:net.core.somaxconn的作用

net.core.somaxconn是Linux中的一个kernel参数,示意socket监听(listen)的backlog下限。什么是backlog呢?backlog就是socket的监听队列,当一个申请(request)尚未被解决或建设时,它会进入backlog。而socket server能够一次性解决backlog中的所有申请,解决后的申请不再位于监听队列中。当server解决申请较慢,以至于监听队列被填满后,新来的申请会被回绝。在Hadoop 1.0中,参数ipc.server.listen.queue.size管制了服务端socket的监听队列长度,即backlog长度,默认值是128。而Linux的参数net.core.somaxconn默认值同样为128。当服务端忙碌时,如NameNode或JobTracker,128是远远不够的。这样就须要增大backlog,例如咱们的集群就将ipc.server.listen.queue.size设成了32768,为了使得整个参数达到预期成果,同样须要将kernel参数net.core.somaxconn设成一个大于等于32768的值。