Hadoop 3.x(生产调优手册)----【HDFS--故障排除】
注意:采用三台服务器即可,恢复到 Yarn 开始的服务器快照,
1. NameNode故障处理
1. 需求
NameNode 进程挂掉了并且存储的数据也丢失了,如何恢复 NameNode
2. 故障模拟
- kill -9 NameNode 进程
[fickler@hadoop102 ~]$ kill -9 2043
2043:对应 NameNode 的进程号
- 删除 NameNode 存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)
[fickler@hadoop102 ~]$ rm -rf /opt/module/hadoop-3.1.3/data/dfs/name/*
3. 问题解决
- 拷贝 SecondaryNameNode 中的数据到原 NameNode 存储数据目录
[fickler@hadoop102 dfs]$ scp -r fickler@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/
- 重新启动 NameNode
[fickler@hadoop102 dfs]$ hdfs --daemon start namenode
如果仅是进程挂掉了,那么直接重启 NameNode 即可,但是如果 NameNode 的数据也丢失了,那么直接重启进行是不能够恢复的,需要按照上述步骤操作,才能恢复 NameNode
2. 集群安全模式&磁盘修复
1. 安全模式
文件系统只接受读数据请求,而不接受删除、修改等变更请求
2. 进入安全模式场景
- NameNode 在加载镜像文件和编辑日志期间处于安全模式
- NameNode 再接收 DataNode 注册时,处于安全模式
3. 退出安全模式条件
dfs.namenode.safemode.min.datanodes :最小可用 datanode 数量,默认 0 dfs.namenode.safemode.threshold-pct :副本数达到最小要求的 block 占系统总 block 数的百分比,默认 0.999f。(只允许丢一个块) dfs.namenode.safemode.extension :稳定时间,默认值 30000 毫秒,即 30 秒
4. 基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
5. 案例1:启动集群进行安全模式
- 重新启动集群
[fickler@hadoop102 dfs]$ myhadoop.sh stop
[fickler@hadoop102 dfs]$ myhadoop.sh start
- 集群启动后,立即来到集群上删除数据,提示集群处于安全模式
6. 案例2:磁盘修复
需求:数据块损坏,进入安全模式,如何处理
- 分别进入 hadoop102、hadoop103、hadoop104 的
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1846937455-192.168.10.102-1662454118512/current/finalized/subdir0/subdir0 目录,统一删除某 2 个块信息
[fickler@hadoop103 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1846937455-192.168.10.102-1662454118512/current/finalized/subdir0/subdir0
[fickler@hadoop103 subdir0]$ rm -rf blk_1073741825 blk_1073741825_1001.meta
[fickler@hadoop103 subdir0]$ rm -rf blk_1073741826 blk_1073741826_1002.meta
说明:hadoop103、hadoop104 重复执行以上命令
- 重新启动集群
[fickler@hadoop103 subdir0]$ myhadoop.sh stop
[fickler@hadoop103 subdir0]$ myhadoop.sh start
-
观察 http://hadoop102:9870/dfshealth.html#tab-overview 说明:安全模式已经打开,块的数量没有达到要求。 -
离开安全模式
[fickler@hadoop103 subdir0]$ hdfs dfsadmin -safemode get
Safe mode is ON
[fickler@hadoop103 subdir0]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
- 观察 http://hadoop102:9870/dfshealth.html#tab-overview
- 将元数据删除
删除对应的元数据即可 - 观察 http://hadoop102:9870/dfshealth.html#tab-overview
7. 案例3
需求:模拟等待安全模式
- 查看当前模式
[fickler@hadoop103 hadoop-3.1.3]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
- 先进入安全模式
[fickler@hadoop103 hadoop-3.1.3]$ hdfs dfsadmin -safemode enter
Safe mode is ON
- 创建并执行下面的脚本
[fickler@hadoop103 hadoop-3.1.3]$ vim safemode.sh
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
[fickler@hadoop103 hadoop-3.1.3]$ chmod 777 safemode.sh
[fickler@hadoop103 hadoop-3.1.3]$ ./safemode.sh
- 再打开一个窗口,执行
[fickler@hadoop103 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode leave
- 再观察上一个窗口
Safe mode is OFF
- HDFS 集群上已经有上传的数据了
3. 慢磁盘监控
“慢磁盘” 指的是谢谢如数据非常慢的一类磁盘。其实慢性磁盘并不少见,当机器运行时间长了,上面跑的任务多了,磁盘的读写性能自然会退化,严重时就会出现写入数据延时的问题。 如何发现慢磁盘? 正常在 HDFS 上创建一个目录,只需要不到 1s 的时间。如果你发现创建目录超过 1 分钟以上,而且这个现象并不是每次都有。只是偶尔慢了一下,就很有可能存在慢磁盘。
1. 通过心跳未联系时间。
一般出现慢磁盘现象,会影响到 NameNode 与 DataNode 之间的心跳。正常情况心跳时间间隔是 3s。超过 3s 说明有异常。
2. fio命令,测试磁盘的读写性能
- 顺序读测试
[fickler@hadoop103 ~]$ sudo yum install -y fio
[fickler@hadoop103 ~]$ sudo fio -filename=/home/fickler/test.log -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
- 顺序写测试
[fickler@hadoop102 ~]$ sudo fio -filename=/home/fickler/test.log -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
- 随机写测试
[fickler@hadoop102 ~]$ sudo fio -filename=/home/fickler/test.log -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw
- 混合随机读写
[fickler@hadoop102 ~]$ sudo fio -filename=/home/fickler/test.log -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
4. 小文件归档
1. HDFS存储小文件弊端
每个文件均按块存储,每个块的元数据存储在 NameNode 的内存中,因此 HDFS 存储小文件会非常低效。因为大量的小文件会耗尽 NameNode 中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如,一个 1MB 的文件设置为 128MB 的块存储,实际使用的是 1MB 的磁盘空间,而不是 128MB。
2. 解决存储小文件办法之一
HDFS 存档文件或 HAR 文件,是一个更高效的文件存档工具,它将文件存入 HDFS 块,在减少 NameNode 内存使用的同时,运行对文件进行透明的访问。具体来说,HDFS 存档文件对内还是一个一个独立文件,对 NameNode 而言却是一个整天,减少了 NameNode 的内存。
3. 案例实操
- 需要启动 YARN 进程
[fickler@hadoop103 hadoop-3.1.3]$ start-yarn.sh
- 归档文件
在 /input 目录里面的所有文件归档成一个叫 input.har 的归档文件,并把归档后文件存储到 /output 路径下。
[fickler@hadoop103 hadoop-3.1.3]$ hadoop archive -archiveName input.har -p /input /output
- 查看归档
[fickler@hadoop103 hadoop-3.1.3]$ hadoop fs -ls /output/input.har
[fickler@hadoop103 hadoop-3.1.3]$ hadoop fs -ls har:///output/input.har
- 解归档文件
[fickler@hadoop103 hadoop-3.1.3]$ hadoop fs -cp har:///output/input.har/* /
|