针对HDFS的小文件的治理方案可具体划分为以下几点:

(对于治理方式的备注:

1、对于拥有客户端权限的用户(后期会一一回收),可通过客户端执行相关命令完成治理工作,治理过程中相关数据的查看也可通过客户端自行完成;

2、对于无客户端权限的用户,可通过小文件合并工具进行文件的合并(目前仅针对hive的文本文件进行合并,其他格式暂不支持);也可通过提交ITSM运维单进行数据的删除操作;

3、通过IDE离线任务进行压缩式合并、删除等相关治理操作。

一、事前/事中治理:

1. HIVE任务小文件个数控制

    设置以下参数:           

    set hive.merge.mapfiles=true;
    set hive.merge.mapredfiles=true;
    set hive.merge.size.per.task=256000000; --合并后平均文件大小
    set hive.merge.smallfiles.avgsize=256000000; --合并前平均文件大小低于此设置,并在小文件开关开启的时候,多跑一个MR合并小文件

2. SPARK任务小文件治理:

   2.1 针对SparkSQL任务

        添加暗示(Hint): /*+ REPARTITION(分区数) */ ,例如:  

              create table tableName as select /*+ REPARTITION(40) */ age,count(*) from person where age between 10 and 20 group by age

              insert into table tableName select /*+ REPARTITION(40) */ age,count(*) from person where age between 10 and 20 group by age

              insert overwrite table tableName select /*+ REPARTITION(40) */ age,count(*) from person where age between 10 and 20 group by age

        分区数:根据任务落地的数据量而定,要求每个落地文件大小在256M左右。 

   2.2 针对Dataset/RDD

        读文件后添加repartition操作。

 针对hive SQL、spark SQL任务,可通过配置相关参数,从小文件生成的源头进行有效治理,但是此种方式会使任务运行时间变长(预计1.5倍,此数据仅供参考,不做任何官方依据),所以在配置参数时请各负责人根据实际需求和场景进行配置;由于直接配置参数会影响任务运行时长,各负责人可通过配置周期性定时任务进行治理操作(例如一周、半月或一月等执行一次),通过这种方式可避免对任务造成的影响。

二、事后治理

压缩式合并策略(适用全部集群,适用客户端和IDE hive任务执行hadoop命令):

     步骤一: 利用hadoop归档命令建小文件归档hadoop archive -archiveName data.har -p srcPath toPath

     步骤二:使用hadoop删除命令删除原始目录下文件hadoop fs -rm  srcPath/*

     步骤三:将归档后的文件移动原始目录hadoop fs -mv toPath/data.har srcPath

事例1:客户端执行

①首先根据命令在客户端中执行归档命令

创建用户存放归档文件的目标目录/user/di/tmp/smallfile_dst;创建原始目录/user/di/tmp/smallfile_src,然后对该目录put数据1.txt文件;最后根据命令执行归档,将归档后的.har文件命名为smallfile_har.har

计算hive小文件数 hive小文件处理方案_客户端

 

②删除原始目录下文件信息

计算hive小文件数 hive小文件处理方案_hive_02

 

③将归档后的文件移动到原始目录中,mv之后去查询原始目录,发现smallfile_har.har已移动到原始目录/user/di/tmp/smallfile_src下。

计算hive小文件数 hive小文件处理方案_hdfs_03

 

事例2:IDE hive任务执行(在hive任务中执行是与直接在客户端中执行区别不大,只是在命令前添加!即可,其他步骤一样。)

①在hive任务中执行归档命令如下:

计算hive小文件数 hive小文件处理方案_客户端_04

 

②执行rm删除源数据目录文件,然后同样将smallfile_har.har移动到原始目录/user/di/tmp/smallfile_src下,查询成功。

计算hive小文件数 hive小文件处理方案_hdfs_05

 

事例3:数据查询

①查询存放归档文件的目标目录以及归档信息。

计算hive小文件数 hive小文件处理方案_计算hive小文件数_06

 

②针对hive表文件,如果使用归档操作,则需要重新对表的location进行重新指向,不然无法读取,以下是测试场景。

计算hive小文件数 hive小文件处理方案_hdfs_07

 

③对于使用归档命令操作之后的目录而言,在读取的时候需要改变path的,比如:

原始目录文件读写时,使用FileSystem的class去访问/user/di/tmp/smallfile_src目录下文件信息;

目前只用归档之后,则需要进行调整,调用HarFileSystem的class去访问/user/di/tmp/smallfile_src/smallfile_har.har目录下文件信息.

计算hive小文件数 hive小文件处理方案_计算hive小文件数_08