一種hdfs針對小文件的改進方法
【專利摘要】本發(fā)明涉及計算機HDFS分布式文件系統(tǒng)領(lǐng)域,公開了一種HDFS針對小文件的改進方法,將Namenode的部分權(quán)限下放Datanode節(jié)點上,讓Datanode緩存部分小文件元數(shù)據(jù)信息,讓Datanode處理絕大多數(shù)的小文件讀寫請求,最大限度的減輕Namenode的負擔。本發(fā)明針對HDFS處理小文件的效率低下問題,提出了一種新的處理方法,該方法有效解決了Namenode單點負載過重的問題,將小文件的壓力分配到數(shù)據(jù)節(jié)點Datanode上,從而達到了整個大數(shù)據(jù)處理集群對大文件和小文件處理效率性能相當?shù)睦硐胄Ч?br>
【專利說明】一種HDFS針對小文件的改進方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機HDFS分布式文件系統(tǒng)領(lǐng)域,具體涉及一種HDFS針對小文件的改進方法。
技術(shù)背景
[0002]Hadoop Distributed File System,簡稱 HDFS,是一個分布式文件系統(tǒng)。
[0003]隨著互聯(lián)網(wǎng)的快速發(fā)展,數(shù)據(jù)量呈現(xiàn)指數(shù)級增長,為了適應(yīng)這種情況,如今已經(jīng)出現(xiàn)了很多大的服務(wù)器架構(gòu)如數(shù)據(jù)中心以及云計算。在大數(shù)據(jù)處理方面,Google的GFS為處理大文件提供了有效的方法,而Hadoop下的文件系統(tǒng)HDFS作為GFS開源實現(xiàn),實現(xiàn)了 GFS的絕大多數(shù)功能,其也是基于大文件處理的,大文件的處理效率出色,然而在處理小文件效率上卻十分低下,因為在存儲小文件時需要反復(fù)的請求存儲地址,分配存儲的block (塊),大量的小文件使單Namenode (名字節(jié)點)的HDFS顯得力不從心,并且產(chǎn)生了大量的元數(shù)據(jù)占用Namenode的內(nèi)存。然而,在實際的應(yīng)用當中,小文件比比皆是,從個人應(yīng)用中產(chǎn)生的日常文件到web應(yīng)用中都會產(chǎn)生許多小文件,特別是近些年來blog、wik1、spaces的興起導(dǎo)致了互聯(lián)網(wǎng)提供內(nèi)容的方式發(fā)生改變,以用戶創(chuàng)造內(nèi)容為標志的web2.0的到來,標志著web己經(jīng)成為最大的信息系統(tǒng),其數(shù)據(jù)具有海量、多樣、動態(tài)變化等等特征,web2.0網(wǎng)站會產(chǎn)生海量的小文件,如用戶頭像、相冊微縮圖等文件,日志文件,介紹等等。這對能及時快速的處理這些海量的小文件提出了更高的需求挑戰(zhàn),業(yè)界的研究人員都紛紛把目光轉(zhuǎn)向這里。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決的技術(shù)問題是:本發(fā)明提供了一種HDFS針對小文件處理的改進方法,該方法要能夠有效解決HDFS在處理小文件時效率低下的問題。具體說來主要解決以下幾個問題:
1、單Namenode在處理讀寫請求時維護元數(shù)據(jù)問題;
2、元數(shù)據(jù)結(jié)構(gòu)問題;
3、元數(shù)據(jù)緩存策略問題;
4、元數(shù)據(jù)更新策略問題。
[0005]本發(fā)明所采用的技術(shù)方案為:一種HDFS針對小文件的改進方法,包括一個集群,集群包含一個Namenode (名字節(jié)點)和多個Datanode (數(shù)據(jù)節(jié)點),能被多個客戶端訪問,如圖1所示,其中,將Namenode的部分權(quán)限下放Datanode節(jié)點上,讓Datanode緩存部分小文件元數(shù)據(jù)信息,處理絕大多數(shù)的小文件讀寫請求。
[0006]除Namenode管理文件系統(tǒng)所有的元數(shù)據(jù)外,Datanode也保存部分的元數(shù)據(jù),主要是小文件的元數(shù)據(jù)信息,大文件元數(shù)據(jù)信息仍然保存在Namenode上。這些元數(shù)據(jù)包括名稱空間,訪問控制信息,文件到塊的映射信息,以及塊當前所在的位置,Datanode上所有的元數(shù)據(jù)保存在內(nèi)存之中,而Namenode由于小文件元數(shù)據(jù)巨大,絕大部分小文件的元數(shù)據(jù)保存在磁盤上。[0007]其中Namenode還管理系統(tǒng)范圍的活動,例如塊租用管理,孤兒塊的垃圾回收以及塊在數(shù)據(jù)服務(wù)器間的移動如復(fù)制,刪除等,并用心跳信息周期地跟每個Datanode通訊,給他們提供指令操作并收集他們的反饋狀態(tài)。
[0008]客戶端的操作不再是單一的向Namenode請求查找或分配相應(yīng)的元數(shù)據(jù),而是將部分小文件的元數(shù)據(jù)操作分配到Datanode上進行,如小文件的查找,如果沒有查找到相應(yīng)的結(jié)果再到Namenode上進行查找,寫文件時,client根據(jù)以往的讀寫記錄,直接查詢Datanode是否有未寫滿并且此時并沒有其他的client在寫的block文件塊,如果有,則直接將數(shù)據(jù)寫入這個數(shù)據(jù)塊,并更新相應(yīng)的元數(shù)據(jù)信息,如果沒有,則向Namenode發(fā)送寫數(shù)據(jù)請求,再由Namenode分配一個新的數(shù)據(jù)塊來完成數(shù)據(jù)寫入,client查詢數(shù)據(jù)塊是在本機上完成的;讀文件時,直接查詢Datanode,如果未能找到,再查找Namenode。
[0009]文件被分割成固定尺寸的塊,依然采用原HDFS默認的64M。在每個塊創(chuàng)建的時候,Namenode分配給它一個不變的全球唯一的64位的塊句柄號對它進行標識,其中第一位用來標識大小文件數(shù)據(jù)塊,Datanode把塊作為Iinux文件保存在本地硬盤上,并根據(jù)指定的塊句柄號和字節(jié)在數(shù)據(jù)塊內(nèi)的范圍來讀寫塊數(shù)據(jù)。為了保證可靠性,每個塊都會復(fù)制到多個塊服務(wù)器上。默認情況下,系統(tǒng)仍然保存三個備份。
[0010]塊尺寸大小是整個HDFS設(shè)計的關(guān)鍵之一,因為惰性空間分配有助于避免了造成內(nèi)部碎片帶來的空間浪費,而且為了和使整個HDFS大小文件塊的劃分統(tǒng)一,默認情況下仍然是64MB,可以通過配置文件進行修改。在此,我們可以定義小于IM的文件都是小文件。
[0011]采用大的數(shù)據(jù)塊在本專利中新的HDFS中處理小文件有幾大好處,首先就是減輕Namenode的負擔,因為整個塊的創(chuàng)建劃分依然是由Namenode來負責,在新建完一個塊后,后續(xù)的絕大多數(shù)的往塊中存儲文件是通過Datanode來進行管理。
[0012]在這里假設(shè)以一種理想的情況來模擬小文件存儲的請求被系統(tǒng)處理的方式。每一個管理的小文件大小都是1M,則一個64M的塊可以保存64個文件,64個文件的寫入理想情況下只有一個是由Namenode來控制的,而Datanode控制的和Namenode控制的文件之比為63:1,,從而有效的減輕了 Namenode的負擔。其次,大塊的設(shè)置在處理小文件時可以有效利用Cache來減少對磁盤的訪問次數(shù),提高速度存儲速度。最后,大塊的劃分可以減少由Namenode和Datanode管理的小文件元數(shù)據(jù)空間。
[0013]在設(shè)計中,所有的塊的創(chuàng)建也是通過Namenode來負責的,但是在創(chuàng)建寫入小文件塊時選擇塊放置的位置的策略相比以前更加復(fù)雜;
寫入小文件塊時,需要在Namenode保存的Datanode已創(chuàng)建的未滿塊列表里選擇創(chuàng)建數(shù)小于3塊的列表里選擇相應(yīng)的機器,并滿足HDFS選擇塊位置的兩個規(guī)則(硬盤使用率以及和客戶端之間的拓撲距離),三個塊也是按照原HDFS分布,兩個在同一機架,一個在另外一個機架。
[0014]當客戶端(Client)向Namenode請求創(chuàng)建數(shù)據(jù)塊卻沒有小于3個塊的Datanode時,Namenode根據(jù)他們之間的拓撲結(jié)構(gòu)直接選擇一個Datanode來對客戶端的請求進行處理,Datanode將Client的請求排隊往自己未寫滿的數(shù)據(jù)塊里直接寫入數(shù)據(jù)。當Datanode里所有的數(shù)據(jù)塊寫滿之后,仍然有Client寫請求,則排隊在最前面的Client向Namenode請求創(chuàng)建新塊。因為剛寫完,此時是不可能存在不滿足條件的Datanode的。
[0015]元數(shù)據(jù)是整個系統(tǒng)的控制信息,具有非常關(guān)鍵的作用,為了減輕Namenode的負擔,優(yōu)化HDFS的讀寫速度,在Namenode創(chuàng)建一個塊之后,將對此塊操作的控制權(quán)轉(zhuǎn)移到Datanode,并在一個數(shù)據(jù)塊中存儲多個小文件。
[0016]因此根據(jù)以上要求,需要修改小文件在系統(tǒng)中保存的元數(shù)據(jù)結(jié)構(gòu)。因為需要在一個塊中保存多個文件,所以需要修改小文件和數(shù)據(jù)塊之間的映射。
[0017]首先,文件到塊的映射在常規(guī)的映射基礎(chǔ)上加上了文件在數(shù)據(jù)塊中的起始偏移量和長度,如圖2所示,filename (文件名)為帶完整路徑的文件名字符串。其次,以前數(shù)據(jù)塊到文件的映射為單映射,變更為:數(shù)據(jù)塊到文件數(shù)組集合的映射,每個文件帶有是否依然有效的標識位,如圖3中所示,I為標示文件為有效,0為無效,Size為本數(shù)據(jù)塊已包含文件的總大小,為了讓client每查找到一個數(shù)據(jù)塊以后,能盡量的插入多個數(shù)據(jù)文件,減少反復(fù)查找block的次數(shù),本專利設(shè)置在查找block時當Size大于設(shè)置數(shù)據(jù)塊大小減去IM時認為數(shù)據(jù)己滿。
[0018]文件和塊的命名空間以及block對應(yīng)的Datanode的位置等數(shù)據(jù)結(jié)構(gòu)沒有改變,仍然沿用以前的結(jié)構(gòu)。
[0019]Namenode緩存的元數(shù)據(jù),緩存所有文件和塊的命名空間,文件到塊的映射,以及每個塊副本的位置,其中大文件的這些元數(shù)據(jù)是保存在內(nèi)存中,而小文件只是保存其中最熱的一部分和未滿的塊的元數(shù)據(jù),所以Namenode還需要維護一個關(guān)于小文件的列表用于決定在內(nèi)存中緩存哪些小文件的元數(shù)據(jù)。除此以外,Namenede還要維護上面所說的額外的Datanode新建未滿塊數(shù)量的列表,用于后期數(shù)據(jù)塊的創(chuàng)建。
[0020]其次是Datano de緩存的元數(shù)據(jù),也是此設(shè)計最為重要的部分,用來有效的減輕Namenode的負擔。在這里Datanode緩存的元數(shù)據(jù)都是關(guān)于小文件的。大文件的所有元數(shù)據(jù)依然只有Namenode進行緩存,每一個Datanode緩存的元數(shù)據(jù)的范圍只有在本機架里具有兩個備份的block。
[0021]除此以外,Client也需要緩存部分的文件信息,首先Client需要決定訪問的Datanode,就需要緩存Datanode的信息,每一個Client維護一個固定數(shù)量的列表來保持訪問過的Datanode,每一次選擇當中訪問次數(shù)最多的Datanode進行訪問,列表的替換使用的是LRU算法。
[0022]元數(shù)據(jù)(MetaData)更新策略如下:
首先是更新Namenode上的元數(shù)據(jù)信息,在原HDFS中,客戶端寫數(shù)據(jù)時首先向Namenode請求分配數(shù)據(jù)塊,Namenode在建立文件和塊的命名空間之后,將塊的名稱和對應(yīng)的Datanode的位置發(fā)送給客戶端,客戶端直接連接Datanode進行文件的寫,在寫文件完成以后,通知Namenode更新。
[0023]在本發(fā)明中,當系統(tǒng)在寫小文件時,并不采取這種策略更新元數(shù)據(jù)信息,在每次小文件的完成寫之后,并不及時通知Namenode更新元數(shù)據(jù)信息,而是在數(shù)據(jù)塊寫滿或者對數(shù)據(jù)塊產(chǎn)生讀請求并且此時并沒有其它客戶端在寫此塊或者對此塊沒有讀寫請求超過I分鐘時,Datanode才通知Namenode更新關(guān)于此塊的元數(shù)據(jù)信息,包括新建的文件命名空間以及塊中包含的文件等。同時將相應(yīng)的信息添加到Datanede未寫滿列表中。這種策略可以明顯的加快整個系統(tǒng)寫入文件的速度。
[0024]其次是更新Datanode上的元數(shù)據(jù)信息,Namenode在自己啟動以及Datanode加入集群的時候,詢問Datanode它所包含的塊的信息,分析其中的小文件數(shù)據(jù)塊,分析以及每一個含有此數(shù)據(jù)塊兩個備份的機架,將此塊到文件,文件到此塊以及此塊對應(yīng)Datanode的元數(shù)據(jù)發(fā)送到該機架的每一個Datanode上。在Datanode正常運行之后,元數(shù)據(jù)在數(shù)據(jù)塊進行修改之后會更新,對塊的每一次修改會修改塊的標識符進行統(tǒng)一,因此客戶端直接對Datanode進行訪問時通過直接對比包含此數(shù)據(jù)塊的所有備份之間的標識符來確定的是否是有效塊,當出現(xiàn)不一致的情況下,每個Datanode通過和Namenode之間規(guī)律的心跳信息,向Namenode請求最新的自己緩存的與此數(shù)據(jù)塊相關(guān)的元數(shù)據(jù)信息,Datanode在通知Namenode更新小文件的數(shù)據(jù)塊的信息之后,Namenode在新創(chuàng)建小文件塊,Datanode失效以及復(fù)制數(shù)據(jù)塊后也會通知相應(yīng)的機架更新元數(shù)據(jù)。
[0025]小文件I/O:當Client需要寫文件時,首先從自己緩存的Datanode列表里選擇訪問最多的Datanode進行直接訪問,如果沒有,則向Namenode請求創(chuàng)建新的數(shù)據(jù)塊,如果此時不能創(chuàng)建,則Namenode根據(jù)拓撲路徑為其分配一個Datanode ;Client連接Datanode發(fā)送寫請求,Datanode為其分配可寫入的數(shù)據(jù)塊然后通知客戶端包含此塊租約的主塊地址,客戶端會對每一次訪問的Datanode在緩存里進行記錄;
Client讀取文件時,也是首先在自己緩存的Datanode列表里選擇讀寫次數(shù)最多的Datanode進行直接連接,如果沒有則在Namenode上進行查找,如果有,在相應(yīng)的Datanode緩存的元數(shù)據(jù)里查找相應(yīng)的文件,如果查找到相應(yīng)的block,這Datanode直接返回Client文件所對應(yīng)的數(shù)據(jù)塊和文件在塊中的偏移量和長度以及保存塊的Datanode,如果沒有找至Ij,則Client再查找Namenode, Namenode再返回Client所要讀取文件存儲的Datanode以及blockid以及文件在塊的偏移量和長度,Client在得到相應(yīng)的block后,連接相應(yīng)的Datanode在塊中進行直接讀;當Client直接連接Datanode查找到相應(yīng)的塊進行文件的讀取時,需要驗證所要讀取的數(shù)據(jù)是否是有效數(shù)據(jù),采用兩步驗證的策略:首先查找讀取這個塊的所有三個備份查看塊的標識符是否相同,如果相同則直接進行讀取,如果不同,向Namenode請求更新元數(shù)據(jù)信息,然后再進行查找讀取,其次在讀取數(shù)據(jù)的過程中通過校驗碼驗證所讀的數(shù)據(jù)內(nèi)容是否有效取。
[0026]本發(fā)明的有益效果為:
本發(fā)明針對HDFS處理小文件的效率低下問題,提出了一種新的處理方法,該方法有效解決了 Namenode單點負載過重的問題,將小文件的壓力分配到數(shù)據(jù)節(jié)點Datanode上,從而達到了整個大數(shù)據(jù)處理集群對大文件和小文件處理效率性能相當?shù)睦硐胄Ч?br>
【專利附圖】
【附圖說明】
[0027]圖1為HDFS新的架構(gòu)示意圖;
圖2為文件到Block的映射不意圖;
圖3為Block到小文件組的映射示意圖;
圖4為寫文件流程圖;
圖5為讀文件流程圖。
【具體實施方式】
[0028]下面參照附圖,結(jié)合實施例對本發(fā)明詳細說明。
[0029]實施例1: 如圖1所示,一種HDFS針對小文件的改進方法,包括一個集群,其中集群中包含一個Namenode和多個Datanode,能被多個客戶端訪問,其中將Namenode的部分權(quán)限下放Datanode節(jié)點上,讓Datanode緩存部分小文件元數(shù)據(jù)信息,處理絕大多數(shù)的小文件讀寫請求。
[0030]實施例2:
在實施例1的基礎(chǔ)上,本實施例除Namenode管理文件系統(tǒng)所有的元數(shù)據(jù)外,Datanode也保存部分的元數(shù)據(jù),主要是小文件的元數(shù)據(jù)信息,大文件元數(shù)據(jù)信息仍然保存在Namenode上,其中Namenode負責管理系統(tǒng)范圍的活動,并用心跳信息周期地跟每個Datanode通訊,給他們提供指令操作并收集他們的反饋狀態(tài)。
[0031]實施例3:
在實施例1的基礎(chǔ)上,本實施例客戶端的操作將部分小文件的元數(shù)據(jù)操作分配到Datanode上進行,如果沒有查找到相應(yīng)的結(jié)果再到Namenode上進行查找,寫文件時,client根據(jù)以往的讀寫記錄,直接查詢Datanode是否有未寫滿并且此時并沒有其他的client在寫的block文件塊,如果有,則直接將數(shù)據(jù)寫入這個數(shù)據(jù)塊,并更新相應(yīng)的元數(shù)據(jù)信息,如果沒有,則向Namenode發(fā)送寫數(shù)據(jù)請求,再由Namenode分配一個新的數(shù)據(jù)塊來完成數(shù)據(jù)寫入,client查詢數(shù)據(jù)塊是在本機上完成的;讀文件時,直接查詢Datanode,如果未能找到,再查找Namenode。
[0032]實施例4:
在實施例1的基礎(chǔ)上,文件被分割成固定尺寸的塊,采用原HDFS默認的64M,在每個塊創(chuàng)建的時候,Namenode分配給它一個不變的全球唯一的64位的塊句柄號對它進行標識,其中第一位用來標識大小文件數(shù)據(jù)塊,Datanode把塊作為Iinux文件保存在本地硬盤上,并根據(jù)指定的塊句柄號和字節(jié)在數(shù)據(jù)塊內(nèi)的范圍來讀寫塊數(shù)據(jù)。
[0033]實施例5:
在實施例4的基礎(chǔ)上,本實施整個塊的創(chuàng)建劃分由Namenode來負責,在新建完一個塊后,后續(xù)的絕大多數(shù)的往塊中存儲文件是通過Datanode來進行管理,寫入小文件塊時在Namenode保存的Datanode已創(chuàng)建的未滿塊列表里選擇創(chuàng)建數(shù)小于3塊的列表里選擇相應(yīng)的機器,并滿足HDFS選擇塊位置的兩個規(guī)則一硬盤使用率以及和客戶端之間的拓撲距離;當客戶端(Client)向Namenode請求創(chuàng)建數(shù)據(jù)塊卻沒有小于3個塊的Datanode時,Namenode根據(jù)他們之間的拓撲結(jié)構(gòu)直接選擇一個Datanode來對客戶端的請求進行處理,Datanode將Client的請求排隊往自己未寫滿的數(shù)據(jù)塊里直接寫入數(shù)據(jù)。當Datanode里所有的數(shù)據(jù)塊寫滿之后,仍然有Client寫請求,則排隊在最前面的Client向Namenode請求創(chuàng)建新塊。
[0034]實施例6:
在實施例4或5的基礎(chǔ)上,本實施例在Namenode創(chuàng)建一個塊之后,將對此塊操作的控制權(quán)轉(zhuǎn)移到Datanode,并在一個數(shù)據(jù)塊中存儲多個小文件。
[0035]實施例7:
在實施例6的基礎(chǔ)上,本實施例文件到塊的映射在常規(guī)的映射基礎(chǔ)上加上了文件在數(shù)據(jù)塊中的起始偏移量和長度,filename為帶完整路徑的文件名字符串,數(shù)據(jù)塊到文件的映射塊到文件數(shù)組集合的映射,每個文件帶有是否依然有效的標識位。[0036]實施例8:
在實施例1的基礎(chǔ)上,本實施例Namenode緩存的元數(shù)據(jù),緩存所有文件和塊的命名空間,文件到塊的映射,以及每個塊副本的位置,其中大文件的這些元數(shù)據(jù)是保存在內(nèi)存中,而小文件只保存其中最熱的一部分和未滿的塊的元數(shù)據(jù),Namenode還需要維護一個關(guān)于小文件的列表用于決定在內(nèi)存中緩存哪些小文件的元數(shù)據(jù),Namenode還要維護上面所說的額外的Datanode新建未滿塊數(shù)量的列表,用于后期數(shù)據(jù)塊的創(chuàng)建;
Datanode緩存的元數(shù)據(jù)都是關(guān)于小文件的,大文件的所有元數(shù)據(jù)依然只有Namenode進行緩存,每一個Datanode緩存的元數(shù)據(jù)的范圍只有在本機架里具有兩個備份的block ;Client也需要緩存部分的文件信息,需要緩存Datanode的信息,每一個Client維護一個固定數(shù)量的列表來保持訪問過的Datanode,每一次選擇當中訪問次數(shù)最多的Datanode進行訪問,列表的替換使用的是LRU算法。
[0037]實施例9:
在實施例1的基礎(chǔ)上,本實施例所述元數(shù)據(jù)的更新策略如下:
首先是更新Namenode上的元數(shù)據(jù)信息,當系統(tǒng)在寫小文件時,在每次小文件的完成
寫之后,在數(shù)據(jù)塊寫滿或者對數(shù)據(jù)塊產(chǎn)生讀請求并且此時并沒有其它客戶端在寫此塊或者對此塊沒有讀寫請求超過I分鐘時,Datanode通知Namenode更新關(guān)于此塊的元數(shù)據(jù)信息,包括新建的文件命名空間以及塊中包含的文件等,同時將相應(yīng)的信息添加到Datanede未與滿列表中;:望,其次是更新Datanode上的元數(shù)據(jù)信息,Namenode在自己啟動以及Datanode加入集
群的時候,詢問Datanode它所包含的塊的信息,分析其中的小文件數(shù)據(jù)塊,分析每一個含有此數(shù)據(jù)塊兩個備份的機架,將此塊到文件,文件到此塊以及此塊對應(yīng)Datanode的元數(shù)據(jù)發(fā)送到該機架的每一個Datanode上;在0&丨&110如正常運行之后,元數(shù)據(jù)在數(shù)據(jù)塊進行修改之后會更新,對塊的每一次修改會修改塊的標識符進行統(tǒng)一,因此客戶端直接對Datanode進行訪問時通過直接對比包含此數(shù)據(jù)塊的所有備份之間的標識符來確定的是否是有效塊,當出現(xiàn)不一致的情況下,每個Datanode通過和Namenode之間規(guī)律的心跳信息,向Namenode請求最新的自己緩存的與此數(shù)據(jù)塊相關(guān)的元數(shù)據(jù)信息,Datanode在通知Namenode更新小文件的數(shù)據(jù)塊的信息之后,Namenode在新創(chuàng)建小文件塊,Datanode失效以及復(fù)制數(shù)據(jù)塊后也會通知相應(yīng)的機架更新元數(shù)據(jù)。
[0038]實施例10:
在實施例1的基礎(chǔ)上,本實施例當Client需要寫文件時,首先從自己緩存的Datanode列表里選擇訪問最多的Datanode進行直接訪問,如果沒有,則向Namenode請求創(chuàng)建新的數(shù)據(jù)塊,如果此時不能創(chuàng)建,則Namenode根據(jù)拓撲路徑為其分配一個Datanode ;Client連接Datanode發(fā)送寫請求,Datanode為其分配可寫入的數(shù)據(jù)塊然后通知客戶端包含此塊租約的主塊地址,客戶端會對每一次訪問的Datanode在緩存里進行記錄;
Client讀取文件時,也是首先在自己緩存的Datanode列表里選擇讀寫次數(shù)最多的Datanode進行直接連接,如果沒有則在Namenode上進行查找,如果有,在相應(yīng)的Datanode緩存的元數(shù)據(jù)里查找相應(yīng)的文件,如果查找到相應(yīng)的block,這Datanode直接返回Client文件所對應(yīng)的數(shù)據(jù)塊和文件在塊中的偏移量和長度以及保存塊的Datanode,如果沒有找至Ij,則Client再查找Namenode, Namenode再返回Client所要讀取文件存儲的Datanode以及blockid以及文件在塊的偏移量和長度,Client在得到相應(yīng)的block后,連接相應(yīng)的Datanode在塊中進行直接讀;當Client直接連接Datanode查找到相應(yīng)的塊進行文件的讀取時,需要驗證所要讀取的數(shù)據(jù)是否是有效數(shù)據(jù),采用兩步驗證的策略:首先查找讀取這個塊的所有三個備份查看塊的標識符是否相同,如果相同則直接進行讀取,如果不同,向Namenode請求更新元數(shù)據(jù)信息,然后再進行查找讀取,其次在讀取數(shù)據(jù)的過程中通過校驗碼驗證所讀的數(shù)據(jù)內(nèi)容是否有效取。
【權(quán)利要求】
1.一種HDFS針對小文件的改進方法,包括一個集群,其中集群中包含一個Namenode和多個Datanode,能被多個客戶端訪問,其特征在于:將Namenode的部分權(quán)限下放Datanode節(jié)點上,讓Datanode緩存部分小文件元數(shù)據(jù)信息,處理絕大多數(shù)的小文件讀寫請求。
2.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于:除Namenode管理文件系統(tǒng)所有的元數(shù)據(jù)外,Datanode也保存部分的元數(shù)據(jù),主要是小文件的元數(shù)據(jù)信息,大文件元數(shù)據(jù)信息仍然保存在Namenode上,其中Namenode負責管理系統(tǒng)范圍的活動,并用心跳信息周期地跟每個Datanode通訊,給他們提供指令操作并收集他們的反饋狀態(tài)。
3.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于:客戶端的操作將部分小文件的元數(shù)據(jù)操作分配到Datanode上進行,如果沒有查找到相應(yīng)的結(jié)果再到Namenode上進行查找,寫文件時,client根據(jù)以往的讀寫記錄,直接查詢Datanode是否有未寫滿并且此時并沒有其他的client在寫的block文件塊,如果有,則直接將數(shù)據(jù)寫入這個數(shù)據(jù)塊,并更新相應(yīng)的元數(shù)據(jù)信息,如果沒有,則向Namenode發(fā)送寫數(shù)據(jù)請求,再由Namenode分配一個新的數(shù)據(jù)塊來完成數(shù)據(jù)寫入,client查詢數(shù)據(jù)塊是在本機上完成的;讀文件時,直接查詢Datanode,如果未能找到,再查找Namenode。
4.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于:文件被分割成固定尺寸的塊,采用原HDFS默認的64M,在每個塊創(chuàng)建的時候,Namenode分配給它一個不變的全球唯一的64位的塊句柄號對它進行標識,其中第一位用來標識大小文件數(shù)據(jù)塊,Datanode把塊作為Iinux文件保存在本地硬盤上,并根據(jù)指定的塊句柄號和字節(jié)在數(shù)據(jù)塊內(nèi)的范圍來讀寫塊數(shù)據(jù)。
5.根據(jù)權(quán)利要求4所述的一種HDFS針對小文件的改進方法,其特征在于:整個塊的創(chuàng)建劃分由N amenode來負責,在新建完一個塊后,后續(xù)的絕大多數(shù)的往塊中存儲文件是通過Datanode來進行管理,寫入小文件塊時在Namenode保存的Datanode已創(chuàng)建的未滿塊列表里選擇創(chuàng)建數(shù)小于3塊的列表里選擇相應(yīng)的機器,并滿足HDFS選擇塊位置的兩個規(guī)則一硬盤使用率以及和客戶端之間的拓撲距離;當客戶端(Client)向Namenode請求創(chuàng)建數(shù)據(jù)塊卻沒有小于3個塊的Datanode時,Namenode根據(jù)他們之間的拓撲結(jié)構(gòu)直接選擇一個Datanode來對客戶端的請求進行處理,Datanode將Client的請求排隊往自己未寫滿的數(shù)據(jù)塊里直接寫入數(shù)據(jù); 當Datanode里所有的數(shù)據(jù)塊寫滿之后,仍然有Client寫請求,則排隊在最前面的Client向Namenode請求創(chuàng)建新塊。
6.根據(jù)權(quán)利要求4或5所述的一種HDFS針對小文件的改進方法,其特征在于:在Namenode創(chuàng)建一個塊之后,將對此塊操作的控制權(quán)轉(zhuǎn)移到Datanode,并在一個數(shù)據(jù)塊中存儲多個小文件。
7.根據(jù)權(quán)利要求6所述的一種HDFS針對小文件的改進方法,其特征在于:文件到塊的映射在常規(guī)的映射基礎(chǔ)上加上了文件在數(shù)據(jù)塊中的起始偏移量和長度,filename為帶完整路徑的文件名字符串,數(shù)據(jù)塊到文件的映射塊到文件數(shù)組集合的映射,每個文件帶有是否依然有效的標識位。
8.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于:Namenode緩存的元數(shù)據(jù),緩存所有文件和塊的命名空間,文件到塊的映射,以及每個塊副本的位置,其中大文件的這些元數(shù)據(jù)是保存在內(nèi)存中,而小文件只保存其中最熱的一部分和未滿的塊的元數(shù)據(jù),Namenode還需要維護一個關(guān)于小文件的列表用于決定在內(nèi)存中緩存哪些小文件的元數(shù)據(jù),Namenode還要維護上面所說的額外的Datanode新建未滿塊數(shù)量的列表,用于后期數(shù)據(jù)塊的創(chuàng)建; Datanode緩存的元數(shù)據(jù)都是關(guān)于小文件的,大文件的所有元數(shù)據(jù)依然只有Namenode進行緩存,每一個Datanode緩存的元數(shù)據(jù)的范圍只有在本機架里具有兩個備份的block ; Client也需要緩存部分的文件信息,需要緩存Datanode的信息,每一個Client維護一個固定數(shù)量的列表來保持訪問過的Datanode,每一次選擇當中訪問次數(shù)最多的Datanode進行訪問,列表的替換使用的是LRU算法。
9.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于:所述元數(shù)據(jù)的更新策略如下: X首先是更新Namenode上的元數(shù)據(jù)信息,當系統(tǒng)在寫小文件時,在每次小文件的完成寫之后,在數(shù)據(jù)塊寫滿或者對數(shù)據(jù)塊產(chǎn)生讀請求并且此時并沒有其它客戶端在寫此塊或者對此塊沒 有讀寫請求超過I分鐘時,Datanode通知Namenode更新關(guān)于此塊的元數(shù)據(jù)信息,包括新建的文件命名空間以及塊中包含的文件等,同時將相應(yīng)的信息添加到Datanede未與滿列表中; 2'其次是更新Datanode上的元數(shù)據(jù)信息,Namenode在自己啟動以及Datanode加入集群的時候,詢問Datanode它所包含的塊的信息,分析其中的小文件數(shù)據(jù)塊,分析每一個含有此數(shù)據(jù)塊兩個備份的機架,將此塊到文件,文件到此塊以及此塊對應(yīng)Datanode的元數(shù)據(jù)發(fā)送到該機架的每一個Datanode上;在0&丨&110如正常運行之后,元數(shù)據(jù)在數(shù)據(jù)塊進行修改之后會更新,對塊的每一次修改會修改塊的標識符進行統(tǒng)一,因此客戶端直接對Datanode進行訪問時通過直接對比包含此數(shù)據(jù)塊的所有備份之間的標識符來確定的是否是有效塊,當出現(xiàn)不一致的情況下,每個Datanode通過和Namenode之間規(guī)律的心跳信息,向Namenode請求最新的自己緩存的與此數(shù)據(jù)塊相關(guān)的元數(shù)據(jù)信息,Datanode在通知Namenode更新小文件的數(shù)據(jù)塊的信息之后,Namenode在新創(chuàng)建小文件塊,Datanode失效以及復(fù)制數(shù)據(jù)塊后也會通知相應(yīng)的機架更新元數(shù)據(jù)。
10.根據(jù)權(quán)利要求1所述的一種HDFS針對小文件的改進方法,其特征在于: 當Client需要寫文件時,首先從自己緩存的Datanode列表里選擇訪問最多的Datanode進行直接訪問,如果沒有,則向Namenode請求創(chuàng)建新的數(shù)據(jù)塊,如果此時不能創(chuàng)建,則Namenode根據(jù)拓撲路徑為其分配一個Datanode ;Client連接Datanode發(fā)送寫請求,Datanode為其分配可寫入的數(shù)據(jù)塊然后通知客戶端包含此塊租約的主塊地址,客戶端會對每一次訪問的Datanode在緩存里進行記錄; Client讀取文件時,也是首先在自己緩存的Datanode列表里選擇讀寫次數(shù)最多的Datanode進行直接連接,如果沒有則在Namenode上進行查找,如果有,在相應(yīng)的Datanode緩存的元數(shù)據(jù)里查找相應(yīng)的文件,如果查找到相應(yīng)的block,這Datanode直接返回Client文件所對應(yīng)的數(shù)據(jù)塊和文件在塊中的偏移量和長度以及保存塊的Datanode,如果沒有找至Ij,則Client再查找Namenode, Namenode再返回Client所要讀取文件存儲的Datanode以及blockid以及文件在塊的偏移量和長度,Client在得到相應(yīng)的block后,連接相應(yīng)的Datanode在塊中進行直接讀;當Client直接連接Datanode查找到相應(yīng)的塊進行文件的讀取時,需要驗證所要讀取的數(shù)據(jù)是否是有效數(shù)據(jù),采用兩步驗證的策略:首先查找讀取這個塊的所有三個備份查看塊的標識符是否相同,如果相同則直接進行讀取,如果不同,向Namenode請求更新元數(shù)據(jù)信息, 然后再進行查找讀取,其次在讀取數(shù)據(jù)的過程中通過校驗碼驗證所讀的數(shù)據(jù)內(nèi)容是否有效取。
【文檔編號】G06F17/30GK103530387SQ201310494888
【公開日】2014年1月22日 申請日期:2013年10月22日 優(yōu)先權(quán)日:2013年10月22日
【發(fā)明者】孟祥飛, 鄧鵬飛, 吳楠, 宗棟瑞, 鄧強 申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司