【Hive】小文件问题

HDFS小文件问题

1.小文件是什么?
上传到HDFS的文件大小, 明显小于HDFS默认的block块的大小的文件(比如默认的block大小是128MB,上传的文件大小只有10KB,则这样的文件就是小文件)。
小文件会给HDFS的扩展性和性能带来一个很严重的问题,在HDFS中,任何的文件、目录或者block在内存中都是以对象的形式存储的,每个对象都占用 大约150Byte, 比如有一千万个小文件,每个小文件占用一个block,则大约占用namenode2G的内存,导致namenode容量严重影响了集群的扩展;
其次,访问大文件的速度远远小于访问大量小文件的速度,需要不断从一个datanode跳到另一个datanode,严重影响了性能,导致处理小文件的速度远远小于处理同等大小的大文件的速度,每个小文件都占用一个task。对于一个mapreduce这样的程序,提交到集群时,task启动将会消耗大量的时间,很多小文件处理起来,大部分的时间都耗费在启动task海和释放task上,而真正的计算只用了一秒,启动和释放却用了几十秒,显然不合理。
2.解决方案
Hadoop自带了几种解决方案:
Hadoop Archive(HAR)
Sequence File
CombineFileInputFormat

Hive小文件问题

原数据层面:
每一个小文件都有一个原数据,包括文件的路径、文件名、所属组、权限、创建时间等等,这些信息都保存在namenode内存中,每个文件大约占用150Byte,大小文件都是150Byte,小文件过多就占用大量的namenode服务器内存,会影响namenode的性能和使用寿命;
计算层面:
分布式的计算框架下,在计算时会从HDFS上拉取数据,比如用mapreduce,默认情况下,mr会对每个小文件启动一个map任务计算,非常影响计算的性能,同时大量的小文件也会影响磁盘的寻址时间。

hive底层默认的执行引擎是MR,在map端和reduce端都可以进行小文件合并。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveinputFormat;
在map执行前合并小文件,用以减少map的数量。
set hive.merge.mapfiles=true;
在map only任务结束后,合并小文件,默认为true;
set hive.merge.mapredfiles=true;
在mapreduce结束后,合并小文件
set hive.merge.size.per.task=268435456;(256MB)-- 合并文件的大小
set hive.merge.samllfiles.avgsize=16777216;(16MB) – 输出文件的平均大小达到合并的阈值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值