HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存甚至撑爆内存。HDFS适用于高吞吐量,而不适合低时间延迟的访问。如果同时存入大量的小文件会花费很长的时间。本篇文章主要介绍在CDH6.3.0集群中如何对Hive表小文件进行合并。
环境说明:
系统:centos7.4
cdh:6.3.0
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsAjMfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5iMxcTM1UTN2AjMzkTNzYTMvw1MwETMxIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.jpg)
为了让小文件数量和分区数达到合并效果,本文进行了多次导入
可以看到共12个分区
主要查看总的小文件数量,和batch_date=20210608分区的文件数量
创建临时表时需和原表的表结构一致
如上图101个文件数合并为12个,共12个分区,每个分区下的文件被合并为了一个
确认合并后数据无异常后清理,建议数据保留一周
1.本文原表中共12个分区,101个小文件,合并后共12个文件,其每个分区中一个。
2.本文是针对CDH集群操作,如果是在CDP集群中Hive的底层执行引擎是TEZ,,所以相比CDH需要修改以前的合并参数“SET hive.merge.mapfiles=true”为“SET hive.merge.tezfiles=true;”。
3.合并完后清理原表备份的数据建议保留一周。