從HDFS的寫入和讀取中,我們能學習到什么
最近開發過程涉及了一些和文件讀取有關的問題,于是對hdfs的讀取機制感到興趣,順便深入學習了1下。
寫入
客戶端向NameNode發出寫文件請求,告訴需要寫的文件名和路徑、用戶
NameNode檢查是否已存在文件、檢查權限。如果通過,會返回一個輸出流對象
注意此時會按照“日志先行“原則,寫入NameNode的editLog
客戶端按照128MB的大小切分文件。 也就是block大小
客戶端把nameNode傳來的DataNode列表和Data數據一同發送給 最近的第一個DataNode節點。
第一個dataNode節點收到數據和DataNode列表時, 會先根據列表,找到下一個自己要連接的最近DataNode, 刪除自己后,再一樣往下發。以此類推,發完3臺或者N臺。
傳輸單位是packet,包,比block小一點。
dataNode每寫完一個block塊, 則返回ACK信息給上一個節點進行確認。(注意是寫完block才確認)
寫完數據, 關閉輸出流, 發送完成信息給DataNode
寫過程的核心總結:
客戶端只向一個dataNode寫數據,然后下一個dataNode接著往另一個dataNode寫,串聯起來。
按128MB分block。 每次傳數據按pack傳。 校驗按照chunk 校驗,每次chunk都會寫入pack。
寫完block才發ACK確認。
Q: NameNode的editlog有什么用?怎么起作用的?
A:
作用:
硬盤中需要有一份元數據的鏡像——FSImage
每次要修改元數據就信息時,必須得改文件(hdfs沒有數據庫)
可能會比較久,改的時候如果斷電了,就丟失這個操作了
為了避免丟失,引入editlog,每次修改元數據前,先追加方式寫入editlog, 然后再處理,這樣即使斷電了也能修復。
一般都是那些更改操作有斷開風險,為了確保能恢復,都會引入這類操作。
Q: 什么時候發送完成信號? 全部節點都寫入完成嗎
A:
發送完成信號的時機取決于集群是強一致性還是最終一致性,強一致性則需要所有DataNode寫完后才向NameNode匯報。最終一致性則其中任意一個DataNode寫完后就能單獨向NameNode匯報,HDFS一般情況下都是強調強一致性
Q: 怎么驗證寫入時的數據完整性?
A:
因為每個chunk中都有一個校驗位,一個個chunk構成packet,一個個packet最終形成block,故可在block上求校驗和。
當客戶端創建一個新的HDFS文件時候,分塊后會計算這個文件每個數據塊的校驗和,此校驗和會以一個隱藏文件形式保存在同一個 HDFS 命名空間下。就是.meta文件
當client端從HDFS中讀取文件內容后,它會檢查分塊時候計算出的校驗和(隱藏文件里)和讀取到的文件塊中校驗和是否匹配,如果不匹配,客戶端可以選擇從其他 Datanode 獲取該數據塊的副本。
Q: 寫入時怎么確定最近節點?
A:
按照按照hadoop時設置的機架、數據中心、節點來估算
假設有數據中心d1機架r1中的節點n1。該節點可以表示為/d1/r1/n1。利用這種標記,這里給出四種距離描述。
Distance(/d1/r1/n1, /d1/r1/n1)=0(同一節點上的進程)
Distance(/d1/r1/n1, /d1/r1/n2)=2(同一機架上的不同節點)
Distance(/d1/r1/n1, /d1/r3/n2)=4(同一數據中心不同機架上的節點)
Distance(/d1/r1/n1, /d2/r4/n2)=6(不同數據中心的節點)
讀取
讀取就比較簡單了,沒有那種復雜的串行過程。NameNode直接告訴客戶端去哪讀就行了。
client訪問NameNode,查詢元數據信息,獲得這個文件的數據塊位置列表,返回輸入流對象。
就近挑選一臺datanode服務器,請求建立輸入流 。
DataNode向輸入流中中寫數據,以packet為單位來校驗。
關閉輸入流
Java 可信智能計算服務 TICS 大數據 數據庫 智能數據
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。