概述

随着大数据时代的到来,数据量不断增长,HDFS也成为了数据存储和处理的重要组成部分。然而,由于HDFS的设计原理和文件存储方式,HDFS系统中存在大量的小文件,这些小文件会导致HDFS的性能下降,增加管理和维护的难度,严重影响数据处理效率和数据质量。因此,HDFS小文件的治理变得越来越重要。

1、HDFS小文件的问题影响

HDFS小文件通常指文件大小小于HDFS块(Block)大小(默认为128MB)的文件。在HDFS系统中,小文件会带来以下问题:

存储空间占用过多:在Hadoop生态系统中,每个小文件都将占用一定的存储空间,而且每个小文件也需要一个块来存储。如果存在大量的小文件,将浪费大量的存储空间。

处理延迟:小文件数量过多,会引起大量IO操作,导致处理延迟。

查询性能下降:小文件用于分区和表划分,可能导致查询延迟并降低查询性能。此外,小文件还会增加元数据的数量,使得Hive在查询元数据时变得更加缓慢。

增加管理和维护难度:当HDFS系统中存在大量的小文件时,管理和维护变得更加困难,需要耗费更多的精力和时间来维护系统。

数据倾斜:如果数据分布不均匀,会导致一些Reduce任务处理了完全不同的分区,这会使某些Reduce任务的运行速度与其他Reduce任务相比非常慢。

因此,为了避免这些问题,我们需要对Hive中小文件的处理进行优化,减少小文件数量和大小,以提高数据处理效率和准确性。

2、HDFS小文件的治理方法

为了处理Hive中的小文件问题,可以采取以下一些有效措施:

文件合并:将多个小文件合并成一个大文件,采用 Hadoop 文件合并API可以将多个小文件合并成一个大文件。合并文件后,可以减少小文件数量,减少Hadoop文件管理负担,减少HDFS元数据和NameNode内存消耗。

压缩文件:可以使用压缩算法(如gzip、bzip2等)对小文件进行压缩,这样可以减少磁盘空间和网络带宽的使用,并减少小文件损坏的可能性。

存储格式优化:Hive支持多种存储格式,如ORC、Parquet、Avro等。这些格式允许将多个小文件压缩并序列化成一个大文件,存储时占用更少的磁盘和网络带宽。存储格式优化对于处理小文件问题非常有效。

分区表:对于一些常变动的数据,推荐使用分区表。分区表将数据按照不同的分区值存储在不同的目录中。这减少了小文件数量并提高了查询效率。

垃圾回收:如果一个表旧数据经常更新或删除,就会产生大量无用的小文件,因此建议进行垃圾回收。可以定期执行HDFS文件删除命令或者设置TTL等机制,定期删除冗余数据以减少HDFS文件、元数据和NameNode内存的消耗。

通过采取上述措施中的一种或多种,可以极大地减少Hive中小文件数量,优化Hive表的表现并提高查询效率。

3、HDFS小文件治理的实践案例

以下是一些HDFS小文件治理的实践案例:

1.合并小文件:对于日志文件等大量的小文件,可以使用Hadoop自带的合并工具将多个小文件合并为一个大文件。下面是通过hive的重写方式合并小文件,核心参数如下;

set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapfiles = true;
set hive.merge.mapredfiles = true;
set hive.merge.smallfiles.avgsize=256000000;
set hive.merge.size.per.task=12800000;
set mapred.max.split.size=256000000;
set mapred.min.split.size=64000000;
set mapred.min.split.size.per.node=64000000;
set mapred.min.split.size.per.rack=64000000;

2.压缩文件:对于大量的小文件,可以使用压缩工具将多个小文件压缩为一个压缩包,以减少存储空间。例如,使用gzip或bzip2压缩工具压缩文件,在HDFS上存储压缩文件,以减少存储空间和文件数量;

3.删除无用文件:对于不再需要的小文件,可以使用Hadoop自带的命令hadoop fs -rm命令删除文件,或者使用定时任务脚本定期删除过期文件;

4.设置文件过期时间:使用hadoop fs -touchz命令设置文件的过期时间,当文件过期后,自动删除文件。例如,使用hadoop fs -touchz命令设置文件的过期时间为30天,当文件超过30天未被访问时,自动删除文件;

5.使用SequenceFile:对于大量的小文件,可以使用SequenceFile格式存储文件,将多个小文件合并成一个SequenceFile文件。例如,使用Hadoop自带的SequenceFile.Writer类将多个小文件写入SequenceFile文件中,以减少存储空间和文件数量。

4、HDFS小文件监控

HDFS的fsimage是HDFS文件系统的一个重要组成部分,记录了HDFS文件系统的元数据信息,包括文件、目录、权限、块等信息。通过监控HDFS的fsimage,可以了解HDFS文件系统的整体情况,包括文件数量、文件大小、文件类型等信息,进而实现对HDFS小文件的监控和治理。

具体来说,可以通过以下步骤对HDFS小文件进行监控:

1.获取HDFS的fsimage:使用Hadoop自带的命令hdfs oiv -p XML -i fsimage命令获取HDFS的fsimage文件。该命令会将HDFS的fsimage文件以XML格式输出,包括HDFS中所有文件和目录的元数据信息;

2.解析fsimage文件:使用Python等脚本语言解析获取到的fsimage文件,提取其中的文件、目录、块等信息。可以使用Python的ElementTree模块等工具对XML文件进行解析,提取需要的信息;

3.统计文件数量和文件大小:根据解析后的文件信息,统计HDFS中小文件的数量和大小。通常可以根据文件大小和文件数量的阈值来定义小文件,例如文件大小小于128MB或文件数量小于1000个等;

4.可视化展示:使用可视化工具,如Grafana、Kibana等将统计结果进行可视化展示,以便于对HDFS小文件的监控和管理。

5、HDFS小文件监控案例

下面是解析HDFS的fsimage文件,导入hive表进行分析得到最终结果表导入clickhouse通过grafana进行数据展示;

解析fsimage文件为txt文件:

hdfs oiv -i  fsimage_0000000192578352133 -o /data2/data/fsimage/$day/fsimage.txt -p Delimited -t /data2/data/fsimage/$day/tmp
  1. fsimage文件重要的字段释义:
INODE_ID:文件或目录的唯一标识符;
NAME:文件或目录的名称;
PARENT_ID:父目录的INODE_ID;
MODIFICATION_TIME:最后修改时间;
ACCESS_TIME:最后访问时间;
BLOCK_IDS:文件的数据块ID列表;
BLOCK_SIZE:数据块大小;
NUM_BLOCKS:数据块数量;
PERMISSIONS:文件或目录的权限信息;
USER_NAME:文件或目录所属用户;
GROUP_NAME:文件或目录所属用户组;
SYMLINK:如果是符号链接,则包含符号链接的目标路径;
UNDER_CONSTRUCTION:如果文件正在写入中,则为true;
UNDER_RECOVERY:如果文件正在恢复中,则为true;
FILE_LENGTH:文件长度;
NS_QUOTA:命名空间配额;
DS_QUOTA:磁盘配额;
STORAGE_POLICY:存储策略。
CREATE TABLE `tmp_fsimage_info_log_clean`(
`path` string,
`replication` int,
`db` string,
`table_name` string,
`parttition_nm1` string,
`parttition_nm2` string,
`parttition_nm3` string,
`file_name` string,
`modificationtime` string,
`accesstime` string,
`preferredblocksize_mb` decimal(20,5),
`blockscount` int,
`filesize_mb` decimal(20,5),
`filesize_gb` decimal(20,5),
`username` string,
`groupname` string)
PARTITIONED BY (
`stat_day` string COMMENT '分区时间:yyyy-mm-dd')
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

![[图片/Pasted image 20230706235245.png]]

参考

HDFS小文件治理总结,你学会了吗?-51CTO.COM
【大数据】Hive 小文件治理和 HDFS 数据平衡讲解 - 文章详情