一、小文件概述
小文件通常指文件大小要比HDFS塊大小還要小很多的文件(在hadoop1.x版本的時候可以通過dfs.blocksize來設置,默認塊大小為64M;在hadoop2.x版本的時候,則需要通過dfs.block.size設置,且默認大小為128M)
如果存在大量小文件,則會對整個存儲系統有一定影響:
(1)1個文件塊占用namenode150字節內存,大量小文件會占用namenode內存,影響HDFS的橫向擴展能力
(2)如果使用mapreduce處理小文件,則會增加map任務數量,增加尋址次數
二、如何解決
(1)采用HAR(Hadoop Archives)的歸檔方式。
HAR為構建在其它文件系統上用於文件存檔的文件系統,通常將hdfs中的多個文件打包成一個存檔文件,減少namenode內存的使用,可以直接使用hadoop archive命令創建HAR文件。創建HAR的過程是在運行一個mr作業。
har在對小文件進行存檔后,原文件不會被刪除,且創建之后不能改變,文件名中也不能有空格存在,否則會報異常。
(2)采用CombineFileInputFormat
CombineFileInputFormat是一種新的inputformat,用於將多個文件合成一個單獨的split,而且它還可以考慮數據的存儲位置
(3)開啟JVM重用
JVM重用可以使得JVM實例在同一個job中重新使用N次,N的值可以在hadoop的mapred-site.xml文件中進行配置,通常在10-20之間。如果沒有小文件,不要開啟JVM重用,因為會一直占用使用到的task卡槽,直到任務完成才釋放。
<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>