一種基于分布式文件系統的小文件存儲方法和裝置的制造方法
【技術領域】
[0001]本發明涉及數據存儲技術,特別涉及一種基于分布式文件系統(HDFS,HadoopDistributed File System)的小文件存儲方法和裝置。
【背景技術】
[0002]HDFS是一個分布式文件系統,有著高容錯性的特點,被設計用來部署在低廉的硬件上,且能夠提供高吞吐量來訪問應用程序的數據,適合那些有著超大數據集的應用程序。
[0003]在HDFS中,每存儲一個文件,則需要為其建立并維護專屬的元數據信息。
[0004]隨著現代計算機技術及互聯網技術的發展,無論是企業還是個人的數據都呈現迅速增長之勢,相應地,需要存儲的數據量越來越多,而文件的大小從KB到MB差異非常大。
[0005]HDFS主要適合存儲大文件,在存儲小文件時則會存在一定的問題,如:由于需要維護所存儲的每個小文件的元數據信息,那么當所存儲的小文件數量很多時,則需要維護大量的元數據信息,從而需要占用極大的內存空間。
【發明內容】
[0006]有鑒于此,本發明提供了一種基于HDFS的小文件存儲方法和裝置,能夠較好的節省內存空間。
[0007]為了達到上述目的,本發明的技術方案是這樣實現的:
[0008]一種基于HDFS的小文件存儲方法,包括:
[0009]當接收到針對任一小文件的存儲請求時,為小文件分配一個文件句柄,該文件句柄由一個索引文件和一個數據文件組成,其中,索引文件中包括一個第一記錄區和一個第二記錄區,第一記錄區中存儲有數據文件的存儲路徑信息;
[0010]將小文件存儲到數據文件中,并將小文件對應的索引塊信息存儲到第二記錄區中,索引塊信息中包括:索引塊號、小文件在數據文件中的起始偏移位置和小文件的大小。
[0011]—種基于HDFS的小文件存儲裝置,包括:第一處理模塊和第二處理模塊;
[0012]所述第一處理模塊,用于當接收到針對任一小文件的存儲請求時,為小文件分配一個文件句柄,該文件句柄由一個索引文件和一個數據文件組成,其中,索引文件中包括一個第一記錄區和一個第二記錄區,第一記錄區中存儲有數據文件的存儲路徑信息;
[0013]所述第二處理模塊,用于將小文件存儲到數據文件中,并將小文件對應的索引塊信息存儲到第二記錄區中,索引塊信息中包括:索引塊號、小文件在數據文件中的起始偏移位置和小文件的大小。
[0014]可見,本發明所述方案中,可采用將多個小文件合并存儲到一個大的數據文件中的方式,來實現小文件的存儲,從而僅需要維護每個數據文件及對應的索引文件的元數據信息,進而較好的節省了內存空間。
【附圖說明】
[0015]圖1為本發明基于HDFS的小文件存儲方法實施例的流程圖。
[0016]圖2為本發明文件句柄隊列對各文件句柄的管理方式示意圖。
[0017]圖3為本發明文件句柄、索引文件和數據文件三者的關系及結構示意圖。
【具體實施方式】
[0018]為了使本發明的技術方案更加清楚、明白,以下參照附圖并舉實施例,對本發明所述方案作進一步的詳細說明。
[0019]圖1為本發明基于HDFS的小文件存儲方法實施例的流程圖。如圖1所示,包括以下步驟11?12。
[0020]步驟11:當接收到針對任一小文件X的存儲請求時,為小文件X分配一個文件句柄,該文件句柄由一個索引文件和一個數據文件組成,其中,索引文件中包括一個第一記錄區和一個第二記錄區,第一記錄區中存儲有數據文件的存儲路徑信息。
[0021]為便于表述,用小文件X來代表任意一個需要進行存儲的小文件。
[0022]數據文件的存儲路徑,即指數據文件在HDFS中的存儲路徑。
[0023]步驟12:將小文件X存儲到數據文件中,并將小文件X對應的索引塊信息存儲到第二記錄區中,索引塊信息中包括:索引塊號、小文件X在數據文件中的起始偏移位置和小文件X的大小。
[0024]以下對上述步驟11和步驟12的具體實現進行詳細說明。
[0025]步驟11中,當接收到針對任一小文件X的存儲請求時,可首先確定文件句柄隊列中包括的文件句柄數是否已經達到預定閾值,所述預定閾值的具體取值可根據實際應用中的并發訪問情況而定;如果否,即當文件句柄隊列中包括的文件句柄數未達到預定閾值時,則可創建一個新的文件句柄,其中的數據文件和索引文件的第二記錄區中均為空,并將新創建的文件句柄分配給小文件X ;如果是,即當文件句柄隊列中包括的文件句柄數已經達到預定閾值時,則可將位于文件句柄隊列最前面的文件句柄分配給小文件X。
[0026]相應地,步驟12中,當小文件X及其對應的索引塊信息均已存儲完成時,可將為小文件X分配的文件句柄放入到文件句柄隊列的末尾,從而實現文件句柄的回收,即利用隊列的先進先出特性循環工作。
[0027]需要說明的是,對于一個文件句柄來說,同一時刻只能針對一個小文件進行處理,假設文件句柄隊列中的文件句柄已經分配完畢,此時又接收到了新的待存儲的小文件,那么可進行等待,等到有文件句柄被回收到文件句柄隊列中時,再進行處理。
[0028]也就是說,可利用文件句柄隊列來管理各文件句柄,圖2為本發明文件句柄隊列對各文件句柄的管理方式示意圖。
[0029]另外,如果為小文件X分配的文件句柄的數據文件中的剩余存儲空間小于小文件X的大小或者發生存儲異常,則可將為小文件X分配的文件句柄關閉,并從文件句柄隊列中移除,并創建一個新的文件句柄,將新創建的文件句柄分配給小文件X。
[0030]如前所述,每個索引文件中分別包括一個第一記錄區和一個第二記錄區,第一記錄區中存儲有對應的數據文件的存儲路徑信息,從而建立了屬于同一文件句柄的索引文件和數據文件之間的關聯關系,第二記錄區用于存儲對應的數據文件中存儲的各小文件對應的索引塊信息,如對于小文件X來說,其對應的索引塊信息中包括:索引塊號、小文件X在數據文件中的起始偏移位置和小文件X的大小。
[0031]其中,第一記錄區位于第二記錄區的前面,且大小固定;第二記錄區中按照索引塊號由小到大的順序依次存儲有各索引塊信息,且每個索引塊信息的大小固定。
[0032]另外,在將小文件X存儲到數據文件中時,會從數據文件中已存儲的數據結束位置開始,存儲小文件X,即按照請求存儲的時間由先到后的順序,依次將各小文件存儲到數據文件中,相應地,小文件X對應的索引塊號,即等同于小文件X在數據文件中的存儲順序號。
[0033]圖3為本發明文件句柄、索引文件和數據文件三者的關系及結構示意圖。
[0034]如圖3所示,較佳地,索引文件的第一記錄區中除了存儲有數據文件的存儲路徑信息之外,還可進一步存儲有版本號信息,其中,版本號信息的大小可為SB (字節),數據文件的存儲路徑信息的大小可為256B,另外還可包括760B的擴展空間,這樣一來,第一記錄區的總大小將為1KB,由于版本號信息與本發明所述方案無直接關系,故不作介紹。
[0035]另外,如圖3所示,索引文件的第二記錄區中可存儲有各索引塊信息,較佳地,每個索引塊信息的大小可為16B,其中包括4B大小的索引塊號信息、SB大小的起始偏移位置信息和4B大小的小文件大小(長度)信息。
[0036]如圖3所示,假設數據文件中共存儲了 10個小文件,那么相應地,索引文件的第二記錄區中則會存儲有這10個小文件分別對應的索引塊信息;其中,最先存儲到數據文件中的小文件對應的索引塊號可為1,次先存儲到數據文件中的小文件對應的索引塊號可為2,依此類推。
[0037]對于任一小文件X來說,當步驟12中將小文件X及其對應的索引塊信息均已存儲完成后,可將小文件X對應的索引文件的存儲路徑信息和索引塊號返回給存儲請求的發送方,以便與實際業務數據進行關聯。
[0038]索引文件的存儲路徑,即指索引文件在HDFS中的存儲路徑。
[0039]在實際應用中,除了需要進行小文件的存儲之外,還會需要對所存儲的小文件進行讀取,具體讀取過程可如以下步驟A?D所示。
[0040]A、當接收到針對任一小文件y的讀取請求時,獲取其中攜帶的索引文件的存儲路徑信息和索引塊號。
[0041]為便于表述,用小文件y來代表任意一個需要進行讀取的小文件。
[0042]B、根據獲取到的索引文件的存儲路徑信息,找到相應的索引文件,并讀取出存儲在找到的索引文件的第一記錄區中的數據文件的存儲路徑信息,根據讀取出的數據文件的存儲路徑信息找到對應的數據文件。
[0043]C、計算(獲取到的索引塊號-1)*每個索引塊信息的大小,得到獲取到的索引塊號對應的索引塊信息在找到的索引文件的第二記錄區中的起始偏移位置,并根據得到的起始偏移位置和每個索引塊信息的大小,從第二記錄區中讀取出獲取到的索引塊號對應的索引塊信息。
[0044]D、根據讀取出的索引塊信息中的小文件7在數據文件中的起始偏移位置和小文件I的大小,從找到的數據文件中讀取出小文件1,并返回給讀取請求的發送方。
[0045]舉例說明:
[0046]假設小文件y對應的索引塊號為3,第一記錄區的大小以及每個索引塊信息的大小均如圖3所示;
[0047]當根據索引文件的存儲路徑信息找到相應的索引文件之后,由于第一記錄區的大小是已知的,那么第二記錄區的起始位置也是已知的,而又可知索引塊號為3的索引塊信息在第二記錄區中的起始偏移位置為(3-1)*16Β,那么結合每個索引塊信息的大小16B,則可從第二記錄區中讀取出索引塊號為3的索引塊信息;
[0048]并且,可根據找到的索引文件中的第一記錄區中存儲的數據文件的存儲路徑信息,找到小文件I所存儲的數據文件,而小文件I對應的索引塊信息中存儲有小文件I在數據文件中的起始偏移位置和小文件I的大小,那么則可從小文件I所存儲的數據文件中讀取出小文件y。
[0049]基于上述介紹,本發明同時公開了一種基于HDFS的小文件存儲裝置,包括:第一處理模塊和第二處理模塊。
[0050]其中,
[0051]第一處理模塊,用于當接收到針對任一小文件的存儲請求時,為小文件分配一個文件句柄,該文件句柄由一個索引文件和一個數據文件組成,其中,索引文件中包括一個第一記錄區和一個第二記錄區