讀數(shù)據(jù)
跟namenode通信查詢元數(shù)據(jù),找到文件塊所在的datanode服務(wù)器挑選一臺datanode(就近原則,然后隨機)服務(wù)器,請求建立socket流datanode開始發(fā)送數(shù)據(jù)(從磁盤里面讀取數(shù)據(jù)放入流,以packet為單位來做校驗)客戶端以packet為單位接收,現(xiàn)在本地緩存,然后寫入目標(biāo)文件寫數(shù)據(jù)
根namenode通信請求上傳文件,namenode檢查目標(biāo)文件是否已存在,父目錄是否存在namenode返回是否可以上傳client請求第一個 block該傳輸?shù)侥男ヾatanode服務(wù)器上namenode返回3個datanode服務(wù)器abcclient請求3臺dn中的一臺a上傳數(shù)據(jù)(本質(zhì)上是一個rpc調(diào)用,建立pipeline),a收到請求會繼續(xù)調(diào)用b,然后b調(diào)用c,將真?zhèn)€pipeline建立完成,逐級返回客戶端client開始往a上傳第一個block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以packet為單位,a收到一個packet就會傳給b,b傳給c;a每傳一個packet會放入一個應(yīng)答隊列等待應(yīng)答當(dāng)一個block傳輸完成之后,client再次請求namenode上傳第二個block的服務(wù)器。網(wǎng)絡(luò)故障,臟數(shù)據(jù)如何解決?
datanode 失效等問題,這些問題 hdfs 在設(shè)計的時候都早已考慮到了。下面來介紹一下數(shù)據(jù)損壞處理流程:
當(dāng) datanode 讀取 block 的時候,它會計算 checksum。如果計算后的 checksum,與 block 創(chuàng)建時值不一樣,說明該 block 已經(jīng)損壞。client 讀取其它 datanode上的 block。namenode 標(biāo)記該塊已經(jīng)損壞,然后復(fù)制 block 達到預(yù)期設(shè)置的文件備份數(shù) 。datanode 在其文件創(chuàng)建后驗證其 checksum。讀寫過程,數(shù)據(jù)完整性如何保持?
通過校驗和。因為每個chunk中都有一個校驗位,一個個chunk構(gòu)成packet,一個個packet最終形成block,故可在block上求校驗和。
hdfs 的client端即實現(xiàn)了對 hdfs 文件內(nèi)容的校驗和 (checksum) 檢查。當(dāng)客戶端創(chuàng)建一個新的hdfs文件時候,分塊后會計算這個文件每個數(shù)據(jù)塊的校驗和,此校驗和會以一個隱藏文件形式保存在同一個 hdfs 命名空間下。當(dāng)client端從hdfs中讀取文件內(nèi)容后,它會檢查分塊時候計算出的校驗和(隱藏文件里)和讀取到的文件塊中校驗和是否匹配,如果不匹配,客戶端可以選擇從其他 datanode 獲取該數(shù)據(jù)塊的副本。
hdfs中文件塊目錄結(jié)構(gòu)具體格式如下:
${dfs.datanode.data.dir}/├──current│├──bp-526805057-127.0.0.1-1411980876842││└──current││├──version││├──finalized│││├──blk_1073741825│││├──blk_1073741825_1001.meta│││├──blk_1073741826│││└──blk_1073741826_1002.meta││└──rbw│└──version└──in_use.lockin_use.lock表示datanode正在對文件夾進行操作
rbw是“replica being written”的意思,該目錄用于存儲用戶當(dāng)前正在寫入的數(shù)據(jù)。
block元數(shù)據(jù)文件(*.meta)由一個包含版本、類型信息的頭文件和一系列校驗值組成。校驗和也正是存在其中。
服務(wù)器租用如何選擇可靠的IDC數(shù)據(jù)中心?運營社群的注意事項虛擬主機如何選擇的幾個方法網(wǎng)站優(yōu)化沒達到預(yù)期效果是什么原因?如何解決?常見網(wǎng)站推廣的方式及其優(yōu)缺點云存儲可擴展性的好處和限制云彈性云服務(wù)器有什么優(yōu)點?品牌網(wǎng)站建設(shè)的方案