您的位置 首页 大数据运维

HDFS 参数 调优

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.bandwidthPeRegionServerec

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.xcieveRegionServer

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 之间、

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

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.xcieveRegionServer

最大传输线程数 指定在 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>

我们产线环境 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 的值.

 

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章