小文件问题
原因:
① 众所周知,小文件在HDFS中存储本身就会占用过多的内存空间,那么对于MR查询过程中过多的小文件又会造成启动过多的Mapper Task, 每个Mapper都是一个后台线程,会占用JVM的空间。
② 在Hive中,动态分区会造成在插入数据过程中,生成过多零碎的小文件。
③ 不合理的Reducer Task数量的设置也会造成小文件的生成,因为最终。Reducer是将数据落地到HDFS中的。
④ Hive中分桶表的设置。
解决方案:
① 在数据源头HDFS中控制小文件产生的个数,比如采用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件(常见于在流计算的时候采用Sequencefile格式进行存储)。
② 减少reduce的数量(可以使用参数进行控制)。
③ 慎重使用动态分区,最好在分区中指定分区字段的val值。
④ 做好数据的校验工作,比如通过脚本方式检测hive表的文件数量,并进行文件合并。
⑤ 合并多个文件数据到一个文件中,重新构建表。