乐趣区

关于大数据:大数据开发基础之HDFS参数调优步骤分享

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 的值。

退出移动版