Hadoop Archive解決海量小檔案儲存

2022-06-23 21:14:05 字數 1271 閱讀 9367

2010-08-05 / posted in hadoop / 5 comments

這段時間看了公司部門郵件中大家討論較多的幾個關於hdfs的問題,一個是關於namenode可擴充套件性的討論,目前單臺伺服器作為namenode,當檔案數量規模不斷增大時,後設資料的規模增長將是一個需要面對的問題,由於namenode需要將所有後設資料load到記憶體中,單臺namenode可能會無法管理海量的後設資料。另一個是hdfs中sequencefile儲存方式的討論,利用block壓縮方式可以很好的解決空間壓力。

今天剛好看到yahoo! hadoop blog上的一篇文章hadoop archive: file compaction for hdfs,和上面兩個問題都有一點聯絡,文章主要提出了在hdfs中存在海量的小檔案時,會給儲存帶來的一系列問題 。

hdfs中檔案是按block來儲存的,預設一個block的長度是128mb,當hdfs中存在大量小檔案(長度小於128mb)時,不僅佔用大量儲存空間,而且也佔用大量的namespace,給namenode帶來了記憶體壓力,yahoo內部有一個生產叢集,統計下來有57,000,000個小於128mb的檔案,這些小檔案消耗了95%的namespace,佔用了30%的儲存空間。namenode的壓力一般也常常是因為有海量的小檔案存在,如果沒有這些小檔案存在的話,namenode記憶體還沒撐爆,估計儲存空間就先爆了。。

文中提到了解決方法,是利用hadoop archive(har),這個特性從hadoop 0.18.0版本就已經引入了,他可以將眾多小檔案打包成一個大檔案進行儲存,並且打包後原來的檔案仍然可以通過map-reduce進行操作,打包後的檔案由索引和儲存兩大部分組成,索引部分記錄了原有的目錄結構和檔案狀態。

舉個例子,原本獲取一個檔案通過命令

hadoop fs –get hdfs://namenode/foo/file-1 localdir
如果將foo目錄打包成bar.har後,獲取file-1的命令就變成

hadoop fs –get har://namenode/bar.har#foo/file-1 localdir
通過以下命令可以將檔案打包成har。

hadoop archive -archivename  *
但是,目前har檔案中的源資料只能獲取,不能修改