hdfs和hive对于小文件的处理方案

一、hdfs 如何处理小文件

小文件问题的危害

小文件问题对HDFS的性能和稳定性产生显著影响,主要包括:

  1. 占用过多的存储空间:每个小文件都会占用一个独立的Block,导致存储资源的浪费。
  2. 降低数据处理效率:HDFS是为处理大文件而设计的,小文件会导致大量的Map任务启动,增加处理时间和资源消耗。
  3. NameNode内存压力增大:NameNode需要维护所有文件和目录的元数据信息,小文件过多会导致NameNode内存过载,影响系统稳定性。

小文件治理方法

针对小文件问题,我们可以采取以下治理方法:

1. 合并小文件

将多个小文件合并成一个大文件,减少文件数量。这种方法可以通过Hadoop自带的合并工具或Hive的重写方式实现。例如,使用Hive的CombineHiveInputFormat可以合并多个小文件为一个Map任务处理,从而减少Map任务的数量。

2. 压缩文件

将多个小文件压缩为一个压缩包,减少存储空间。Hadoop提供了多种压缩工具,如gzip、bzip2等,可以根据需要选择合适的压缩算法。压缩后的文件在HDFS上存储,不仅可以减少存储空间,还可以减少文件数量,提高处理效率。

3. 删除无用文件

定期删除不再需要的小文件,释放存储空间。可以使用Hadoop自带的命令如hadoop fs -rm来删除文件,或者设置定时任务脚本自动删除过期文件。

4. 设置文件过期时间

对于不再需要的文件,可以设置其过期时间,自动删除过期文件。使用hadoop fs -touchz命令可以设置文件的访问时间,并结合定时任务实现文件的自动删除。

5. 使用SequenceFile

将多个小文件合并到一个SequenceFile中,以减少文件数量,提高处理效率。SequenceFile是Hadoop自带的一种二进制文件格式,适合存储大量小文件。使用SequenceFile.Writer类可以将多个小文件写入SequenceFile中。

6、 使用Hadoop Archive (HAR):将多个小文件打包成一个单独的文件,减少占用的存储空间和元数据开销。

7、 数据库存储:对于一些小文件,可以考虑使用非HDFS的存储方式,如关系型数据库或NoSQL数据库,使数据存储更加灵活和高效。

实践案例

日志文件的处理为例,我们可以使用Hive的重写方式来合并小文件。通过设置Hive的相关参数,如hive.merge.mapfileshive.merge.mapredfiles等,可以实现Map端和Reduce端文件的合并。具体参数设置可以参考Hive的官方文档

结论

小文件问题是HDFS性能优化的重要议题。通过合并、压缩、删除、设置过期时间等方法,我们可以有效地治理小文件问题,提高HDFS的存储效率和数据处理能力。在实际应用中,我们应根据具体场景和需求选择合适的治理方法,并结合监控和调优手段不断优化系统性能。

二、hive 合并小文件

hive分区下,有很多小文件,例如一个分区有1000个文件,但每个文件大小是10k,数仓大量这种小文件。

小文件太多,需要消耗hdfs存储资源,mr,spark计算的任务数。

为了处理小文件,需要对它们进行合并。

通过 sql 进行合并:

1、concatenate方法

#对于非分区表

alter table tablename concatenate;

#对于分区表

alter table tablename partition(dt=20201224) concatenate;

优点: 使用方便

缺点: concatenate 命令只支持 RCFILE 和 ORC 文件类型,需要执行多次,才能把文件合并为1个。

2、insert overwrite方法

复制代码
insert overwrite table tableName partition(dt=2022031100)
select  
  column1,column2
from
tableName 
where dt=2022031100

缺点: select 的字段需要自己拼起来,select * 的话,由于带有dt字段,无法写入新分区。

优点: 支持所有数据类型

3、insert overwrite select * 用法

从select * 中去掉一列的方法:

insert overwrite tableA select (name)?+.+ from test;

复制代码
hive> set hive.cli.print.header=true;
hive> select * from test;
hook status=true,operation=QUERY
OK
name    friends children        address
songsong        ["bingbing","lili"]     {"xiao song":18,"xiaoxiao song":19}     {"street":"hui long guan","city":"beijing"}
yangyang        ["caicai","susu"]       {"xiao yang":18,"xiaoxiao yang":19}     {"street":"chao yang","city":"beijing"}
Time taken: 0.14 seconds, Fetched: 2 row(s)

从select * 中去掉列 address

复制代码
hive> select `(address)?+.+` from test;
hook status=true,operation=QUERY
OK
name    friends children
songsong        ["bingbing","lili"]     {"xiao song":18,"xiaoxiao song":19}
yangyang        ["caicai","susu"]       {"xiao yang":18,"xiaoxiao yang":19}
Time taken: 0.144 seconds, Fetched: 2 row(s)

用这个方法就能去掉分区表的日期字段

注意,语法生效,需要设置

hive> set hive.support.quoted.identifiers=none;

也可以通过参数合并:

在Map输入的时候, 把小文件合并。

-- 每个Map最大输入大小,决定合并后的文件数

set mapred.max.split.size=256000000;

-- 一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并

set mapred.min.split.size.per.node=100000000;

-- 一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并

set mapred.min.split.size.per.rack=100000000;

-- 执行Map前进行小文件合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

在Reduce输出的时候, 把小文件合并。

-- 在map-only job后合并文件,默认true

set hive.merge.mapfiles = true;

-- 在map-reduce job后合并文件,默认false

set hive.merge.mapredfiles = true;

-- 合并后每个文件的大小,默认256000000

set hive.merge.size.per.task = 256000000;

-- 平均文件大小,是决定是否执行合并操作的阈值,默认16000000

set hive.merge.smallfiles.avgsize = 100000000;

Hadoop的归档文件格式。

set hive.archive.enabled= true ;

set hive.archive.har.parentdir.settable= true ;

set har.partfile.size=1099511627776;

ALTER TABLE srcpart ARCHIVE PARTITION(ds= '2008-04-08' , hr= '12' );

ALTER TABLE srcpart UNARCHIVE PARTITION(ds= '2008-04-08' , hr= '12' );

相关推荐
武子康15 小时前
大数据-244 离线数仓 - Hive ODS 层建表与分区加载实战(DataX→HDFS→Hive)
大数据·后端·apache hive
武子康2 天前
大数据-243 离线数仓 - 实战电商核心交易增量导入(DataX - HDFS - Hive 分区
大数据·后端·apache hive
代码匠心3 天前
从零开始学Flink:Flink SQL四大Join解析
大数据·flink·flink sql·大数据处理
武子康4 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB5 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康6 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
IvanCodes6 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康7 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
字节跳动数据平台7 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康8 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive