HIVE如何处理大量小文件

2 篇文章 0 订阅

小文件是如何产生的:

  1. 动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增
  2. 数据源本身就包含有大量的小文件
  3. reduce个数越多,生成的小文件也越多

小文件的危害:

  1. 从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能
  2. 在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展

小文件的解决方案

从小文件的产生途径解决:

  1. 使用sequencefile作为表存储形式,不要使用textfile,在一定程度上可以减少小文件
  2. 减少reduce的个数(减少生成分区数量)
  3. 少用动态分区,使用distribute by分区

对已经存在的小文件做出的解决方案:

  1. 使用Hadoop achieve把小文件进行归档

  2. 重建表,建表时减少reduce的数量

  3. 通过参数调节,设置map/reduce的数量

    • 设置map输入合并小文件的相关参数:

      //每个Map最大输入大小(这个值决定了合并后文件的数量)
      set mapred.max.split.size=256000000;  
      //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
      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; 
      
    • 设置map输出和reduce输出进行合并的相关参数:

      //设置map端输出进行合并,默认为true
      set hive.merge.mapfiles = true
      //设置reduce端输出进行合并,默认为false
      set hive.merge.mapredfiles = true
      //设置合并文件的大小
      set hive.merge.size.per.task = 256*1000*1000
      //当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
      set hive.merge.smallfiles.avgsize=16000000
      
  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值