Hadoop生产调优之HDFS-核心参数
1. NameNode 内存生产环境配置
如果每个文件块大概占用 150byte,以一台服务器 128G 内存为例,能存储多少文件块呢?
128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿个
G MB KB Byte
1. Hadoop2.x 配置NameNode内存
NameNode内存默认2000m,如果服务器内存4G,则NameNode内存不应超过服务器内存,可以配置 3g。在hadoop-env.sh 文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m
2. Hadoop3.x 配置NameNode内存
(a) 要知道hadoop-env.sh中描述Hadoop 的内存是动态分配的:
# The maximum amount of heap to use (Java -Xmx). If no unit
# is provided, it will be converted to MB. Daemons will
# prefer any Xmx setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MAX=
# The minimum amount of heap to use (Java -Xms). If no unit
# is provided, it will be converted to MB. Daemons will
# prefer any Xms setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MIN=
HADOOP_NAMENODE_OPTS=-Xmx102400m
(b) 查看NameNode占用内存
[user@hadoop100 ~]$ jps
1697 NameNode
1858 DataNode
2325 JobHistoryServer
2151 NodeManager
2426 Jps
[user@hadoop100 ~]$ jmap -heap 1697
...
MaxHeapSize = 989855744 (944.0MB)
(b) 查看DataNode占用内存
[user@hadoop100 ~]$ jmap -heap 1858
...
MaxHeapSize = 989855744 (944.0MB)
查看发现hadoop100上的NameNode和DataNode占用内存都是自动分配且相等。详细信息参考该文档。
具体修改:hadoop-env.sh
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"
2. NameNode心跳并发配置
这里的心跳指的是DataNode与NameNode间维持节点可用的通信,不是DataNode向NameNode报告块信息的通信。
那么为了维持NameNode的心跳并发,应准备多少线程呢?是根据DataNode决定的吗?
在hdfs-site.xml中配置如下:
<!-- NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是10。 -->
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
<description>The number of Namenode RPC server threads that listen to
requests from clients.
If dfs.namenode.servicerpc-address is not configured then
Namenode RPC server threads listen to requests from all nodes.
</description>
</property>
[user@hadoop100 hadoop]$ python
Python 2.7.5 (default, Jun 28 2022, 15:30:04)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print int(20*math.log(3))
21
>>>
3. 开启回收站配置
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。
1. 回收站工作机制
2. 开启回收站功能参数说明
(a) 默认值 fs.trash.interval = 0,0 表示禁用回收站;其他值表示设置文件的存活时间。
(b) 默认值 fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval 的参数值相等。
(c ) 要求 fs.trash.checkpoint.interval <= fs.trash.interval。
3. 启用回收站
修改 core-site.xml,value为配置垃圾回收时间,如下为1分钟。
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
4. 查看回收站
回收站目录在HDFS集群中的路径:
/user/${username}/.Trash/{timestamp_of_checkpoint_creation}
注意:通过网页上直接删除的文件也不会走回收站。
通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站:
Trash trash = New Trash(conf);
trash.moveToTrash(path);
只有在命令行利用 hadoop fs -rm {path}命令删除的文件才会走回收站。
恢复回收站数据:hadoop fs -mv {path}