Bootstrap

HDFS小文件问题分析与解决方案(面试层面~)

会造成的影响

(1)存储层面:

在HDFS中,每个block,文件或者目录在内存中均以对象的形式存储
1个文件块,占用namenode多大内存150字节
1亿个小文件*150字节
1个文件块 * 150字节
这样会使namenode内存容量严重影响了集群的扩展。如果访问大量小文件,需要不断的从一个datanode跳到另一个datanode,严重影响性能。

(2)计算层面:

每个小文件都会起到一个MapTask,占用了大量计算资源

解决方法

(1)采用har归档方式,将小文件归档

使用har归档方式时,要注意两点:第一,对小文件进行存档后,原文件并不会自动被删除,需要用户自己删除;第二,创建HAR文件的过程实际上是在运行一个mapreduce作业,因而需要有一个hadoop集群运行此命令。

(2)采用CombineTextInputFormat

它可以将多个文件合并成一个单独的split,并且可以设置存储位置。

(3)有小文件场景开启JVM重用;如果没有小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。

JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间

<property>
    <name>mapreduce.job.jvm.numtasks</name>
    <value>10</value>
    <description>How many tasks to run per jvm,if set to -1 ,there is  no limit</description>
</property>

在这里插入图片描述

;