143-147-Hadoop-nn配置-集群压测相关:
HDFS—核心参数
NameNode 内存生产配置
1)NameNode 内存计算
每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块呢?
128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿
G MB KB Byte
2)Hadoop2.x 系列,配置 NameNode 内存
NameNode 内存默认 2000m,如果服务器内存 4G,NameNode 内存可以配置 3g。在
hadoop-env.sh 文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m
3)Hadoop3.x 系列,配置 NameNode 内存
(1)hadoop-env.sh 中描述 Hadoop 的内存是动态分配的
启动集群
(2)查看 NameNode 占用内存
jps jmap -heap 进程id
(3)查看 DataNode 占用内存
查看发现 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"
修改完毕需要重启集群
NameNode 心跳并发配置
namenode需要接收datanode的心跳以及客户端的请求等
1)hdfs-site.xml
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.
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发
的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是 10。
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
企业经验:dfs.namenode.handler.count=20 × 𝑙𝑜𝑔𝑒
𝐶𝑙𝑢𝑠𝑡𝑒𝑟 𝑆𝑖𝑧𝑒,比如集群规模(DataNode 台
数)为 3 台时,此参数设置为 21。可通过简单的 python 代码计算该值,代码如下。
int(20*math.log(3))
开启回收站配置
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、
备份等作用。
1)回收站工作机制
2)开启回收站功能参数说明
(1)默认值 fs.trash.interval = 0,0 表示禁用回收站;其他值表示设置文件的存活时间。
(2)默认值 fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为 0,则该
值设置和 fs.trash.interval 的参数值相等。
(3)要求 fs.trash.checkpoint.interval <= fs.trash.interval
3)启用回收站
修改 core-site.xml,配置垃圾回收时间为 1 分钟。
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
4)查看回收站
回收站目录在 HDFS 集群中的路径:/user/atguigu/.Trash/….
5)注意:通过网页上直接删除的文件也不会走回收站。
6)通过程序删除的文件不会经过回收站,需要调用 moveToTrash()才进入回收站
Trash trash = New Trash(conf);
trash.moveToTrash(path);
7)只有在命令行利用 hadoop fs -rm 命令删除的文件才会走回收站。
hadoop fs -rm -r /user/atguigu/input
8)恢复回收站数据
hadoop fs -mv /user/atguigu/.Trash/Current/user/atguigu/input /user/atguigu/input
HDFS**—集群压测**
100Mbps 单位是 bit;10M/s 单位是 byte ; 1byte=8bit,100Mbps/8=12.5M/s。
测试 HDFS 写性能
写测试底层原理
1)测试内容:向 HDFS 集群写 10 个 128M 的文件
[root@hadoop102 hadoop-3.1.4]# hadoop jar /opt/module/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
注意:nrFiles n 为生成 mapTask 的数量,生产环境一般可通过 hadoop103:8088 查看 CPU
核数,设置为(CPU 核数 - 1)
➢ Number of files:生成 mapTask 数量,一般是集群中(CPU 核数-1),我们测试虚
拟机就按照实际的物理内存-1 分配即可
➢ Total MBytes processed:单个 map 处理的文件大小
➢ Throughput mb/sec:单个 mapTak 的吞吐量
计算方式:处理的总文件大小/每一个 mapTask 写数据的时间累加
集群整体吞吐量:生成 mapTask 数量*单个 mapTak 的吞吐量
➢ Average IO rate mb/sec::平均 mapTak 的吞吐量
计算方式:每个 mapTask 处理文件大小/每一个 mapTask 写数据的时间
全部相加除以 task 数量
➢ IO rate std deviation:方差、反映各个 mapTask 处理的差值,越小越均衡
2)注意:如果测试过程中,出现异常
(1)可以在 yarn-site.xml 中设置虚拟内存检测为 false
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则
直接将其杀掉,默认是 true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
(2)分发配置并重启 Yarn 集群
3)测试结果分析 (了解)
(1)由于副本 1 就在本地,所以该副本不参与测试
一共参与测试的文件:10 个文件 * 2 个副本 = 20 个
压测后的速度:1.61
实测速度:1.61M/s * 20 个文件 ≈ 32M/s
三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s
所有网络资源都已经用满。
如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘
或者增加磁盘个数。
(2)如果客户端不在集群节点,那就三个副本都参与计算
测试 HDFS 读性能
1)测试内容:读取 HDFS 集群 10 个 128M 的文件
[root@hadoop102 hadoop-3.1.4]# hadoop jar /opt/module/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
2)删除测试生成数据
[root@hadoop102 hadoop-3.1.4]# hadoop jar /opt/module/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -clean
d -nrFiles 10 -fileSize 128MB
[外链图片转存中...(img-MtIVMpNv-1669213553177)]
2)删除测试生成数据
[root@hadoop102 hadoop-3.1.4]# hadoop jar /opt/module/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.4-tests.jar TestDFSIO -clean