作者:bytehouse
Oracle ACE、PostgreSQL ACE
10+年数据库架构与运维实战经验
公众号:bytehouse
墨天轮专栏:bytehouse
CSDN:Young DBA
服务器磁盘故障,未及时处理,导致其他节点的磁盘空间爆满,查看磁盘占用发现了该文件 dncp_block_verification.log.prevdncp_block_verification.log.curr。分析该文件产生的原因和处理过程。
hdfsdata/
├── current
│ ├── BP-xxx-NameNodeIP-时间戳 # BlockPool 目录
│ │ ├── current # 真实数据目录
│ │ │ ├── VERSION
│ │ │ ├── finalized # 已完成写入的正式数据块
│ │ │ │ └── subdir0/subdir1/blk_xxx / blk_xxx.meta
│ │ │ ├── lazyPersist
│ │ │ └── rbw # 正在写入的数据块(Replica Being Written)
│ │ ├── dncp_block_verification.log.curr # 当前块校验日志
│ │ ├── dncp_block_verification.log.prev # 历史滚动日志(占用空间大的文件)
│ │ └── tmp
│ └── VERSION
└── in_use.lock # 锁文件,防止多进程同时挂载目录BP-随机数-NameNode地址-集群创建时间,HDFS 块池目录。finalized:存储已落地完成的 HDFS 数据块 blk_xxx,搭配 .meta 校验和文件;rbw:存储正在写入的临时数据块。checksum 校验结果、扫描时间,用于数据完整性校验;.curr:当前正在写入的校验日志;.prev:日志滚动后归档的旧日志,本次占用大量空间的目标文件。dncp_block_verification.log.prev 异常增大,本质是 DataNode 频繁执行块校验,日志持续刷写:
重要结论:
.prev为归档旧日志,清空/删除不会影响 HDFS 数据与业务;严禁直接删除.curr日志(建议停服务后操作)。
假设 DataNode 根目录为 /hdfsdata,执行以下命令:
# 1. 查找所有校验日志文件
find /hdfsdata -name"dncp_block_verification.log.*"
# 2. 查看 .prev 文件占用空间
du -sh /hdfsdata/current/BP-*/dncp_block_verification.log.prev采用清空文件方式(保留文件句柄,无进程影响、零风险):
# 方式1:truncate 清空(推荐)
truncate -s0 /hdfsdata/current/BP-*/dncp_block_verification.log.prev
# 方式2:重定向清空(等效)
> /hdfsdata/current/BP-*/dncp_block_verification.log.prev若需要彻底删除文件,先停服务再操作,避免句柄残留:
# 1. 停止 DataNode 服务
systemctl stop hadoop-hdfs-datanode
# 2. 删除旧日志
rm-f /hdfsdata/current/BP-*/dncp_block_verification.log.prev
# 3. 重启 DataNode
systemctl start hadoop-hdfs-datanode清理后必须排查异常,否则问题会反复出现:
# 1. 查看 DataNode 运行日志,检索 IO/块校验报错
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-datanode-*.log | grep-i error
# 2. 检查服务器磁盘硬件状态
dmesg | grep-i error
smartctl -a /dev/sdX # 替换为数据盘盘符
# 3. 检查 HDFS 集群损坏数据块
hdfs fsck / -list-corruptfileblocks修改 HDFS 配置文件 hdfs-site.xml,限制日志大小与滚动频率:
<!-- 限制块校验日志最大行数,避免无限膨胀 -->
<property>
<name>dfs.datanode.block.verification.log.max.lines</name>
<value>100000</value>
</property>
<!-- 日志最小滚动间隔(单位:毫秒),设置为1小时,避免频繁生成 .prev 日志 -->
<property>
<name>dfs.datanode.block.verification.log.min.rolling.period</name>
<value>3600000</value>
</property>配置生效:重启 DataNode 服务
systemctl restart hadoop-hdfs-datanodedf -h 确认磁盘分区使用率;find + du 定位并确认 dncp_block_verification.log.prev 位置与大小;truncate 清空日志,快速释放存储空间;hdfs-site.xml 配置,限制日志大小;.prev 文件,禁止在线删除/清空 .curr 日志;truncate 在线清空,业务无感知;