生产调优1 HDFS-核心参数
1 HFDS核心参数
搭建HFDS集群时必须要参考的参数
1.1 NameNode 内存生产配置
问题描述
1) NameNode 内存计算
每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块呢?
128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿
2) Hadoop3.x 系列,配置 NameNode 内存
/opt/module/hadoop-3.1.3/etc/hadoop路径下的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=
查看 NameNode 占用内存
[ranan@hadoop102 hadoop]$ jpsall
=============== hadoop102 ===============
15473 JobHistoryServer
15268 NodeManager
14933 DataNode
15560 Jps
14749 NameNode
=============== hadoop103 ===============
13969 Jps
13218 DataNode
13717 NodeManager
13479 ResourceManager
=============== hadoop104 ===============
13012 Jps
12869 NodeManager
12572 DataNode
12750 SecondaryNameNode
[ranan@hadoop102 hadoop]$ jmap -heap 14749
Heap Configuration:
MaxHeapSize = 1023410176 (976.0MB)
查看 DataNode 占用内存
[ranan@hadoop102 hadoop]$ jmap -heap 14749
MaxHeapSize = 1023410176 (976.0MB)
查看发现 hadoop102 上的 NameNode 和 DataNode 占用内存都是自动分配的,且相等。如果两者同时达到上限(系统也就是976M),明明内存不足了还显示有,就会抢占linux系统内存,不合理。所以需要手动配置。
hadoop-env.sh中配置
经验:
具体修改: hadoop-env.sh
[ranan@hadoop102 hadoop]$ vim hadoop-env.sh
[ranan@hadoop102 hadoop]$ vim hadoop-env.sh
//不修改默认配置信息,选择拼接。 - Xmx1024m进行拼接
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"
[ranan@hadoop102 hadoop]$ xsync hadoop-env.sh
重启集群
[ranan@hadoop102 hadoop]$ myhadoop.sh stop
[ranan@hadoop102 hadoop]$ myhadoop.sh start
查看NameNode内存
[ranan@hadoop103 hadoop]$ jpsall
=============== hadoop102 ===============
22292 NodeManager
22500 JobHistoryServer
21957 DataNode
21766 NameNode
22598 Jps
=============== hadoop103 ===============
19041 Jps
18531 ResourceManager
18824 NodeManager
18314 DataNode
=============== hadoop104 ===============
16787 SecondaryNameNode
16602 DataNode
16906 NodeManager
17069 Jps
[ranan@hadoop102 hadoop]$ jmap -heap 21766
查看DataNode内存
[ranan@hadoop102 hadoop]$ jmap -heap 21957
1.2 NameNode 心跳并发配置
DataNode启动后告诉NameNode本机的块信息(块是否完好),并周期性(默认6个小时)上报所有块消息(块是否完好)。
如果DataNode数量很多,NameNode会准备线程来处理汇报,同时客户端也有可能向NameNode请求。
问题:NameNode准备多少线程合适?
修改hdfs-site.xml配置
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
参数dfs.namenode.hakdler.count
,默认时10
[ranan@hadoop102 ~]$ sudo yum install -y python
[ranan@hadoop102 ~]$ python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more
information.
>>> import math
>>> print int(20*math.log(3))
21
>>> quit()
hdfs-site.xml新增
[ranan@hadoop102 hadoop]$ vim hdfs-site.xml
<!-- 新增 -->
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
1.3 开启回收站配置
开启回收站功能,可以将删除的文件在不超时的情况下,回复原数据,起到防止误删除、备份的等作用。默认是禁用的。
回收站机制
假设文件存活时间设置为fs.trash,interval = 60
60min,每过10min检查回收站里的文件存活时间fs.trash,checkpoint.interval=10
,如果不设置则和文件存活时间间隔一致,每60min检查一次
开启回收站功能参数说明
(1)默认值 fs.trash.interval = 0, 0 表示禁用回收站; 其他值表示设置文件的存活时间。
(2) 默认值 fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为 0,则该值设置和 fs.trash.interval 的参数值相等。
(3) 要求 fs.trash.checkpoint.interval <= fs.trash.interval。
启动回收站-修改core-site.xml
修改 core-site.xml, 配置垃圾回收时间为 1 分钟。
<!--新增-->
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
查看回收站
回收站目录在HDFS集群中的路径:/user/ranan/.Trash/...
注意:通过网页上直接删除是不走回收站的
通过程序删除的文件不会经过回收站,需要调用 moveToTrash()才进入回收站
Trash trash = New Trash(conf);
trash.moveToTrash(path); //删除之后添加到回收站
只有在命令行利用 hadoop fs -rm 命令删除的文件才会走回收站。
[ranan@hadoop102 hadoop]$ hadoop fs -rm /test.txt
2021-11-04 16:25:53,705 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop102:8020/test.txt' to trash at: hdfs://hadoop102:8020/user/ranan/.Trash/Current/test.txt
恢复回收站数据
[ranan@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /user/ranan/.Trash/Current/test.txt /