HAR技术之一小文件问题 - huangyuefeng/study GitHub Wiki

HAR技术之一小文件问题

src_url

Hadoop Archives和Hive Archives都可以简写为HAR。 两者其实本质是一样的。正如Hive是基于Hadoop的,所以用同样的存档技术,就不奇怪了。

话说HAR用来做什么,简单来说是解决 小文件带来的问题。

Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量。但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小。而且这些表通常会按日期进行分区,随着时间的推移,HDFS的文件数目就会逐渐增加。

小文件带来的问题

关于这个问题的阐述可以读一读Cloudera的这篇文章。简单来说,HDFS的文件元信息,包括位置、大小、分块信息等,都是保存在NameNode的内存中的。每个对象大约占用150个字节,因此一千万个文件及分块就会占用约3G的内存空间,一旦接近这个量级,NameNode的性能就会开始下降了。

此外,HDFS读写小文件时也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接。对于MapReduce程序来说,小文件还会增加Mapper的个数,每个脚本只处理很少的数据,浪费了大量的调度时间。当然,这个问题可以通过使用CombinedInputFile和JVM重用来解决。

Hive小文件产生的原因

前面已经提到,汇总后的数据量通常比源数据要少得多。而为了提升运算速度,我们会增加Reducer的数量,Hive本身也会做类似优化——Reducer数量等于源数据的量除以hive.exec.reducers.bytes.per.reducer所配置的量(默认1G)。Reducer数量的增加也即意味着结果文件的增加,从而产生小文件的问题。

Hadoop的归档文件格式也是解决小文件问题的方式之一。而且Hive提供了原生支持, 请留意下一篇 Hadoop怎么用HAR

为了聚焦,本系列文章只涉及HAR技术,其他参考文章,可以看HDFS小文件主流解决方案