蹉跎莫遣韶光老,人生唯有读书好。这篇文章主要讲述#yyds干货盘点#Hadoop企业级生产调优手册相关的知识,希望能为你提供帮助。
一、HDFS核心参数
1.1 NameNode内存生产配置
1. NameNode 内存计算
每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块呢?128*128*1024*1024/150Byte≈9.1亿
2. Hadoop2.x 系列, 配置 NameNode 内存
NameNode 内存默认 2000m,如果服务器内存 4G, NameNode 内存可以配置 3G。在 hadoop-env.sh
文件中配置如下。
HADOOP_NAMENODE_OPTS= Xmx 3072 m
3. Hadoop3.x 系列,配置 NameNode 内存
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
查看 NameNode 占用内存
[Tom@hadoop102 hadoop-3.1.3]$ jps
3136 JobHistoryServer
3200 Jps
2947 NodeManager
2486 NameNode
2622 DataNode
[Tom@hadoop102 hadoop-3.1.3]$ jps -heap 2486
Heap Configuration:
MinHeapFreeRatio= 40
MaxHeapFreeRatio= 70
MaxHeapSize= 478150656 (456.0MB)
查看 DataNode 占用内存
[Tom@hadoop102 hadoop-3.1.3]$ jmap -heap 2622
Heap Configuration:
MinHeapFreeRatio= 40
MaxHeapFreeRatio= 70
MaxHeapSize= 478150656 (456.0MB)
查看发现 hadoop102 上的 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"
1.2 NameNode心跳并发配置
文章图片
NameNode 有一个工作线程池,用来处理不同 DataNode 的并发心跳以及客户端并发的元数据操作 。对于大集群或者有大量客户端的集群来说,通常需要增大该参数 。 默认值是 10 。
<
property>
<
name>
dfs.namenode.handler.count<
/name>
<
value>
21<
/value>
<
/property>
企业经验:dfs.namenode.handler.count=20 × logeClustersize ,比如集群规模 (DataNode 台数)为 3 台时,此参数设置为 21。可通过简单的 python 代码计算该值,代码如下。
[Tom@hadoop102 hadoop-3.1.3]$ python
Python 2.7.5 (default, Oct 14 2020, 14:45:30)
[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
>
>
>
quit()
1.3 开启回收站配置
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。
1. 回收站工作机制
文章图片
2. 开启回收站功能参数说明
默认值
fs.trash.interval = 0
,0 表示禁用回收站,其他值表示设置文件的存活时间。默认值
fs.trash.checkpoint.interval = 0
,检查回收站的间隔时间。如果该值为 0,则该值设置和 fs.trash.interval
的参数值相等。要求
fs.trash.checkpoint.interval &
lt;
= fs.trash.interval
。3. 启用回收站
修改
core-site.xml
配置,垃圾回收时间为 1 分钟。<
property>
<
name>
fs.trash.interval<
/name>
<
value>
1<
/value>
<
/property>
4. 查看回收站
回收站目录在 HDFS 集群中的路径:
/user/Tom/.Trash/….
5. 注意:通过网页上直接删除的文件也不会走回收站。
6. 通过程序删除的文件不会经过回收站,需要调用 moveToTrash() 才进入回收站
Trash trash = N ew Trash(conf);
trash.moveToTrash(path);
7. 只有在命令行利用
hadoop fs -rm
命令删除的文件才会走回收站。[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /input
2021-06-24 18:20:36,515 INFO fs.TrashPolicyDefault: Moved: hdfs://hadoop102:8020/input to trash at: hdfs://hadoop102:8020/user/Tom/.Trash/Current/input
(8)恢复回收站数据
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /user/Tom/.Trash/Current/input /input
二、HDFS集群压测在企业中非常关心每天从 Java 后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从 HDFS 上拉取需要的数据?
为了搞清楚 HDFS 的读写性能,生产环境上非常需要对集群进行压测。
文章图片
HDFS 的读写性能主要受网络和磁盘影响比较大。为了方便测试,将 hadoop102、hadoop103、 hadoop104 虚拟机网络都设置为 100mbps。
文章图片
测试网速:来到 hadoop102 的 /opt/software 目录, 创建一个
[Tom@hadoop102 software]$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
文章图片
2.1 测试HDFS写性能
写测试底层原理
文章图片
测试内容: 向 HDFS 集群写 5 个 128M 的文件
注意: nrFiles n 为生成 mapTask 的数量,生产环境一般可通过 hadoop103:8088 查看 CPU 核数,设置为(CPU 核数 - 1)
[Tom@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 5 -fileSize 128MB
2021-06-24 21:58:25,548 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2021-06-24 21:58:25,568 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Date &
time: Thu Jun 24 21:58:25 CST 2021
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Number of files: 5
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Total MBytes processed: 640
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Throughput mb/sec: 0.88
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Average IO rate mb/sec: 0.88
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:IO rate std deviation: 0.04
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:Test exec time sec: 246.54
2021-06-24 21:58:25,568 INFO fs.TestDFSIO:
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 处理的差值,越小越均衡
yarn-site.xml
中设置虚拟内存检测为 false。然后分发配置并重启集群。<
!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<
property>
<
name>
yarn.nodemanager.vmem-check-enabled<
/name>
<
value>
false<
/value>
<
/property>
测试结果分析
由于副本 1 就在本地,所以该副本不参与测试
文章图片
一共参与测试的文件:
5 个文件 * 2 个副本 = 10 个
压测后的速度: 0.88
实测速度:0.88M/s * 10 个文件 ≈ 8.8M/s
三台服务器的带宽:12.5 + 12.5 + 12.5 ≈ 30m/s
所有网络资源没有用满。
如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数。
文章图片
如果客户端不在集群节点,那就三个副本都参与计算
2.2 测试HDFS读性能
测试内容:读取 HDFS 集群 5 个 128M 的文件
[Tom@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 5 -fileSize 128MB2021-06-25 17:34:41,179 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
2021-06-25 17:34:41,181 INFO fs.TestDFSIO:Date &
time: Fri Jun 25 17:34:41 CST 2021
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:Number of files: 5
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:Total MBytes processed: 640
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:Throughput mb/sec: 4.6
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:Average IO rate mb/sec: 4.74
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:IO rate std deviation: 0.93
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:Test exec time sec: 82.47
2021-06-25 17:34:41,182 INFO fs.TestDFSIO:
删除测试生成数据
[Tom@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean
三、HDFS多目录 3.1 NameNode多目录配置
NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
文章图片
具体配置如下
(1)在
hdfs-site.xml
文件中添加如下内容<
property>
<
name>
dfs.namenode.name.dir<
/name>
<
value>
file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2<
/value>
<
/property>
注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,可以选择不分发。
(2)停止集群,删除三台节点的 data 和 logs 中所有数据。
[Tom@hadoop102 hadoop 3.1.3 ]$ rm rf data/ logs/
[Tom@hadoop103 hadoop 3.1.3 ]$ rm rf data/ logs/
[Tom@hadoop104 hadoop 3.1.3 ]$ rm rf data/ logs/
(3)格式化集群并启动。
[Tom@hadoop102 hadoop 3.1.3 ]$ bin/hdfs namenode format
[Tom@hadoop102 hadoop 3.1.3 ]$ sbin/start dfs.sh
查看结果
[Tom@hadoop102 dfs]$ ll
总用量12
drwx------. 3 Tom Tom 4096 12月11 08:03 data
drwxrwxr-x. 3 Tom Tom 4096 12月11 08:03 name1
drwxrwxr-x. 3 Tom Tom 4096 12月11 08:03 name2
检查 name1 和 name2 里面的内容,发现一模一样。
3.2 DataNode多目录配置
DataNode 可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)
文章图片
具体配置如下
(1)在
hdfs-site.xml
文件中添加如下内容<
property>
<
name>
dfs.datanode.data.dir<
/name>
<
value>
file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2<
/value>
<
/property>
查看结果
[Tom@hadoop102 dfs]$ ll
总用量12
drwx------. 3 Tom Tom 4096 4月4 14:22 data1
drwx------. 3 Tom Tom 4096 4月4 14:22 data2
drwxrwxr-x. 3 Tom Tom 4096 12月11 08:03 name1
drwxrwxr-x. 3 Tom Tom 4096 12月11 08:03 name2
向集群上传一个文件,再次观察两个文件夹里面的内容发现不一致 (一个有数一个没有)
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt /
3.3 集群数据均衡之磁盘间数据均衡
生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。( Hadoop3.x 新特性)
文章图片
(1)生成均衡计划(我只有一块磁盘,不会生成计划)
[Tom@hadoop102 hadoop-3.1.3]$ hdfs diskbalancer -plan hadoop102
(2)执行均衡计划
[Tom@hadoop102 hadoop-3.1.3]$ hdfs diskbalancer -execute hadoop102.plan.json
(3)查看当前均衡任务的执行情况
[Tom@hadoop102 hadoop-3.1.3]$ hdfs diskbalancer -query hadoop102
(4)取消均衡任务
[Tom@hadoop102 hadoop-3.1.3]$ hdfs diskbalancer -cancel hadoop102.plan.json
四、HDFS集群扩容及缩容 4.1 添加白名单
白名单:表示在白名单的主机 IP 地址可以用来存储数据。
企业中:配置白名单,可以尽量防止恶意访问。
文章图片
配置白名单步骤如下:
在 NameNode 节点的 /opt/module/hadoop-3.1.3/etc/hadoop 目录下分别创建 whitelist 和 blacklist 文件
(1)创建白名单
[Tom@hadoop102 hadoop]$ vim whitelist
在 whitelist 中添加下主机名称,假如集群正常工作的节点为 102 103
hadoop102
hadoop103
(2)创建黑名单,保持空的就可以
[Tom@hadoop102 hadoop]$ touch blacklist
在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数
<
!--白名单-->
<
property>
<
name>
dfs.hosts<
/name>
<
value>
/opt/module/hadoop-3.1.3/etc/hadoop/whitelist<
/value>
<
/property>
<
!--黑名单-->
<
property>
<
name>
dfs.hosts.exclude<
/name>
<
value>
/opt/module/hadoop-3.1.3/etc/hadoop/blacklist<
/value>
<
/property>
分发配置文件 whitelist hdfs-site.xml
[Tom@hadoop104 hadoop]$ xsync hdfs site.xml whitelist
第一次添加白名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可
[Tom@hadoop102 hadoop 3.1.3]$ myhadoop.sh stop
[Tom@hadoop102 hadoop 3.1.3]$ myhadoop.sh start
在 web 浏览器上查看 DN,http://hadoop102:9870/dfshealth.html#tab-datanode
文章图片
在 hadoop104 上执行上传数据数据失败
[Tom@hadoop104 hadoop-3.1.3]$ hadoop fs -put NOTICE.txt /
文章图片
二次修改白名单,增加 hadoop104
[Tom@hadoop102 hadoop]$ vim whitelist
修改为如下内容
hadoop102
hadoop103
hadoo p104
刷新 NameNode
[Tom@hadoop102 hadoop 3.1.3]$ hdfs dfsadmin refreshNodes
Refresh nodes successful
在 web 浏览器上查看 DN http://hadoop102:9870/dfshealth.html#tab-datanode
文章图片
4.2 服役新服务器
需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
环境准备
(1)在 hadoop100 主机上再克隆一台 hadoop105 主机
(2)修改 IP 地址和主机名称
[root@hadoop105 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop105 ~]# vim /etc/hostname
(3)拷贝 hadoop102 的 /opt/module 目录和 /etc/profile.d/my_env.sh 到 hadoop105
[Tom@hadoop102 opt]$ scp-r module/* Tom@hadoop105:/opt/module/
[Tom@hadoop102 opt]$ sudo scp/etc/profile.d/my_env.sh root@hadoop105:/etc/profile.d/my_env.sh
[Tom@hadoop105 hadoop-3.1.3]$ source /etc/profile
(4)删除 hadoop105 上 Hadoop 的历史数据, data 和 logs 数据
[Tom@hadoop105 hadoop 3.1.3]$ rm rf data/ logs/
(5)配置 hadoop102 和 hadoop103 到 hadoop105 的 ssh 无密登录
[ hadoop102 .ssh]$ ssh copy id hadoop105
[ hadoop103 .ssh]$ ssh copy id hadoop105
服役新节点具体步骤
(1)直接启动 DataNode 即可关联到集群
[Tom@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode
[Tom@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager
文章图片
在白名单中增加新服役的服务器
(1)在白名单 whitelist 中增加 hadoop104、 hadoop105,并重启集群
[Tom@hadoop102 hadoop]$ vim whitelist
修改为如下内容
hadoop102
hadoop103
hadoop104
hadoop105
(2)分发
[Tom@hadoop102 hadoop]$ xsync whitelist
(3)刷新 NameNode
[Tom@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
在 hadoop105 上上传文件
[Tom@hadoop105 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-3.1.3/LICENSE.txt /
文章图片
4.3 服务器间数据均衡
企业经验
在企业开发中,如果经常在 hadoop102 和 hadoop104 上提交任务,且副本数为 2,由于数据本地性原则,就会导致 hadoop102 和 hadoop104 数据过多, hadoop103 存储的数据量小。
另一种情况,就是新服役的服务器数据量比较少,需要执行集群均衡命令。
文章图片
开启数据均衡命令
[Tom@hadoop105 hadoop 3.1.3]$ sbin/start balancer.sh
threshold 10
对于参数 10,代表的是集群中各个节点的磁盘空间利用率相差不超过 10\\%,可根据实际情况进行调整。
停止数据均衡命令
[Tom@hadoop105 hadoop-3.1.3]$ sbin/stop-balancer.sh
注意 :由于 HDFS 需要启动单独的 Rebalance Server 来执行 Rebalance 操作, 所以尽量不要在 NameNode 上执行 start-balancer.sh,而是找一台比较空闲的机器。
4.4 黑名单退役服务器
黑名单:表示在黑名单的主机 IP 地址不可以用来存储数据。
企业中:配置黑名单,用来退役服务器。
文章图片
黑名单配置步骤如下:
编辑 /opt/module/hadoop-3.1.3/etc/hadoop 目录下的 blacklist 文件
[Tom@hadoop102 hadoop vim blacklist
添加如下主机名称(要退役的节点)
hadoop105
【#yyds干货盘点#Hadoop企业级生产调优手册】注意:如果白名单中没有配置,需要在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数
<
!--黑名单-->
<
property>
<
name>
dfs.hosts.exclude<
/name>
<
value>
/opt/module/hadoop-3.1.3/etc/hadoop/blacklist<
/value>
<
/property>
分发配置文件 blacklist,hdfs-site.xml
[Tom@hadoop104 hadoop]$ xsync hdfs-site.xml blacklist
第一次添加黑名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可
[Tom@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
检查 Web 浏览器 ,退役节点的状态为 decommission in progress(退役中,说明数据节点正在复制块到其他节点)
文章图片
等待退役节点状态为 decommissioned(所有块已经复制完成 ),停止该节点及节点资源管理器。 注意 :如果副本数是 3 服役的节点小于等于 3,是不能退役成功的,需要修改副本数后才能退役。
文章图片
[Tom@hadoop105 hadoop-3.1.3]$ hdfs --daemon stop datanode[Tom@hadoop105 hadoop-3.1.3]$ yarn--daemon stop nodemanager
如果数据不均衡,可以用命令实现集群的再平衡
[Tom@hadoop102 hadoop-3.1.3]$ sbin/start-balancer.sh -threshold 10
参考文档:
- 美团数据平台及数仓建设实践,超十万字总结
- 上百本优质大数据书籍,附必读清单(大数据宝藏)
- 五万字 | 耗时一个月整理出这份Hadoop吐血宝典
推荐阅读
- Pandas学习笔记02处理数据实用操作
- k8s 1.22.4 kubeadm 部署
- Java 项目中使用 Resilience4j 框架实现故障隔离
- 图解 Eureka 的缓存架构 #yyds干货盘点#
- kubeadm快速部署K8S 1.20集群
- #yyds干货盘点#Java ASM系列((096)检测潜在的NPE)
- k8s中pod删不掉
- Linux 中的 15 个强大的 firewall-cmd 命令,牛牛牛!
- 如何在Linux中使用Shell脚本终止用户会话()