Skip to main content

小文件治理

什么是小文件?

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。文件的大小远小于HDFS上块(dfs.block.size)大小的文件,称为小文件。

为什么需要小文件治理?

大量的小文件会给Hadoop集群的扩展性和性能带来严重的影响。

  1. NameNode在内存中维护整个文件系统的元数据镜像、用户HDFS的管理。其中每个HDFS文件元信息(位置,大小,分块等)对象约占150字节,如果小文件过多,会占用大量内存,直接影响NameNode的性能。
  2. HDFS读写小文件会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接。如果NameNode在宕机中恢复,需要更多的时间从元数据文件中加载。
  3. 会给Spark SQL等查询引擎造成查询性能的损耗。
  4. 大量的数据分片信息以及对应产生的Task元信息也会给Spark Driver的内存造成压力,带来单点问题。此外,入库操作最后的commit job操作,在Spark Driver端单点做,很容易出现单点的性能问题。

小文件治理的原理

存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。块的大小默认为128MB,当文件大小为128时,Hadoop集群的计算效率最高。因此对非分区表按表进行数据文件合并,使表/分区数据文件的大小接近128M。在数栈中实现小文件治理功能的原理是,把小文件拷到一个临时目录下,这个目录下的小文件合并完成以后覆盖到原目录。

治理范围

前提:

  • meta数据源的数据表。
  • 在资产平台经过元数据同步的数据表。

支持的meta数据源类型:

  • sparkthrift、hive1、hive2。
tip

①治理的可选范围为所有没创建过治理规则的meta数据源,已创建过治理规则的meta数据源仍显示但置灰不可选,一个数据源只能创建一个治理规则

②历史的meta数据源需要再完成一次元数据同步才能支持数据治理,如果一次性处理,数据量过大,会影响性能

权限范围

拥有操作权限的角色:超级管理员、租户所有者、租户管理员、管理员,可以进行小文件治理的创建。

周期治理

即支持按每天、每周、每月为维度对指定项目下对符合圈定条件的所有非分区表或分区进行周期治理。

image-20221121111233830

tip

①对于非分区表和分区表,此处的筛选条件分别应用于表和分区。应用于分区时,实际圈定的是满足该条件的分区所属的表,实际治理的是这些这些表中满足条件的分区

②周期治理规则由创建后的从第二日的零点开始生效,且之后每天0点自动生成当天的治理记录

③治理规则时间应避开任务对表/对应分区的读写时段,否则可能导致读写失败或数据丢失。如果出现失败或数据丢失,将任务重跑即可

④小文件治理时间若超过3小时则治理失败,时间条件可在配置文件中配置,默认3小时

⑤占用存储的统计目标由一个分区或者一张表变为一个文件

一次性治理

即一次性的治理任务,用户可以直接指定项目下的表、分区和执行时间,在设置的时间下使指定的分区/表进行数据文件的合并。

image-20221121134323744

预约治理时间

预约治理只能选择当前时间10分钟之后的治理时间。

image-20221121134304223

tip

如果保存治理规则后预约的治理时间在保存时间之前,则会提示:“当前选择治理时间已过,请至少选择保存时还未发生的时间”