IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> HDFS 排障 -> 正文阅读

[大数据]HDFS 排障

集群存储超过阈值

两个参数接近阈值时,就需要清理集群上数据 :

  1. HDFS 总文件数:HDFS 存储内有多少文件,警告阈值为 5000W
  2. HDFS 占用比:警戒阈值为 75%,如 : 超过,就告知业务组清理数据

平均负载和磁盘存储

  • 当集群节点的磁盘使用普遍达到了 70%以上时 , 说明存储已经较满 , 建议进行扩容

  • 平均负载如果超过 CPU 核数 2 倍以上时 , 说明有点高,如 : 在 5 ~ 10 倍以上就很高

清理集群数据方法

  1. 当集群存储使用率接近 75%时 , 通知业务组清理数据,务必将存储降到 75% 以下
  2. 通知主要的项目经理 , 必要时通知高层人推进
  3. 无法完成降到 75% 时,通过降副本方式降存储。如 : 大表
  4. HDFS: /opt/hive/hivescratchdir 为 M / R 加工临时目录,7 天以上的数据可以清理
  5. HDFS: /xxx ,该目录下小文件超多 , 文件数阈值 300 万 , 文件入其他库后 , 进行定时清理计划,如 : 接近阈值通知相关人 , 进行手动清理

清理回收站文件

每天定时执行 /home/xxx/trash.sh 清理脚本,来清除所有用户的 .Trash 目录

查看文件大小情况

hadoop fs -du -s -h /user/hadoop/.Trash/

清除该用户文件 , 小心操作

hadoop fs -rm -r /user/hadoop/.Trash/*

.meta 文件损坏

.meta 文件损坏导致 DataNode 进程无法启动

查看日志

发现数条关于无法读取 .meta 文件的报错:

org.apache.hadoop.util.ShellsExitCodeException: du: cannot access `/data/xxx/blk_xxx.meta`: Input/output error

检查文件

进入到 /data/xxx/blk_xxx.meta 目录下,发现该条报错中提到的 meta 文件的属主、属组和权限等信息显示异常

image-20220522011147393

该磁盘下的某几个 meta 文件损坏,导致 DataNode 进程无法启动

解决方法

root 权限取消 hdfsdskxxx 的挂载

sudo umount /data/hdfsdskxxx

fsck 修复磁盘

sudo fsck /data/hdfsdskxxx

启动 DataNode

./sbin/hadoop-daemon.sh start datanode

如果磁盘无法通过 fsck 修复,就找 IAAS 人处理该磁盘

多个 DataNode 节点存储不足

HDFS 页面显示所有 DataNode 存储的标准差已达 11%(正常情况下 : 5%)

image-20220521230807772

在空闲(内存占用低)的节点启动 balancer

设置 balancer 所能占用的带宽

带宽的大小与负载均衡的速度成正比,但是速度过大可能会导致 map/reduce 运行缓慢,所以务必选择业务空闲时间段启动 balancer。默认的带宽为 1048576(1M/S)。由于 balancer 可以在中断后重新执行(类似于迅雷的断点续传),所以可以先设置一个较低的带宽,慢了的话,再一次次加速。

此处设置为 2M/S。注意 : balancer 每次设置的带宽是临时性的,第二次启动 balancer 时,要重新设置带宽

hdfs dfsadmin -setBalancerBandwidth 2000000

执行 balancer

在内存占用较低的节点上启动 balancer 脚本,将 HDFS 中所有节点的存储值中的最低值和平均值的差值设置为 5

启动 balancer 后,在屏幕输出了 balancer 的日志路径

start-balancer.sh -threshold 5

查看进程

jps -l

image-20220526100548456

查看 Balancer 的进展

HDFS 页面中的存储变化来间接反映 balancer 的进展外,还可以通过日志来量化其进展

more /app/hadoop/hadoop-3.1.2/logs/hadoop-hdfs-balancer-node196.out
more /app/hadoop/hadoop-3.1.2/logs/hadoop-hdfs-balancer-node196.log

image-20220526101013335

定时执行 balancer

每天的定时计划 :

  • 停止昨天的 balancer
  • 设置带宽(非必须 )
  • 启动今天的 balancer ( 避开主机繁忙期 )

DataNode 坏盘故障

发现数据坏盘的方式有两种,通过监控系统自动报警和在 CM 页面里肉眼观察

肉眼观察:在 HDFS 页面的 DataNodes 目录 (http://132.35.xx.xx:50070/dfshealth.html#tab-datanode)里,观察 Failed Volumes 列的数值,若有非 0 值,则该值对应的 DataNode 有坏盘

image-20220526101248273

停止 Hadoop 上的进程

通知硬件侧更换硬盘

DataNode 存储超过阈值

Hadoop 盘的存储率超过了 90%

查看磁盘

df -h

image-20220526101420711

检查 HDFS 存储

由于 DataNode 单块磁盘的存储过高,导致整个集群的 HDFS 存储超过了 75%

image-20220525230432216

反馈相关人员进行删除

坏块处理

查看 HDFS 页面出现如下图报错即为有坏块

image-20220526101546760

查看集群坏块的状况

查看集群坏块的状况,以及坏块的路径

hadoop fsck /

image-20220526101559648

删除坏块

hadoop fsck / -delete

查看集群坏块的状况

hdfs fsck /

image-20220526101638666

修改表的副本数,副本数 : 2

hadoop fs -setrep -R 2 /user/hive/warehouse/xxx.db

查看副本数是否正确

hadoop fsck /user/hive/warehouse/xxx.db

image-20220526101734643

DataNode 宕机

DataNode 宕机过长 , 并把该节点重启

root 身份登录到该节点

su - hdfs

停止 ntp 服务

service ntpd stop

与 Hadoop 上的 NTP Server 同步

ntpdate hadoop188

将时间写到主板

hwclock -w

启动 ntp 服务

service ntpd start

启动 DataNode

./sbin/hadoop-daemon.sh start datanode

检查 DataNode 进程是否已经启动

jps -l

HDFS 目录被删除排查

集群某个目录被删除排查,并提供了被删除目录,请求定位被谁删除

查看 HDFS 审计日志 , 来定位用户

INFO FSNamesystem.audit: allowed=true
ugi=hdfs (auth:SIMPLE)ip=/10.191.xxx.xxx cmd=rename options=2
src=/serv/smartsteps/raw/events/locationevent/2022/05/28/011
dst=/user/hdfs/.Trash/Current/serv/smartsteps/raw/events/locationev
ent/2022/05/28/011perm=hdfs:ss_deploy:rwxr-xr-xproto=rpc

MaxDirectoryItemsExceededException

HDFS 目录存储最大文件数异常 MaxDirectoryItemsExceededException 问题描述

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.FSLimitException$MaxDirectoryItemsExceededException): 
The directory item limit of /XXX/XXX is exceeded: limit=1048576 items=1048576
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.verifyMaxDirItems(FSDirectory.java:2060)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.addChild(FSDirectory.java:2112)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.addLastINode(FSDirectory.java:2081)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.addINode(FSDirectory.java:1900)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.addFile(FSDirectory.java:327)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2794)

解决方法

更改 hdfs-site.xml

<property>
    <name>dfs.namenode.fs-limits.max-directory-items</name>
    <value>1048576</value>
    <description>Defines the maximum number of items that a directory may contain. Cannot set the property to a value less than 1 or more than 6400000.</description>
</property>

将值设置为大一些,最多不能超过 6400000,因此还需要考虑删除历史数据

NameNode 宕机太久

NameNode 停机很久,然后启动,JournalNode 同步元数据时,DataNode上传 block 报告给 NameNode。但由于 NameNode 内存有限,会触发 full gc 导致 DataNode 连接超时,然后就一直处于安全模式

IOException in offeRegionServerervice java.net.SocketTimeoutException: Call From
xxx/xxx.xxx to xxx:8022 
failed on socket timeout exception: java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read. ch :
java.nio.channels.SocketChannel[connected local=/xxx.xxx:39469
remote=xxx/1xx.xxx:8022]; For more details
see: http://wiki.apache.org/hadoop/SocketTimeout

启动 Standby NameNode 后,每次加载 needs additional 6267650 左右 blocks 时 , 备节点 NameNode 就会卡住,无法继续加载

解决办法

调整 NameNode handle 线程数,通过减少线程数来减少 request wite 线程,减少内存使用或 加大内存

DataNode 失联排查

问题

有个 DataNode 一直失联

排查

查看日志发现

错误 :

java.io.IOException:Not ready to serve the block pool, 

查看 GC

查看该 DataNode 的进程号

jps -l

查看 DataNode GC

jstat -gcutil xxx

查看负载

查看系统负载

top

查看网络

查看网络流量

dstat

查看 IO

查看磁盘 IO,发现 %util 过高

%util: 一秒中有百分之多少的时间用于 I/O,如果%util 接近 100%,说明 : 产生的 I/O 请求太多,I/O 系统已经满负荷

iotop

发现 du -sk 操作,是对磁盘进行 blockpool ,该命令会持续很长时间

查看磁盘

查看磁盘情况,发现 sataxxx 分别挂载在了 sdxxx,正好与 iostat 中 %util 过高的磁盘吻合

lsblk

解决

du -sk : 统计某个目录的大小的,du 的运行机制是基于文件获取,并非针对某个分区,执行时间受限于文件和目录个数,当每个 DataNode 的 block 很大时 , du 会很慢,所以导致 DataNode 一直启动不完成,导致失联

core-site.xml 里面增加配置:

fs.getspaceused.classname=org.apache.hadoop.fs.DFCachingGetSpaceUsed

使用 df 替换 du

总结

df 直接使用 statfs 系统调用,直接读取分区的超级块信息获取分区使用情况,对整个分区,直接读取超级块,运行速度不受文件目录个数影响,执行很快

du 和 df 不一致情况 :

  • 当文件被删除后,在文件系统目录中已经不可见了,所以 du 就不会再统计它了。如果此时还有运行的进程持有该被删除的文件的句柄,那么该文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改
  • df 会统计这个被删除的文件

问题

DataNode 又出现失联

排除

查看日志

错误 :

GC pool 'PS MarkSweep'had collection(s): count=1 time=13963ms
timed out

发现频繁发生耗时长的 GC

查看GC

jstat -gcutil xxx

查看 DataNode JVM 堆栈信息,发现老年代使用 100%,且频繁发生 FULL GC

image-20220520163059643

查看系统负载,发现负载过高,CPU 负载过高,符合频繁 FULL GC 的特征

top

image-20220520163135311

解决

增大 DataNode 内存

hadoop-env.sh :

export HADOOP_DATANODE_OPTS="-Xms20480m -Xmx20480m"

重启 DataNode 回复正常

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:18:23  更:2022-06-01 15:18:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:53:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码