基于分布式文件系統(tǒng)小文件合并的并行追加方法及系統(tǒng)的制作方法
【專(zhuān)利摘要】本發(fā)明提出基于分布式文件系統(tǒng)小文件合并的并行追加方法及系統(tǒng),該方法包括將小文件上傳到Memcache步驟,客戶端上傳的小文件到目標(biāo)文件中,將所述小文件的名稱作為key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表key_list上,所述表key_list存儲(chǔ)在所述Memcache中,所述表key_list記錄所述Memcache中存儲(chǔ)的所有小文件的key;小文件追加到目標(biāo)大文件步驟,從所述Memcache中下載所述表key_list,根據(jù)所述表key_list中所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一個(gè)線性表,所述線性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相對(duì)應(yīng)的所述小文件合并。
【專(zhuān)利說(shuō)明】
基于分布式文件系統(tǒng)小文件合并的并行追加方法及系統(tǒng)
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及文件處理領(lǐng)域問(wèn)題,特別涉及基于分布式文件系統(tǒng)小文件合并的并行 追加方法及系統(tǒng)。
【背景技術(shù)】
[0002] 互聯(lián)網(wǎng)改變了世界,并帶動(dòng)了一系列產(chǎn)業(yè)鏈,每年電子產(chǎn)品等設(shè)備產(chǎn)生的數(shù)據(jù)量 都暴增。2013年IDC和EMC發(fā)布的"數(shù)字宇宙報(bào)告"預(yù)計(jì),到2020年,數(shù)字宇宙規(guī)模將達(dá)到 40ZB,由于網(wǎng)上購(gòu)物、社交媒體的興起,產(chǎn)生了大量的圖片、郵件、消息、日志文件,在暴增的 數(shù)據(jù)中占有了極大部分,這些文件的大小基本為K級(jí)或Μ級(jí),由于大小小于HDFS上塊大小,因 此都屬于小文件。
[0003] Hadoop是一種大數(shù)據(jù)存儲(chǔ)和處理平臺(tái),能夠?qū)Υ笠?guī)模分布式數(shù)據(jù)集進(jìn)行處理,被 業(yè)界廣泛使用,盡管如此,Hadoop并不適合大量小文件的存儲(chǔ),在NameNode上會(huì)產(chǎn)生大量的 元數(shù)據(jù),給性能帶來(lái)極大的影響。
[0004] 解決小文件的存儲(chǔ)和處理問(wèn)題,主要有以下這些方式:
[0005] 1 .Hadoop 自帶功能:
[0006] (1從代1^代:4代1^代是一種文件存檔工具,能夠高效地將!10?3中的小文件合并為 一個(gè)HAR文件,形成文件存儲(chǔ)二級(jí)結(jié)構(gòu),對(duì)外,HAR是一個(gè)大文件,在NameNode中保存它的元 數(shù)據(jù);對(duì)內(nèi)建立索引,用來(lái)訪問(wèn)合并的小文件,從而降低了NameNode中元數(shù)據(jù)的數(shù)據(jù)量, Archive并不完美,它的缺點(diǎn)是,將小文件合并為HAR文件的過(guò)程是一個(gè)MapReduce作業(yè),速 度比較慢;且文件一旦創(chuàng)建,便不可改變。
[0007] (2)SequenceFile: SequenceFile由一系列二進(jìn)制key/value組成,當(dāng)小文件名作 為key,文件內(nèi)容作為value,可將大批小文件序列化到一個(gè)大文件中,作為一個(gè)二進(jìn)制序列 化過(guò)的字節(jié)流組成的文本存儲(chǔ)文件,能夠在map/reduce過(guò)程中被使用。
[0008] (3)CombineFilelnputFormat:在執(zhí)行MapReduce任務(wù)時(shí),若每個(gè)小文件產(chǎn)生一個(gè) mapper,會(huì)造成資源浪費(fèi)的問(wèn)題,CombineFi lelnputFormat在mapper中將多個(gè)文件合成一 個(gè)split作為輸入,減少mapper數(shù)量,提高M(jìn)apReduce任務(wù)的執(zhí)行速度,且提高資源利用率。
[0009] 2.其他方法:
[0010] 現(xiàn)有的研究情況主要在兩個(gè)場(chǎng)景下研究小文件的合并:(1)HDFS海量小文件存儲(chǔ) (2)MapReduce中小文件合并。Hadoop的自帶功能中,Archi ve屬于(1); SequenceFi le和 CombineFi lelnputFormat都屬于(2),除此以外,本發(fā)明也是在(1)的場(chǎng)景下進(jìn)行研究。 [0011]很多研究與本發(fā)明一樣,將文件合并后,再上傳到存儲(chǔ)位置(如"李鐵,《面向海量 小文件存取的HDFS優(yōu)化研究》,東華大學(xué)學(xué)位論文,2015年"、發(fā)明專(zhuān)利"一種小文件處理方 法及裝置"、發(fā)明專(zhuān)利"一種Hadoop存取海量小文件的優(yōu)化方法"、發(fā)明專(zhuān)利"海量小文件分 級(jí)存儲(chǔ)方法及系統(tǒng)"、"楊彬,"分布式文件系統(tǒng)HDFS處理小文件的優(yōu)化方案",軟件2014年第 35卷第6期,2014年"、發(fā)明專(zhuān)利"一種小文件的存儲(chǔ)、查詢及刪除方法和系統(tǒng)"、發(fā)明專(zhuān)利"一 種集群存儲(chǔ)中并行訪問(wèn)大量小文件的方法及系統(tǒng)李鐵,"面向海量小文件存取的HDFS 優(yōu)化研究",東華大學(xué)學(xué)位論文,2015年"設(shè)計(jì)了一個(gè)基于HDFS的中間件,在用戶接口與HDFS 之間建立一個(gè)任務(wù)層,每個(gè)功能對(duì)應(yīng)自己的緩沖區(qū),將需要合并或刪除的文件先暫時(shí)存入 各自的緩沖區(qū)中,當(dāng)文件達(dá)到一定數(shù)量或過(guò)了一定時(shí)間,再統(tǒng)一對(duì)需要處理的一批文件進(jìn) 行操作,然而這個(gè)方法不能將文件追加到已有的文件中,只能和新的文件一起合并。發(fā)明專(zhuān) 利"一種小文件處理方法及裝置"將具有相同文件標(biāo)識(shí)的文件組合在一起,將每個(gè)小文件的 索引關(guān)鍵值封裝到文件塊中,存入第一內(nèi)存區(qū)中,與本發(fā)明不同的地方是,發(fā)明專(zhuān)利"一種 小文件處理方法及裝置"進(jìn)行文件查詢時(shí),將文件塊整體讀入第二內(nèi)存區(qū)中,本發(fā)明不需要 將整個(gè)文件塊讀出。發(fā)明專(zhuān)利"一種集群存儲(chǔ)中并行訪問(wèn)大量小文件的方法及系統(tǒng)"將小文 件存放在緩存中,根據(jù)文件大小,當(dāng)緩存的小文件的大小的總和達(dá)到第一預(yù)設(shè)值時(shí),將所述 緩存的小文件合并成一個(gè)臨時(shí)文件,存放在緩存中。發(fā)明專(zhuān)利"海量小文件分級(jí)存儲(chǔ)方法及 系統(tǒng)"與發(fā)明專(zhuān)利"一種集群存儲(chǔ)中并行訪問(wèn)大量小文件的方法及系統(tǒng)"類(lèi)似,采用存儲(chǔ)池, 但不同的是發(fā)明專(zhuān)利"海量小文件分級(jí)存儲(chǔ)方法及系統(tǒng)"中存儲(chǔ)池是合并后的大文件的最 終存儲(chǔ)位置。"楊彬,"分布式文件系統(tǒng)HDFS處理小文件的優(yōu)化方案",軟件2014年第35卷第6 期,2014年"將索引表放置在合并文件塊開(kāi)頭,形成HDFS的擴(kuò)展類(lèi)型,用來(lái)記錄合并塊中每 個(gè)小文件的偏移位置;在NameNode中記錄每個(gè)合并文件包含哪些塊的信息,查詢時(shí)通過(guò)文 件名稱,就能查找到文件的具體位置。發(fā)明專(zhuān)利"一種小文件的存儲(chǔ)、查詢及刪除方法和系 統(tǒng)"在上傳前就將小文件合并為了大文件,大文件由索引區(qū)偏移量存儲(chǔ)區(qū)域,小文件存儲(chǔ)區(qū) 域以及小文件索引信息存儲(chǔ)區(qū)域組成,且三個(gè)文件區(qū)域連續(xù)存放,當(dāng)需要將小文件并入大 文件時(shí),將小文件存入小文件存儲(chǔ)區(qū)域后,需要將小文件索引信息存儲(chǔ)區(qū)域向后偏移小文 件大小,這與本發(fā)明中三個(gè)部分是作為單獨(dú)文件存在不同。
【發(fā)明內(nèi)容】
[0012] 針對(duì)現(xiàn)有技術(shù)的不足,本發(fā)明提出分布式文件系統(tǒng)小文件合并的并行追加方法及 系統(tǒng)。
[0013] 本發(fā)明提出一種分布式文件系統(tǒng)小文件合并的并行追加方法,包括:
[0014] 將小文件上傳到Memcache步驟,客戶端上傳的小文件到目標(biāo)文件中,將所述小文 件的名稱作為key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表 key_l ist上,所述表key_list存儲(chǔ)在所述Memcache中,所述表key_l ist記錄所述Memcache 中存儲(chǔ)的所有小文件的key;
[0015] 小文件追加至lj目標(biāo)大文件步驟,從所述Memcache中下載所述表key_list,根據(jù)所 述表key_l ist中所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一 個(gè)線性表,所述線性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相 對(duì)應(yīng)的所述小文件合并。
[0016] 所述步驟1還包括當(dāng)所述客戶端上傳所述小文件后,發(fā)出一個(gè)追加請(qǐng)求,將所述追 加請(qǐng)求放入請(qǐng)求隊(duì)列request_queue中;
[0017] 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追 加請(qǐng)求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝lj重 新進(jìn)行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù) 乃,若所述線程數(shù)c〇unt〈 =所述最大并發(fā)處理數(shù)未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù) count加1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)9.,.則不取出所述追加請(qǐng)求,當(dāng)存在上 傳文件的線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。
[0018] 所述步驟1包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_li st;從 所述Memcache下載所述表key_list;將所述key從尾部追加到所述表key_list里;將修改后 的所述表key_list上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程數(shù)count減 1〇
[0019] 所述步驟2包括從所述Memcache下載所述表key_list,重命名為表key_l ist_ local;判斷key_list是否為空,若所述表key_list為空,貝lj用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì) 下一批小文件進(jìn)行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。
[0020] 所述步驟2包括:打開(kāi)所述表key_list_l〇Cal,讀取所述小文件的名稱與所述目標(biāo) 文件;將所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及以上 的小文件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。
[0021] 本發(fā)明還提出一種分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),包括:
[0022] 上傳模塊,用于客戶端上傳的小文件到目標(biāo)文件中,將所述小文件的名稱作為 key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表key_l ist上,所 述表key_l i st存儲(chǔ)在所述Memcache中,所述表key_l i st記錄所述Memcache中存儲(chǔ)的所有小 文件的key;
[0023] 合并模塊,用于從所述Memcache中下載所述表key_l i st,根據(jù)所述表key_l i st中 所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一個(gè)線性表,所述線 性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相對(duì)應(yīng)的所述小文 件合并。
[0024]所述上傳模塊還包括當(dāng)所述客戶端上傳所述小文件后后,發(fā)出一個(gè)追加請(qǐng)求,將 所述追加請(qǐng)求放入請(qǐng)求隊(duì)列request_queue中;
[0025] 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追 加請(qǐng)求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝lj重 新進(jìn)行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù) 己,若所述線程數(shù)count〈 =所述最大并發(fā)處理數(shù)d,未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù) count加1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)則不取出所述追加請(qǐng)求,當(dāng)存在上 傳文件的線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。
[0026]所述上傳模塊包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_ 1 i st;從所述Memcache下載所述表key_l i st;將所述key從尾部追加到所述表key_l i st里; 將修改后的所述表key_l i st上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程 數(shù)count減1。
[0027] 所述合并模塊包括從所述Memcache下載所述表key_l i st,重命名為表key_l i st_ local;判斷key_list是否為空,若所述表key_list為空,貝lj用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì) 下一批小文件進(jìn)行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。
[0028]所述合并模塊包括:打開(kāi)所述表key_list_local,讀取所述小文件的名稱與所述 目標(biāo)文件;將所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及 以上的小文件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。
[0029] 由以上方案可知,本發(fā)明的優(yōu)點(diǎn)在于:
[0030] 本發(fā)明并行地向分布式文件系統(tǒng)的目標(biāo)大文件中追加小文件,使小文件按類(lèi)有序 存儲(chǔ),同時(shí)減少了NameNode中的元數(shù)據(jù),減輕NameNode的壓力;降低了上傳時(shí)的10開(kāi)銷(xiāo),使 追加小文件更加高效。
【附圖說(shuō)明】
[0031 ] 圖1是文件上傳 Memcache流程圖;
[0032]圖2是小文件追加到目標(biāo)大文件圖。
[0033]圖3是訪問(wèn)小文件流程圖。
【具體實(shí)施方式】
[0034]為了解決現(xiàn)有技術(shù)中存在的技術(shù)問(wèn)題,本發(fā)明提出一種分布式文件系統(tǒng)小文件合 并的并行追加方法,包括:
[0035]將小文件上傳到Memcache步驟,客戶端上傳的小文件到目標(biāo)文件中,將所述小文 件的名稱作為key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表 key_l ist上,所述表key_list存儲(chǔ)在所述Memcache中,所述表key_l ist記錄所述Memcache 中存儲(chǔ)的所有小文件的key,memcache是一套分布式的高速緩存系統(tǒng);
[0036] 小文件追加到目標(biāo)大文件步驟,從所述Memcache中下載所述表key_list,根據(jù)所 述表key_l ist中所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一 個(gè)線性表,所述線性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相 對(duì)應(yīng)的所述小文件合并。
[0037]所述步驟1還包括當(dāng)所述客戶端上傳所述小文件后后,發(fā)出一個(gè)追加請(qǐng)求,將所述 追加請(qǐng)求放入請(qǐng)求隊(duì)列request_queue中;
[0038] 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追 加請(qǐng)求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝1J重 新進(jìn)行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù) 3 ,若所述線程數(shù)count〈 =所述最大并發(fā)處理數(shù)未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù) count加1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)9,,則不取出所述追加請(qǐng)求,當(dāng)存在上 傳文件的線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。
[0039] 所述步驟1包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_list;從 所述Memcache下載所述表key_list;將所述key從尾部追加到所述表key_list里;將修改后 的所述表key_list上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程數(shù)count減 1〇
[0040] 所述步驟2包括從所述Memcache下載所述表key_list,重命名為表key_l ist_ local;判斷key_list是否為空,若所述表key_list為空,貝lj用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì) 下一批小文件進(jìn)行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。
[0041] 所述步驟2包括:打開(kāi)所述表key_list_local,讀取所述小文件的名稱與所述目標(biāo) 文件;將所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及以上 的小文件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。
[0042] 本發(fā)明還提出一種分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),包括:
[0043] 上傳模塊,用于客戶端上傳的小文件到目標(biāo)文件中,將所述小文件的名稱作為 key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表key_l ist上,所 述表key_l i st存儲(chǔ)在所述Memcache中,所述表key_l i st記錄所述Memcache中存儲(chǔ)的所有小 文件的key;
[0044] 合并模塊,用于從所述Memcache中下載所述表key_l i st,根據(jù)所述表key_l i st中 所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一個(gè)線性表,所述線 性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相對(duì)應(yīng)的所述小文 件合并。
[0045] 所述上傳模塊還包括當(dāng)所述客戶端上傳所述小文件后后,發(fā)出一個(gè)追加請(qǐng)求,將 所述追加請(qǐng)求放入請(qǐng)求隊(duì)列request_queue中;
[0046] 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追 加請(qǐng)求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝1J重 新進(jìn)行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù) 乃,若所述線程數(shù)count〈 =所述最大并發(fā)處理數(shù)0,未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù) count加1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)9,.則不取出所述追加請(qǐng)求,當(dāng)存在上 傳文件的線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。
[0047]所述上傳模塊包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_ 1 i st;從所述Memcache下載所述表key_l i st;將所述key從尾部追加到所述表key_l i st里; 將修改后的所述表key_l i st上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程 數(shù)count減1。
[0048] 所述合并模塊包括從所述Memcache下載所述表key_l ist,重命名為表key_list_ local;判斷key_list是否為空,若所述表key_list為空,貝lj用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì) 下一批小文件進(jìn)行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。
[0049] 所述合并模塊包括:打開(kāi)所述表key_list_local,讀取所述小文件的名稱與所述 目標(biāo)文件;將所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及 以上的小文件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。
[0050] 下面結(jié)合附圖1,2,更進(jìn)一步描述本發(fā)明步驟,如圖1,2本發(fā)明追加文件的步驟包 含連續(xù)執(zhí)行:A、上傳文件到Memcache ;B、小文件追加到目標(biāo)大文件。具體的一種實(shí)施方式如 下:
[0051] A.客戶端將文件從本地上傳到Memcache中,如圖1所示,其實(shí)現(xiàn)方法為:
[0052] A1.用戶在客戶端界面,路徑Pl選擇需要的小文件h,名稱為SrCl,并選擇目標(biāo)文件 desti,點(diǎn)擊上傳小文件fi;
[0053] A2.客戶端點(diǎn)擊上傳后,會(huì)發(fā)出一個(gè)追加請(qǐng)求,將其放入請(qǐng)求隊(duì)列request_queue 中;
[0054] A3.從request_queue中取出請(qǐng)求,倉(cāng)ij建一個(gè)線程處理這個(gè)請(qǐng)求,分別執(zhí)行以下步 驟:
[0055] A3-1:判斷請(qǐng)求隊(duì)列中是否是空的,有兩種可能:1)不空,執(zhí)行A3_2;2)為空,回到 A3-1;
[0056] A3-2:判斷當(dāng)前處理請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù)3。這里有兩種 可能:1) count<= θ,未超過(guò)最大并發(fā)數(shù),則將count加1,然后執(zhí)行A4; 2) count>3,則不取 出請(qǐng)求,當(dāng)有上傳文件的線程結(jié)束后再取出請(qǐng)求,并對(duì)其進(jìn)行處理。
[0057] A4.將fi名稱srci作為key,將fi內(nèi)容作為value,上傳到Memcache中。
[0058] A5 .文件fi上傳結(jié)束后,將key寫(xiě)到文件key_list上,文件key_list存儲(chǔ)在 Memcache上,記錄了 Memcache中存儲(chǔ)的所有小文件的key。分別執(zhí)行以下步驟:
[0059] A5-1:對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改key_list;
[0060] A5-2:將 key_l ist文件從 Memcache下載下來(lái);
[0061 ] A5-3: f i的key是其文件名srci,從尾部追加到key_list里;
[0062] A5-4:將修改后的key_l ist 上傳到Memcache 中;
[0063] A5-5:對(duì)當(dāng)前線程解鎖,并將count減1。
[0064] B.將小文件追加到HDFS上的大文件中,如圖2所示,其實(shí)現(xiàn)方法為:
[0065] B1.得到key_list,并更新key_list文件;分別執(zhí)行以下步驟:
[0066] B1-1:從Memcache下載key_list文件,重命名為key_list_local;
[0067] B1-2:判斷key_list是否為空,有下面兩種情況:l)key_list為空,則直接跳到B4; 2)key_list 不空,則執(zhí)行 B1-3;
[0068] B1-3:創(chuàng)建一個(gè)空的key_l ist文件,將其上傳到Memcache中。
[0069] B2.構(gòu)建Hash表,用來(lái)記錄相同目標(biāo)文件desti的小文件的文件名srci;分別執(zhí)行以 下步驟:
[0070] B2-1:打開(kāi)key_list_local文件,讀取每一條記錄中的srci和desti;
[0071 ] B2-2:將desti作為hash值,將srci分別存入hash表中。當(dāng)發(fā)生沖突時(shí),即兩個(gè)小文 件的desti相同時(shí),則將其加入到對(duì)應(yīng)的線性表后。
[0072] B3.將目標(biāo)文件相同的小文件進(jìn)行合并,也就是將相同hash地址后對(duì)應(yīng)的線性表 中的小文件合并,再追加到目標(biāo)文件后;分別執(zhí)行以下步驟:
[0073] B3-1 :找到Θ個(gè)不空的hash項(xiàng),創(chuàng)建Θ個(gè)線程;
[0074] B3-2:在每個(gè)線程中,讀取相應(yīng)hash項(xiàng)后面的線性表中的小文件,將這些小文件從 Memcache下載下來(lái);
[0075] B3-3:將小文件合并為一個(gè)中文件fmi,并記錄每個(gè)文件大小sizei;
[0076] B3-4:打開(kāi)HDFS上的目標(biāo)文件,計(jì)算part-x文件追加前的大小part_sizei,將fmi用 字節(jié)流的形式append到目標(biāo)文件下的part-x文件后;
[0077] B3_5:_index是part-x文件的索引文件,記錄了part-x中存儲(chǔ)的每個(gè)文件的目錄, 名稱,權(quán)限,時(shí)間戳,起始偏移位置,大小等信息。記錄_index文件修改前的大小index_ 8126_&6;^^ ;將81'(^作為文件名,?31'1:_8126作為起始偏移位置,81261作為大小,按照相應(yīng) 的格式,將需要的信息寫(xiě)到_index文件后,并記錄修改后_1]1(161文件的大小index_size_ after;
[0078] B3-6 :_masterindex文件是_index文件的索引文件,將index_size_before和 ;[11(161_812 6_3;1^61'分別作為;[11(161文件起始和結(jié)束偏移位置;按照_1]^8丨61';[11(161文件中記 錄的格式,將相應(yīng)信息追加到_masterindex后。
[0079] B4.用變量T來(lái)記錄時(shí)間,t時(shí)間后處理下一批小文件追加。
[0080] 如圖3,訪問(wèn)小文件,具體的實(shí)施方式如下:
[0081] C1.客戶端發(fā)出訪問(wèn)請(qǐng)求,需要訪問(wèn)文件6,請(qǐng)求中包含文件名SrCl以及目標(biāo)文件 名desti;
[0082] C2.從Memcache中的key_list文件上面用文件名查找該文件,執(zhí)行的具體步驟如 下:
[0083] C2-1:下載 key_list 文件;
[0084] C2-2:在key_list文件中查找文件名srci,這里包含兩種情況:l)key_list中包含 該文件,則根據(jù)srci從Memcache中取出該文件,并返回給客戶端;2)不包含該文件,則執(zhí)行 C3〇
[0085] C3.從目標(biāo)文件desti中的_11^8七61';!_11(161和_;!_11(161中查找文件:^,并返回給客戶端。
【主權(quán)項(xiàng)】
1. 一種分布式文件系統(tǒng)小文件合并的并行追加方法,其特征在于,包括: 將小文件上傳到Memcache步驟,客戶端上傳的小文件到目標(biāo)文件中,將所述小文件的 名稱作為key,將所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表key_ 1 ist上,所述表key_l ist存儲(chǔ)在所述Memcache中,所述表key_l ist記錄所述Memcache中存 儲(chǔ)的所有小文件的key; 小文件追加到目標(biāo)大文件步驟,從所述Memcache中下載所述表key_l i st,根據(jù)所述表 key_list中所述小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一個(gè)線 性表,所述線性表中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相對(duì)應(yīng) 的所述小文件合并。2. 如權(quán)利要求1所述的分布式文件系統(tǒng)小文件合并的并行追加方法,其特征在于,所述 步驟1還包括當(dāng)所述客戶端上傳所述小文件后,發(fā)出一個(gè)追加請(qǐng)求,將所述追加請(qǐng)求放入請(qǐng) 求隊(duì)列 request_queue 中; 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追加請(qǐng) 求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝lj重新進(jìn) 行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù)0,若 所述線程數(shù)ccnmt〈 =所述最大并發(fā)處理數(shù)未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù)count加 1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)乃,則不取出所述追加請(qǐng)求,當(dāng)存在上傳文件的 線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。3. 如權(quán)利要求1或2所述的分布式文件系統(tǒng)小文件合并的并行追加方法,其特征在于, 所述步驟1包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_list;從所述 Memcache下載所述表key_list;將所述key從尾部追加到所述表key_list里;將修改后的所 述表key_list上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程數(shù)count減1。4. 如權(quán)利要求1所述的分布式文件系統(tǒng)小文件合并的并行追加方法,其特征在于,所述 步驟2包括從所述16111〇3〇116下載所述表1^7_1181:,重命名為表1^7_1181:_1〇〇31;判斷1^7_ list是否為空,若所述表key_list為空,則用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì)下一批小文件進(jìn) 行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。5. 如權(quán)利要求1或4所述的分布式文件系統(tǒng)小文件合并的并行追加方法,其特征在于, 所述步驟2包括:打開(kāi)所述表key_l ist_local,讀取所述小文件的名稱與所述目標(biāo)文件;將 所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及以上的小文 件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。6. -種分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),其特征在于,包括: 上傳模塊,用于客戶端上傳的小文件到目標(biāo)文件中,將所述小文件的名稱作為key,將 所述小文件的內(nèi)容作為value,上傳到Memcache中,將所述key寫(xiě)到表key_l is t上,所述表 key_list存儲(chǔ)在所述Memcache中,所述表key_list記錄所述Memcache中存儲(chǔ)的所有小文件 的 key; 合并模塊,用于從所述Memcache中下載所述表key_l i st,根據(jù)所述表key_l i st中所述 小文件的名稱與所述目標(biāo)文件,構(gòu)建Hash表,其中每個(gè)Hash值對(duì)應(yīng)一個(gè)線性表,所述線性表 中儲(chǔ)存所述小文件,如果所述目標(biāo)文件相同,則將與所述目標(biāo)文件相對(duì)應(yīng)的所述小文件合 并。7. 如權(quán)利要求6所述的分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),其特征在于,所述 上傳模塊還包括當(dāng)所述客戶端上傳所述小文件后后,發(fā)出一個(gè)追加請(qǐng)求,將所述追加請(qǐng)求 放入請(qǐng)求隊(duì)列request_queue中; 從所述請(qǐng)求隊(duì)列request_queue中取出所述追加請(qǐng)求,倉(cāng)ij建一個(gè)線程處理所述追加請(qǐng) 求,分別執(zhí)行以下步驟:判斷所述請(qǐng)求隊(duì)列request_queue中是否是空的,若為空,貝lj重新進(jìn) 行判斷,否則判斷當(dāng)前處理的所述追加請(qǐng)求的線程數(shù)count是否小于最大并發(fā)處理數(shù)9,:若 所述線程數(shù)ccnmt〈 =所述最大并發(fā)處理數(shù)未超過(guò)最大并發(fā)數(shù),則將所述線程數(shù)count加 1,若所述線程數(shù)count〉所述最大并發(fā)處理數(shù)則不取出所述追加請(qǐng)求,當(dāng)存在上傳文件的 線程結(jié)束后再取出所述追加請(qǐng)求,并對(duì)所述追加請(qǐng)求進(jìn)行處理。8. 如權(quán)利要求6或7所述的分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),其特征在于, 所述上傳模塊包括對(duì)當(dāng)前線程加鎖,使當(dāng)前只有一個(gè)線程在修改所述表key_li st;從所述 Memcache下載所述表key_list;將所述key從尾部追加到所述表key_list里;將修改后的所 述表key_list上傳到所述Memcache中;對(duì)所述當(dāng)前線程解鎖,并將所述線程數(shù)count減1。9. 如權(quán)利要求6所述的分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),其特征在于,所述 合并模塊包括從所述Memcache下載所述表key_list,重命名為表key_listjocal;判斷 key_list是否為空,若所述表key_list為空,則用變量T來(lái)記錄時(shí)間,t時(shí)間后對(duì)下一批小文 件進(jìn)行追加;否則創(chuàng)建空的表key_list,將其上傳到所述Memcache中。10. 如權(quán)利要求6或9所述的分布式文件系統(tǒng)小文件合并的并行追加系統(tǒng),其特征在于, 所述合并模塊包括:打開(kāi)所述表key_l ist_local,讀取所述小文件的名稱與所述目標(biāo)文件; 將所述目標(biāo)文件作為hash值,將所述小文件的名稱分別存入hash表中,當(dāng)兩個(gè)及以上的小 文件的目標(biāo)文件相同時(shí),則將所述兩個(gè)及以上的小文件加入到對(duì)應(yīng)的線性表后。
【文檔編號(hào)】G06F17/30GK105868286SQ201610169389
【公開(kāi)日】2016年8月17日
【申請(qǐng)日】2016年3月23日
【發(fā)明人】張笛, 孫毓忠, 宋 瑩
【申請(qǐng)人】中國(guó)科學(xué)院計(jì)算技術(shù)研究所