数仓治理-小文件治理

   注:文章参考:

数据治理实践 | 小文件治理本文中将介绍Hive中小文件治理的方法和技巧,希望对大家有所帮助icon-default.png?t=N7T8https://mp.weixin.qq.com/s/HDxAGhGIPvXF38wPiXZ7xg

[离线计算-Spark|Hive] HDFS小文件处理-腾讯云开发者社区-腾讯云HDFS 小文件过多会对hadoop 扩展性以及稳定性造成影响, 因为要在namenode 上存储维护大量元信息.icon-default.png?t=N7T8https://cloud.tencent.com/developer/article/1988518目录

一、小文件治理的背景

1.1 小文件产生原因

1.2 小文件的危害

二、小文件解决方案

2.1 计算引擎使用spark3合并小文件

2.2 减少reduce的数量

2.3 添加合并小文件的参数

三、小文件治理工具化

   3.1 合并小文件功能

   3.2  任务运维

   3.3  数据趋势

四、治理效果

前言

          HDFS小文件过多会对Hadoop扩展性以及稳定性造成影响,NameNode需维护大量元数据信息导致占用过多的存储空间。大量的小文件也会导致很差的查询分析性能,因为执行查询时需要进行频繁的文件打开/读取/关闭,造成查询性能的损耗。

一、小文件治理的背景

1.1 小文件产生原因

  • 日常任务及动态分区插入数据会产生大量的小文件,从而导致map数量剧增;
  •  reduce数量越多,小文件也越多(reduce个数和输出文件是对应的)
  • 数据源本身就包含大量的小文件,例如api,kafka消息管道等。
  •  实时数据落hive也会产生大量小文件。

1.2 小文件的危害

       小文件通常是指文件大小要比HDFS块大小(一般是128M)还要小很多的文件。

  • 从Hive的角度看,小文件会开很多Map,一个Map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能;

  • NameNode在内存中维护整个文件系统的元数据镜像、其中每个HDFS文件元数据信息(位置、大小、分块等)对象约占150字节,如果小文件过多会占用大量内存,会直接影响NameNode性能。相对的,HDFS读写小文件也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立pipeline连接。

  • 小文件会给SparkSQL等查询引擎造成查询性能的损耗,大量的数据分片信息以及对应产生的task元信息会给Spark Driver的内存造成压力。

二、小文件解决方案

2.1 计算引擎使用spark3合并小文件

         通常能想到的方案是通过Spark API 对文件目录下的小文件进行读取,然后通过Spark的repartition 算子合并小文件,Repartition 分区数通过输入文件的总大小和期望输出文件的大小通过预计算而得。

数仓治理-小文件治理_第1张图片

        如果分区较多,利用Spark3.2+Rebalance进行动态分区刷新,如果分区较少或者未分区的表可以考虑直接将表删再重建,使用Spark3跑数据进行回刷。

Spark3.0引入AQE(Adaptive Query Execution)特性,该特性目的是提高Spark SQL的执行效率和可扩展性。AQE可以自适应地优化查询计划并动态调整任务大小,同时可以自动跟踪有关数据的统计信息。

以下是AQE的一些主要功能:
1.自适应的Shuffle Partitions : Spark AQE可以根据输入数据量和集群资源动态设置shuffle分区数量,并在运行时进行调整。这样可以避免产生小文件或过度分片等问题。
2.动态重组join策略:使用AQE,Spark SQL可以根据输入数据大小、分布式环境和其他因素来选择最佳的连接策略。它能够在传统的join和broadcast join之间做出决策,并且可以智能地将一个join操作拆分成多个阶段来减少内存压力。
3.运行时统计信息收集:通过收集实际执行期间的运行时指标(如I/O开销、网络瓶颈等),AQE能够更好的估算操作所需的时间和资源,并相应的
对其进行优化。

 2.2 减少reduce的数量

        计算引擎为Hive,可以使用参数进行控制:

set mapred.reduce.tasks=100; 设置reduce数量来控制小文件个数
insert overwrite table xxx.xxx partition(ds='${lst1date}')

2.3 添加合并小文件的参数

set hive.merge.mapfiles=true;   默认值ture,在Map-only的任务结束时合并小文件。
set hive.merge.mapredfiles=true;   默认值false,在Map-Reduce的任务结束时合并小文件。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  执行MAP前进行小文件合并

三、小文件治理工具化

          借助云平台进行小文件治理,平台图展示如下:可以通过小文件执行趋势、存储量、分区量判断需要治理的数据表有哪些,然后通过右侧的【合并小文件、任务运维、数据趋势】操作进行小文件的优化。

数仓治理-小文件治理_第2张图片

   3.1 合并小文件功能

            实际是通过用户配置spark3调度任务,每天定时调度将数据写入新创建的临时表(与凌晨线上任务错峰执行,避免争抢资源),对数据进行校验,如果校验失败则回滚,校验成功则将数据写入线上数据表中。

  • 倒排文件数后,找到需要治理的表;
  • 通过上述方法在任务中治理;
  • 点击操作-小文件,每日扫描去合并小文件,对于分区多的表(例如:分区数大于1年以上),可以60天/90天等定期清理;

   3.2  任务运维

               等同于日常的离线任务运维,可看合并小文件任务执行情况。

   3.3  数据趋势

             是指任务中文件总数优化趋势,合并任务功能图:

数仓治理-小文件治理_第3张图片

四、治理效果

 (1)对小文件数量高于xx+以上的数仓表进行治理,总计x+张,小文件总数由xxx万下降至xx万(小文件治理(定期治理,60天/90天)),优化率xx%。

数仓治理-小文件治理_第4张图片

待补充~

你可能感兴趣的:(数据治理,大数据,数据仓库)