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