HDFS存在大量小文件問題的解決方案


一、小文件概述  

  小文件通常指文件大小要比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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM