HDFS小檔案問題

2022-07-12 01:57:13 字數 2519 閱讀 9433

1、概述

小檔案是指檔案size小於hdfs上block大小的檔案。這樣的檔案會給hadoop的擴充套件性和效能帶來嚴重問題。首先,在hdfs中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有1000 0000個小檔案,每個檔案占用乙個block,則namenode大約需要2g空間。如果儲存1億個檔案,則namenode需要20g空間(見參考資料[1][4][5])。這樣namenode記憶體容量嚴重制約了集群的擴充套件。 其次,訪問大量小檔案速度遠遠小於訪問幾個大檔案。hdfs最初是為流式訪問大檔案開發的,如果訪問大量小檔案,需要不斷的從乙個datanode跳到另乙個datanode,嚴重影響效能。最後,處理大量小檔案速度遠遠小於處理同等大小的大檔案的速度。每乙個小檔案要占用乙個slot,而task啟動將耗費大量時間甚至大部分時間都耗費在啟動task和釋放task上。

本文首先介紹了hadoop自帶的解決小檔案問題的方案(以工具的形式提供),包括hadoop archive,sequence file和combinefileinputformat;然後介紹了兩篇從系統層面解決hdfs小檔案的**,一篇是中科院計算所2023年發表的,用以解決hdfs上儲存地理資訊小檔案的方案;另一篇是ibm於2023年發表的,用以解決hdfs上儲存ppt小檔案的方案。

2、hdfs檔案讀寫流程

在正式介紹hdfs小檔案儲存方案之前,我們先介紹一下當前hdfs上檔案訪問的基本流程。

(1) 讀檔案流程

1)client端傳送讀檔案請求給namenode,如果檔案不存在,返回錯誤資訊,否則,將該檔案對應的block及其所在datanode位置傳送給client

2) client收到檔案位置資訊後,與不同datanode建立socket連線並行獲取資料。

(2) 寫檔案流程

1)client端傳送寫檔案請求,namenode檢查檔案是否存在,如果已存在,直接返回錯誤資訊,否則,傳送給client一些可用datanode節點

2)client將檔案分塊,並行儲存到不同節點上datanode上,傳送完成後,client同時傳送資訊給namenode和datanode

3)namenode收到的client資訊後,傳送確信資訊給datanode

4)datanode同時收到namenode和datanode的確認資訊後,提交寫操作。

3、hadoop自帶的解決方案

對於小檔案問題,hadoop本身也提供了幾個解決方案,分別為:hadoop archive,sequence file和combinefileinputformat。

(1) hadoop archive

hadoop archive或者har,是乙個高效地將小檔案放入hdfs塊中的檔案存檔工具,它能夠將多個小檔案打包成乙個har檔案,這樣在減少namenode記憶體使用的同時,仍然允許對檔案進行透明的訪問。

對某個目錄/foo/bar下的所有小檔案存檔成/outputdir/ zoo.har:

hadoop archive -archivename zoo.har -p /foo/bar /outputdir

當然,也可以指定har的大小(使用-dhar.block.size)。

har是在hadoop file system之上的乙個檔案系統,因此所有fs shell命令對har檔案均可用,只不過是檔案路徑格式不一樣,har的訪問路徑可以是以下兩種格式:

har://scheme-hostname:port/archivepath/fileinarchive

har:///archivepath/fileinarchive(本節點)

可以這樣檢視har檔案存檔中的檔案:

hadoop dfs -ls har:///user/zoo/foo.har

輸出:har:///user/zoo/foo.har/hadoop/dir1

har:///user/zoo/foo.har/hadoop/dir2

使用har時需要兩點,第一,對小檔案進行存檔後,原檔案並不會自動被刪除,需要使用者自己刪除;第二,建立har檔案的過程實際上是在執行乙個mapreduce作業,因而需要有乙個hadoop集群執行此命令。

此外,har還有一些缺陷:第一,一旦建立,archives便不可改變。要增加或移除裡面的檔案,必須重新建立歸檔檔案。第二,要歸檔的檔名中不能有空格,否則會丟擲異常,可以將空格用其他符號替換(使用-dhar.space.replacement.enable=true 和-dhar.space.replacement引數)。

(2) sequence file

sequence file由一系列的二進位制key/value組成,如果為key小檔名,value為檔案內容,則可以將大批小檔案合併成乙個大檔案。

hadoop-0.21.0中提供了sequencefile,包括writer,reader和sequencefilesorter類進行寫,讀和排序操作。如果hadoop版本低於0.21.0的版本,實現方法可參見[3]。

(3)combinefileinputformat

combinefileinputformat是一種新的inputformat,用於將多個檔案合併成乙個單獨的split,另外,它會考慮資料的儲存位置。

hdfs小檔案問題及解決

乙個檔案塊占用 namenode 150位元組 的記憶體,那麼如果有1億個小檔案 的話,每個佔namenode150位元組的記憶體,非常大.小檔案的話不滿128m,都是乙個檔案對應乙個maptask.如果乙個maptask占用1g記憶體,那麼你的記憶體就會被耗盡.第一種是採用har歸檔將多個小檔案歸...

HDFS合併小檔案

眾所周知,hdfs中過多的小檔案,會給namenode造成很大的壓力,所謂的小檔案,是指遠遠小於檔案塊大小的檔案。在使用hdfs的過程中,應盡量避免生成過多的小檔案。假設存放在本地的資料由很多個小檔案組成,需要上傳到hdfs。一般的做法是在本地使用指令碼 程式先把小檔案合併後再上傳。假設本地有兩個小...

小檔案處理 HDFS

1.儲存 hdfs可以儲存小檔案,但是這個過程中,每乙個小檔案在儲存的時候都會產生一條元資料,這也就意味著如果儲存大量的小檔案,就會產生大量的元資料,則意味著記憶體會被大量占用,此時就會導致hdfs的讀寫效率整體降低 2.計算 每乙個小檔案都會看做乙個切片來進行處理,每乙個切片都會對應乙個mapta...