復(fù)為可用時(shí),DataNode可以將該存儲資源從不可用資源列表中刪除,并加入到可用資源列表中。
[0036]可見,在本發(fā)明實(shí)施例中,對于不可用的存儲資源,當(dāng)其可用狀態(tài)重新恢復(fù)為可用時(shí),DataNode可以重新將該存儲資源加入到可用資源狀態(tài)列表中,以在后續(xù)流程中用于數(shù)據(jù)寫入,與現(xiàn)有技術(shù)中存儲資源故障后,即使存儲資源恢復(fù)正常,DataNode仍不會使用該存儲資源的實(shí)現(xiàn)方式相比,減少了存儲資源浪費(fèi),提高了存儲資源利用率。
[0037]作為一種可選的實(shí)施方式,在上述步驟13)中,當(dāng)不可用資源列表中存在可用狀態(tài)為可用的存儲資源時(shí),上述DataNode將該存儲資源從不可用資源列表中刪除,并加入到可用資源列表中之前,還可以包括以下步驟:
[0038]步驟131)、DataNode判斷該存儲資源的可用容量是否小于預(yù)設(shè)容量閾值;
[0039]步驟132)、若否,確定執(zhí)行將該存儲資源從不可用資源列表中刪除,并加入到可用資源列表中的步驟。
[0040]在該實(shí)施方式中,考慮到當(dāng)存儲資源的可用容量過低時(shí),該存儲資源將無法保證數(shù)據(jù)完整寫入。例如,以數(shù)據(jù)塊大小為64M為例,則當(dāng)存儲資源的可用容量低于64M時(shí),該存儲資源將無法寫入一個(gè)完整的數(shù)據(jù)塊,從而可能導(dǎo)致數(shù)據(jù)寫入錯(cuò)誤。因而,為了保證數(shù)據(jù)寫入的完整性,對于不可用資源列表中的存儲資源,當(dāng)DataNode確定某存儲資源可用時(shí),在將該存儲資源加入到可用資源列表中之前,還可以進(jìn)一步判斷該存儲資源的可用容量是否小于預(yù)設(shè)容量閾值(可以根據(jù)具體場景預(yù)先設(shè)定,如70M、80M等);若是,則DataNode可以將該存儲資源作為不可用存儲資源,仍將其保留在不可用資源列表中;若否,則DataNode可以將該存儲資源作為可用存儲資源,將其從不可用資源列表中刪除,并加入到可用資源列表中。
[0041]作為一種可選的實(shí)施方式,在本發(fā)明實(shí)施例中,上述步驟11)之后,還可以包括:
[0042]當(dāng)可用資源列表中存在可用狀態(tài)為可用,且可用容量小于預(yù)設(shè)容量閾值的存儲資源時(shí),DataNode將該存儲資源從可用資源列表中刪除,并加入到不可用資源列表中。
[0043]在該實(shí)施方式中,對于可用資源列表中的存儲資源,當(dāng)DataNode確定某存儲資源可用時(shí),DataNode可以進(jìn)一步判斷該存儲資源的可用容量是否小于預(yù)設(shè)容量閾值;若是,則DataNode可以將該存儲資源作為不可用存儲資源,將其從可用資源列表中刪除,并加入到不可用資源列表中;若否,則DataNode可以將該存儲資源作為可用存儲資源,仍將其保留在可用資源列表中。
[0044]步驟202、當(dāng)DataNode接收到客戶端發(fā)送的數(shù)據(jù)寫入請求時(shí),從可用存儲資源列表中選擇用于數(shù)據(jù)寫入的目標(biāo)存儲資源,并對目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入。
[0045]本發(fā)明實(shí)施例中,當(dāng)DataNode接收到客戶端發(fā)送的數(shù)據(jù)寫入請求時(shí),DataNode可以從自身維護(hù)的可用存儲資源列表中選擇用于數(shù)據(jù)寫入的目標(biāo)存儲資源,并對該目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入,從而,可以避免DataNode選中不可用的存儲資源進(jìn)行數(shù)據(jù)寫入,提高了數(shù)據(jù)寫入成功率和效率。
[0046]本發(fā)明實(shí)施例中,DataNode從可用資源列表中選擇用于數(shù)據(jù)寫入的目標(biāo)存儲資源時(shí),可以根據(jù)可用資源列表中包括的各存儲資源的可用容量從大到小的順序,選擇可用容量最大的存儲資源;也可以通過其它選擇策略進(jìn)行選擇,如從可用資源列表中包括的各存儲資源中隨機(jī)選擇等,本發(fā)明實(shí)施例對此不做限定。
[0047]值得說明的是,在本發(fā)明實(shí)施例中,目標(biāo)存儲資源并不特指某一固定的存儲資源,而是可以指代DataNode選中的用于進(jìn)行數(shù)據(jù)寫入的任一存儲資源。
[0048]可見,在圖2所示的方法流程中,DataNode節(jié)點(diǎn)通過獲取本地存儲資源的可用狀態(tài),并根據(jù)本地存儲資源的可用狀態(tài)維護(hù)可用資源列表和不可用資源列表,當(dāng)DataNode接收到客戶端發(fā)送的數(shù)據(jù)寫入請求時(shí),從可用存儲資源列表中選擇用于數(shù)據(jù)寫入的目標(biāo)存儲資源,并對目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入,一方面,避免了 DataNode選中不可用的存儲資源進(jìn)行數(shù)據(jù)寫入,提高了數(shù)據(jù)寫入的成功率和效率;另一方面,通過將可用狀態(tài)從不可用變?yōu)榭捎玫谋镜卮鎯Y源加入到可用資源列表中,與現(xiàn)有技術(shù)中存儲資源故障后不再使用的實(shí)現(xiàn)方式相比,減少了存儲資源的浪費(fèi),提高了存儲資源的利用率。
[0049]基于圖1所示的網(wǎng)絡(luò)架構(gòu),本發(fā)明實(shí)施例還提供了另一種數(shù)據(jù)寫入方法。請參見圖3,為本發(fā)明實(shí)施例提供的另一種數(shù)據(jù)寫入方法的流程示意圖,如圖3所示,該數(shù)據(jù)寫入方法可以包括:
[0050]步驟301、DataNode獲取本地存儲資源的可用狀態(tài),并根據(jù)本地存儲資源的可用狀態(tài)維護(hù)可用資源列表和不可用資源列表當(dāng)本地存儲資源的可用狀態(tài)由不可用變?yōu)榭捎脮r(shí),將其加入到所述可用資源列表中。
[0051]步驟302、當(dāng)DataNode接收到客戶端發(fā)送的數(shù)據(jù)寫入請求時(shí),從可用存儲資源列表中選擇用于數(shù)據(jù)寫入的目標(biāo)存儲資源,并對目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入。
[0052]本發(fā)明實(shí)施例中,步驟301?步驟302的具體實(shí)現(xiàn)可以參見上述步驟201?步驟202,本發(fā)明實(shí)施例在此不再贅述。
[0053]步驟303、若發(fā)生寫入失敗,DataNode將目標(biāo)存儲資源從可用資源列表中刪除,加入到不可用資源列表,并向客戶端返回寫入失敗響應(yīng),以使客戶端向NameNode發(fā)送寫入失敗請求,由NameNode重新為客戶端分配數(shù)據(jù)寫入的DataNode。
[0054]步驟304、當(dāng)刪除目標(biāo)存儲資源后的可用資源列表不為空時(shí),DataNode向NameNode發(fā)送節(jié)點(diǎn)狀態(tài)正常上報(bào)消息,以使NameNode接收到客戶端發(fā)送的寫入失敗請求時(shí),確定該DataNode節(jié)點(diǎn)可用。
[0055]本發(fā)明實(shí)施例中,DataNode確定用于寫入數(shù)據(jù)的目標(biāo)存儲資源之后,可以對該目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入。若DataNode對目標(biāo)存儲資源進(jìn)行數(shù)據(jù)寫入時(shí)發(fā)生寫入失敗,如目標(biāo)存儲資源在數(shù)據(jù)寫入過程中發(fā)生故障,DataNode可以向客戶端返回寫入失敗響應(yīng),以使客戶端向NameNode發(fā)送寫入失敗請求,由NameNode重新為客戶端分配數(shù)據(jù)寫入的DataNode,進(jìn)而,客戶端可以將數(shù)據(jù)重新寫入到新分配的DataNode中。
[0056]與此同時(shí),DataNode還可以啟動一個(gè)新的線程,用于監(jiān)控?cái)?shù)據(jù)讀寫進(jìn)程發(fā)送過來的資源故障狀態(tài),從而,當(dāng)DataNode對目標(biāo)存儲資源寫入失敗時(shí),可以將該目標(biāo)存儲資源從可用資源列表中刪除,并加入到不可用資源列表中。DataNode將目標(biāo)存儲資源從可用資源列表中刪除之后,還可以進(jìn)一步判斷可用資源列表是否為空,若不為空,DataNode可以向NameNode發(fā)送節(jié)點(diǎn)正常上報(bào)消息,以使NameNode接收到客戶端發(fā)送的寫入失敗請求時(shí),確定該DataNode可用,而不會將該DataNode標(biāo)記為不可用,進(jìn)而,NameNode會繼續(xù)向該DataNode下發(fā)寫業(yè)務(wù)。
[0057]需要注意的是,在本發(fā)明實(shí)施例中,當(dāng)NameNode接收到客戶端發(fā)送的寫入失敗請求,且接收到DataNode發(fā)送的節(jié)點(diǎn)狀態(tài)正常上報(bào)消息時(shí),NameNode為客戶端重新分配的DataNode可以為該之前為該客戶端分配的DataNode,也可以是其它可用的DataNode,本發(fā)明實(shí)施例對此不做限定。
[0058]本發(fā)明實(shí)施例中,若DataNode從可用資源列表中刪除目標(biāo)存儲資源后,可用資源列表為空,即DataNode中不存在可用存儲資源,此時(shí),DataNode可以退出HDFS集群,停止提供HDFS服務(wù),其具體實(shí)現(xiàn)本發(fā)明實(shí)施例在此不再贅述。
[0059]可見,在圖3所描述的方法流程中,當(dāng)DataNode在進(jìn)行數(shù)據(jù)寫入時(shí)發(fā)生存儲資源故障時(shí),若可用資源列表中還存在其它可用存儲資源,則DataNode會向NameNode發(fā)送節(jié)點(diǎn)狀態(tài)正常上報(bào)消息,以通知NameNode該DataNode狀態(tài)仍正??捎?,避免了 DataNode因本地部分資源故障而停止提供HDFS服務(wù),提高了 DataNode的可用性,從而提高了 HDFS集群的可用性和可靠性。
[0060]為了使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明實(shí)施例提供的技術(shù)方案,下面結(jié)合具體應(yīng)用場景對本發(fā)明實(shí)施例提供的技術(shù)方案進(jìn)行描述。
[0061]在該實(shí)施例中,以DataNo