会造成的影响
(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 torun per jvm,if set to-1,there is no limit</description></property>
版权归原作者 Cym02 所有, 如有侵权,请联系我们删除。