HDFS小文件危害以及如何解决
小文件的定义
文件大小小于或者等于30M的文件
hdfs小文件带来危害
(1)HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存甚至撑爆内存
(2)HDFS适用于高吞吐量,而不适合低时间延迟的访问。如果同时存入大量的小文件会花费很长的时间。hive或者spark计算的时候会影响他们的速度,因为spark计算时会将数据从硬盘读到内存,零碎的文件将产生较多的寻道过程。
(3) 流式读取的方式,不适合多用户写入,以及任意位置写入。如果访问小文件,则必须从一个datanode跳转到另外一个datanode,这样大大降低了读取性能。
解决方案
(1)生产上首先需要设置小文件的阈值,到达这个值对小文件进行合并。对于这个合并,一种是在HDFS存储之前就进行合并,还有一种就是计算完之后根据业务周期来进行合并。后一种需要在计算时格外对小文件进行调整。Apache官方也提供了官方工具去合并hdfs上的小文件。Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。
(2)多Master设计,让元数据分散存放到不同的NameNode中。
也许还有同学会提到增大Nam