一、hive小文件

Hive的数据存储在HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量。HDFS主要分为NameNode,DataNode,ZKFC。
       简单来说,HDFS数据的文件元信息,包括位置、大小、分块信息等,都是保存在NameNode的内存中的。每个对象大约占用150个字节,因此一千万个文件及分块就会占用约3G的内存空间(每个小文件都会占用NameNode模块的存储资源),一旦接近这个量级,NameNode的性能就会开始下降了。此外,HDFS读写小文件时也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接。对于MapReduce程序来说,小文件还会增加Mapper的个数,每个脚本只处理很少的数据,浪费了大量的调度时间。当然这个问题可以通过使用CombinedInputFile和JVM重用来解决。

二、小文件的产生:

2.1、动态分区插入数据的时候,会产生大量的小文件(动态分区产生小文件原因:在一段sql中指定两个字段当动态分区,一个字段的基数为7,另一个为4,这就是28个分区,数据插入动态分区阶段只有map任务,假如有4000个map,这种情况下map任务在往hive分区中写的时候,每个map几乎都要产生28个文件,这样就会产生4000*28个文件,带来大量的小文件);
2.2、数据源本身就包含有大量的小文件;
2.3、Reduce数量的增加,即意味结果文件的增加,从而产生小文件的问题。

三、小文件的影响:

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

四、小文件的解决方案:

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

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

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

1)使用Hadoop archive把小文件进行归档

Hadoop的归档文件格式也是解决小文件问题的方式之一。而且Hive提供了原生支持:

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');

如果使用的不是分区表,则可创建成外部表,并使用har://协议来指定路径。

2)HDFS Federation

Hadoop V2引入了HDFS Federation的概念
实则是将NameNode做了拆分,从而增强了它的扩展性,小文件的问题也能够得到缓解。

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

3)通过参数调节,设置map/reduce的数量,对于通常的应用,使用Hive结果合并就能达到很好的效果。

设置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*100;
//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000;

hive优化处理大量小文件相关推荐

  1. Hadoop之Hadoop企业优化(HDFS小文件优化)

    Hadoop之Hadoop企业优化 目录 MapReduce 跑的慢的原因 MapReduce优化方法之数据输入 MapReduce优化方法之Map阶段 MapReduce优化方法之Reduce阶段 ...

  2. hive与spark合并小文件,将大文件打碎成小文件

    场景一:将小文件合并成大文件. mro_hour_test表每个分区有几千个1m未压缩小文件, 以下语句是将几千个文件在输入时(map阶段)合并成150M一个的文件,插入到mro_hour_test_ ...

  3. 代达罗斯之殇-大数据领域小文件问题解决攻略

    : 点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据 ...

  4. 大数据开发之Hive优化篇8-Hive Job优化

    备注: Hive 版本 2.1.1 文章目录 Hive job优化概述 一.并行执行 二.本地执行 三.合并输入小文件 四.合并输出小文件 五.控制Map/Reduce数 5.1 控制Hive job ...

  5. HDFS小文件治理总结

    目录 背景 第一部分 回本溯源 第二部分 HDFS大量小文件的危害 第三部分 小文件治理方案总结 第四部分 总结 参考文献及资料 背景 企业级Hadoop大数据平台在实际使用过程中,可能大部分会遭遇小 ...

  6. Hive insert into小文件问题优化解决

    Hive insert into小文件问题优化解决 insert into table hhl values ('1','11'); insert into table hhl values ('1' ...

  7. HIVE优化系列(1)-- 自动合并输出的小文件

    小文件的缺陷我们就不说了,直接进入到正题. HIVE自动合并输出的小文件的主要优化手段为: set hive.merge.mapfiles = true:在只有map的作业结束时合并小文件, set ...

  8. Hive Distribute by 应用之动态分区小文件过多问题优化

    目录 0 问题现象及原因分析 1 问题解决 解决办法 2 由以上问题引出的问题 3 思考 4 小结 0 问题现象及原因分析 现象: [Error 20004]: Fatal error occurre ...

  9. exists hive中如何使用_07045.16.2如何使用Hive合并小文件

    问题背景 目前集群存于一个非常不健康的状态,主要问题是小文件太多,单个DataNode的block数量阈值是500,000,而现在单个DataNode的block为2,631,218,约为阈值的5倍, ...

最新文章

  1. 面试必问:十大经典排序算法总结
  2. mongoudb 等于_MongoDB常用操作
  3. 为什么需要架构图,怎么画?
  4. 极寒极热天气是否可以使用福禄克DSX2-5000网线测试仪工作
  5. Java历经20年沧桑,将持续革新
  6. IIS配置教程。。。。。
  7. mysql repos_mysql yum源安装
  8. OLTP和OLAP的区别
  9. ubuntu 10.04 虚拟机建立tftp服务器
  10. 百度AI语音语义一体化技术 识别的同时进行语义分析
  11. Android应用程序开发
  12. Spring中AOP的实现原理
  13. 阿里巴巴2021校招
  14. 电压暂降求交流,加Q
  15. Java学习Day_11
  16. 应用性能管理APM巅峰对决:skywalking P.K. Pinpoint
  17. 疫情引发橡胶产业市场动荡,企业如何重构供应生态打破劣局?
  18. 蒙特梭利素材-【数字海报】蒙氏素材
  19. 线程操作:冻结与解冻线程
  20. 鸿蒙系统操作界面跟苹果很像,鸿蒙界面提前“泄密”,安卓和苹果的结合体,但内核已经换了!...

热门文章

  1. html 定义函数调用函数,HTML function函数怎么定义和调用?
  2. Mysql数据库性能调优面试大全经典分析
  3. 青少年信息学(计算机)奥林匹克,全国青少年信息学(计算机)奥林匹克竞赛及分区联赛说明...
  4. python解码unicode_Python 解码 Unicode 转义字符串
  5. python vs Java(谁更胜一筹)
  6. js输出的三种方式:页面输出、对话框输出、控制台输出
  7. MES生产调度任务模型
  8. 记第一次组装台式电脑电源的小插曲附电源线接口汇总
  9. 常见的25种正则校验
  10. C语言执行效率如何保证,看这一文就够了!