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