Hive如何处理大量小文件

Hive如何处理大量小文件

小文件是如何产生的

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

小文件的危害

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

小文件的解决方案

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

1.使用orc作为表存储形式,不要使用textfile,在一定程度上可以减少小文件
2.减少reduce的个数(减少生成分区数量)
3.少用动态分区,使用distribute by分区
4.对已经存在的小文件做出的解决方案:

4.1 使用Hadoop achieve把小文件进行归档
4.2 重建表,建表时减少reduce的数量
4.3 通过参数调节,设置map/reduce的数量
4.3.1设置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; 

4.3.2 设置map输出和reduce输出进行合并的相关参数:

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 小文件是如何产生的 动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增 数据源本身就包含有大量的...
    liuzx32阅读 766评论 0 1
  • 1. 小文件合并综述 1.1 小文件表现 不论是Hive还是Spark SQL在使用过程中都可能会遇到小文件过多的...
    坨坨的大数据阅读 5,614评论 1 5
  • TDW(Hive)中发现有些单表的小文件数量达到了恐怖的百万级/天,严重影响了集群的性能,经常导致任务得不到调度,...
    sealwang24阅读 2,466评论 0 0
  • 最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现...
    大数据技术派阅读 470评论 0 1
  • 最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现...
    坨坨的大数据阅读 617评论 0 1