HDFS小文件问题及处理方法【重要】

一、小文件形成的原因:

(1)动态分区插入数据,产生大量的小文件,从而导致map数量剧增;

(2)reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致;

(3)数据源本身就是大量小文件;

二、小文件的危害:

(1)在 HDFS 中, 每个文件均 按块存储, 每个文件在 NameNode 中存储大约占 150 个字节, 与块大小无关, 如果小文件过多,则会耗尽 NameNode 中的大多数内存。

(2)从Hive角度看,小文件过多也会影响 MR 的执行任务的数量, 一个小文件会开启一个 MapTask,同时 一个map会开一个JVM去执行 任务过多则会导致频繁的开启关闭, 浪费大量的资源,严重影响性能。

三、解决小文件问题常见方法:

解决小文件问题的本质就是将小文件进行合并,可以通过以下几种方式解决小文件问题:

(1)使用Hadoop Archive(HAR)将小文件进行归档: 使用Hadoop自带的HAR将小文件进行归档,将多个小文件打包成一个HAR文件,这样NameNode中的元数据也就存储一份。在减少namenode内存使用的同时,仍然可以对文件进行透明的访问。

使用HAR时需要注意两点:

  • 对小文件进行存档后,原文件不会自动被删除,需要用户自己删除;
  • 创建HAR文件的过程实际上是在运行一个MapReduce作业,因而需要有一个Hadoop集群运行此命令

此外,HAR还有一些缺陷:

  • 不支持修改,一旦创建,Archives便不可改变。要增加或移除里面的文件,必须重新创建归档文件。
  • 要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换。

(2)使用SequenceFile合并小文件: 可以使用SequenceFile格式将大批的小文件合并成一个大文件,再使用MapReduce程序进行操作,从而提高系统性能。

(SequenceFile由一系列二进制key-value组成,key是小文件名,value是小文件内容,这样就可以将大量小文件合并为一个大文件。)

注意:和HAR不同的是,这种方式还支持压缩。该方案对于小文件的存取都是比较自由的,不限制用户和文件的多少,但SequenceFile文件不能追加写入,也不能修改, 适用于一次性写入大量小文件的操作。

(3)使用CombineFileInputFormat合并小文件: 在MR读取数据时将多个小文件合并成一个文件进行处理,只开启一个MapTask,提高了任务的执行效率。

(这样就不会因为大量小文件而开启大量的MapTask,把大量的时间花费在启动和释放task上面)

(4)开启JVM重用: JVM重用可以使得JVM实例在同一个job中重新使用N次,提高效率。N的值可以在Hadoop的 mapred-site.xml 中配置。通常在10-20之间。

注意:有小文件场景时可以开启JVM重用;如果没有产生小文件,不要开启JVM重用,因为会一直占用task卡槽,直到任务完成才释放。

参考: 大数据Hadoop之——HDFS小文件问题与处理实战操作

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值