zl程序教程

您现在的位置是:首页 >  后端

当前栏目

HDFS 参数调优

HDFS 参数 调优
2023-09-14 09:14:49 时间

NameNode 数据目录

  • 本地文件系统路径,决定 NN 在何处存放 fsimage 和 editlog 文件
  • 通过 , 分隔指定多个路径
  • 生产环境可配置多个目录,并存放在 RAID1 或 RAID5 的磁盘上
dfs.name.dir
dfs.namenode.name.dir

DataNode 数据目录

  • DN 存放块数据的本地盘路径
  • 通过 , 分隔指定多个路径
  • 在生产环境 一般 DN 上挂多块盘
dfs.data.dir
dfs.datanode.data.dir

数据块的副本数

数据块的副本数,默认值 : 3

dfs.replication

数据块大小

HDFS 数据块的大小,默认 : 128M

  • 根据 block 数量 , 调大数据块大小
dfs.block.size

HDFS 做均衡时使用的最大带宽

HDFS 做均衡时使用的最大带宽,默认为 1048576 ( 1MB/s )

  • 对千兆或 万兆带宽的集群 , 可以在 balancer 时 , 设置 50M/s~100M/s
dfs.datanode.balance.bandwidthPeRegionServerec

磁盘可损坏数

DN 多少块盘损坏后停止服务,默认 : 0 ( 任何磁盘故障就关闭 DN )

  • 对盘较多的集群,磁盘故障是常态,可以设置为 1 或 2,避免频繁 DN 下线
dfs.datanode.failed.volumes.tolerated

数据传输连接数

DataNode 同时处理的数据传输连接数 ( DN内外传输数据使用的最大线程数 )

  • 官方改名 : dfs.datanode.max.transfer.threads ,默认值 : 4096
  • 集群大 , 推荐值 : 8192
dfs.datanode.max.xcieveRegionServer

NameNode 处理 RPC 调用的线程数

NameNode 中用于处理 RPC 调用的线程数,默认 : 10

  • 集群大,建议值:800+ 节点配置 : 200~500 之间

计算 :

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

NameNode 处理 DataNode 上报数据块和心跳的线程数

处理 datanode 上报数据块和心跳的线程数量,与 dfs.namenode.handler.count 一致

dfs.namenode.service.handler.count

DataNode 处理 RPC 调用的线程数

datanode 中用于处理 RPC 调用的线程数,默认 : 3

  • 线程数的提高 , 会增加 datanode 的内存需求,推荐值 : 10
dfs.datanode.handler.count

DataNode 最大传输线程数

最大传输线程数 ( DataNode 内外传输数据使用的最大线程数 ) , 默认 : 256

  • DataNode 同时处理的最大文件数量,最大值 : 65535,推荐值 : 8192
dfs.datanode.max.xcieveRegionServer

读写数据时的缓存大小

读写数据时的缓存大小,应为 硬件分页大小的 2 倍

  • 集群大 , 推荐值 : 65536 ( 64K)
io.file.buffer.size

冗余数据块删除

现象 : 当某个节点由于网络故障或 DataNode 进程死亡,被 NameNode 判定为死亡,HDFS 就自动开始数据块的容错拷贝;当该节点重新添加到集群中时,但该节点上的数据没有被损坏,而导致 HDFS 上某些 block 的备份数超过设定的备份数 , 这些多余的数据块经过多久才会被删除

DataNode 会定期将当前该结点上所有的 BLOCK 信息报告给 NameNode , 默认值 : 3600000 ( 1 小时 )

当把该值调小(60 秒),多余的数据块会很快被删除

hdfs-site.xml :

<property>
    <name>dfs.blockreport.intervalMsec</name>
    <value>3600000</value>
    <description>Determines block reporting interval in milliseconds.</description>
</property>

新增块延迟汇报

当 DataNode 新写完一个块,默认会立即汇报给 NameNode , 当 NameNode 频繁处理 DataNode 这种快汇报请求,会频繁持有锁,影响其他 Rpc 的处理和响应时间

通过增加延迟汇报来减少 DataNode 写完块后的块汇报次数,提高 NameNode 处理 Rpc 的响应时间和处理速度

<property>
    <name>dfs.blockreport.incremental.intervalMsec</name>
    <value>300</value>
</property>

大集群 , 推荐值 : 500 毫秒,当 DataNode 新写一个块,等待 500 毫秒,在此时间段内新写块一次性汇报给 NameNode

增大同时打开的文件描述符和网络连接上限

允许同时打开的文件描述符数目

ulimit

Linux参数 net.core.somaxconn : socket 监听(listen)的 backlog 上限

backlog : socket 的监听队列,当一个请求(request)未被处理或建立时,会进入 backlog

当集群的服务端 socket 的监听队列长度 ipc.server.listen.queue.size 设成 : 32768,同时需要将 Linux 的 net.core.somaxconn 设成 >= 32768