注:本系列主要对Hadoop生态下的组件,如HDFS、MR、Yarn等在生产条件下的调优做了总结与论述,如有错误欢迎读者提出并补充
本系列将持续更新,希望大家一键三连支持!!!♥♥♥
本系列将持续更新,希望大家一键三连支持!!!♥♥♥
本系列将持续更新,希望大家一键三连支持!!!♥♥♥
标题
一. HDFS—核心参数
1.1 NameNode 内存生产配置
1.1.1 NameNode内存计算
每个文件块
大概占用150byte
,一台服务器 128G
内存为例,能存储多少文件块呢?
答:128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1 亿
1.1.2 Hadoop2.x系列配置NameNode内存
NameNode
内存默认2000M
,如果服务器内存 4G,NameNode 内存可以配置 3G。在hadoop-env.sh
文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m
1.1.3 Hadoop3.x系列配置NameNode内存
(1) hadoop-env.sh中描述Hadoop的内存是如何动态分配的
3.x系列开始,内存开始动态分配
,在hadoop-env.sh
配置文件中,可以找到分配的相关描述:
(2)查看NameNode占用内存
(3) 查看DataNode占用内存
注:
jmap -heap 进程号
得到的是相应进程
的占用内存
信息,通过jps
查看NN
和DN
的进程号
即可获取相应内存信息
.
查看发现hadoop102
上的NN和DN占用内存
都是自动分配
的,不够合理,生产环境中通常如下调整:
具体通过修改hadoop-env.sh
配置文件中的参数:
上述调整把hadoop102
上的NN和DN
节点的最大占用内存
均调整为了1GB
,此时再次查看内存信息:
同样DN被分配的最大内存也变成了1024MB=1GB
1.2 NameNode 心跳并发配置
作为Hadoop Cluster
中的NN
,它的主要任务主要有:
(1)处理来自Client的请求并响应
(2)存储hdfs文件的元数据信息
(3)与DN保持心跳,了解DN节点的存活状态,保证数据传输的可靠性。
生产环境中同一时刻可能有来自多个DN的心跳和client请求,因此并发线程的数量是极为重要的。
查看hdfs-site.xml
文件:
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是 10。
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
企业经验:dfs.namenode.handler.count=20 × 𝑙𝑜𝑔𝑒(𝐶𝑙𝑢𝑠𝑡𝑒𝑟 𝑆𝑖𝑧𝑒)
,比如集群规模
(DataNode 台
数)为3台
时,此参数设置为21
。可通过简单的 python 代码计算该值,代码如下。
1.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>
注:以下两种情况删除的文件不会进入回收站:
(1)通过网页上直接删除的文件
(2)通过程序删除的文件不会经过回收站,需要调用 moveToTrash()
才进入回收站:
Trash trash = New Trash(conf); trash.moveToTrash(path);
4)只有在命令行利用 hadoop fs -rm 命令删除的文件才会走回收站。
查看HDFS web
端数据:
发现原本在根目录下的fusir.txt
已被转移到
回收站/user/root/.Trash/Current/
目录下。
5)恢复回收站数据
这里由于我们设置的回收站自动回收时间只有1分钟,所以还没来得及通过mv指令恢复就已经被回收了,如果设置的自动回收时间长一些,就能通过该命令进行恢复.
二. HDFS—集群压测
企业中非常关心每天从 Java 后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从 HDFS 上拉取需要的数据?
为搞清楚 HDFS 的读写性能
,生产环境上非常需要对集群进行压测
。
HDFS 的读写性能
主要受网络和磁盘
影响比较大。为了方便测试,将 hadoop102、hadoop103、hadoop104
虚拟机网络
都设置为 100Mbps
。
100Mbps 单位是 bit;10M/s 单位是 byte ; 1byte=8bit,100Mbps/8=12.5M/s。
测试网速:来到 hadoop102 的/opt/module 目录,开启一个端口使得外部能访问下载该目录下的文件:
通过外部网页访问hadoop102:8000页面下载指定文件:
改变带宽为不受限
再次查看网络下载速度:
2.1 测试HDFS写性能
(1)写测试底层原理
(2) 测试内容:向 HDFS 集群写 10 个 128M 的文件
注意:
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 处理的差值,越小越均衡
如果测试过程中,出现异常:(由于虚拟内存不够导致)
1)可以在 yarn-site.xml 中设置虚拟内存检测为 false,然后分发该配置文件并重启 Yarn 集群==
<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property>
(3)测试结果分析
由于副本 1 就在本地,所以该副本不参与测试
一共参与测试的文件:10 个文件 * 2 个副本 = 20 个
压测后的速度:1.52
实测速度:1.61M/s * 20 个文件 ≈ 30M/s
三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s
所有网络资源都已经用满。
如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘
或者增加磁盘个数
。
如果客户端不在集群节点,那就三个副本都参与计算:
2.2 测试HDFS读性能
1)测试内容:读取 HDFS 集群 10 个 128M 的文件
2)删除测试生成数据
3)测试结果分析:为什么读取文件速度大于网络带宽?由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。
总结:
HDFS读写性能
主要受网络与磁盘影响很大
,根据情况不同,如果是网络原因
适当调整网络带宽
,如果是磁盘原因
则选用读写速度更快的硬盘
!