您好,登錄后才能下訂單哦!
這篇文章主要介紹HDFS如何讀寫數據,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
示例:上傳一個200M的文件到HDFS分布式系統 執行流程: 1、client向NameNode發送上傳文件的請求,NameNode會做校驗。 --(檢查是否具備權限,上傳路徑是否存在,文件是否以存在,是否執行覆蓋操作等) 2、NameNode響應客戶端,可以上傳文件 3、client按照集群中塊大小的設置對200M的數據進行切塊,即切分為128M和72M兩個block塊,并請 求返回DataNode節點信息 。 a.執行上傳時,是一塊一塊進行上傳,則先請求上傳0~128M的塊信息(第一個block塊),因為 數據真實存在DataNode節點上,所以NameNode會返回dn1\dn2\dn3三個服務器節點存儲數據。 --副本存儲節點選擇機制,如何選擇節點并返回?(見圖NameNode部分) --為什么明明只往一個節點傳,還要返回三個節點?(我覺得如果只返回一個節點,如果那個節點 掛了,就不知道往哪傳了,所以返回三個,dn1故障了可以選擇往dn2或dn3傳。) 4、client得到dn的信息后,會和dn服務器節點建立鏈接,client發送請求建立block傳輸通道,執行寫數據操作 a.client在和dn建立連接時,也會有選擇,選擇距離客戶端最近的節點請求建立鏈接通道(假設dn1最近) b.client和dn1建立鏈接通道之后,dn1內部發請求到dn2,請求建立通道,dn2發請求到dn3,請求建立通道, dn3響應dn2,dn2響應dn1,dn1響應client ,均沒有問題,通道建立成功 5、數據傳輸時,不是說將128M的文件直接進行傳輸,而是client向dn1以Packet為單位進行數據傳輸,(packet大小:64KB), 每次傳輸64KB,最后一次傳輸數據大小可能不夠64KB。 a.client向dn1傳輸64KB的數據到內存,dn1落盤(在當前節點服務器上將數據由內存寫到本地),并分發給dn2(內存), dn2落盤,在發給dn3(內存),dn3落盤 --邏輯上的說法 b.chunk數據傳輸過程中的最小單位(512字節),每次從0~128M中讀數據,先讀取512字節放入chunk中,當chunk滿 載時,對chunk內的數據進行校驗,生成校驗和(占4個字節),即共將516個字節放入Packet內,一個Packet存在N多個chunk --真實說法 c.各節點內部Packet是如何進行傳輸的? 在hdfs內部有一個隊列,叫做dataQuene(緩沖隊列),每傳輸一個Packet,就將當前Packet放入到DQ隊列中,當dn1 接收到DQ中的Packet時,會將Packet從DQ隊列中拉取出來,存入另一隊列ackQuene中(應答隊列),當dn1,dn2,dn3等節點均將ackq中的數據寫成功之后,ackquene中的packet移除,表示packet傳輸完成 6、當dn1、dn2、dn3建立通道時,或者在數據傳輸過程中,如果某個節點出現問題,比如dn2宕機了,那么客戶端會重新發 請求建立傳輸通道,這時,宕機的節點dn2不在請求應答,dn1 和 dn3直接建立通道,dn2不在使用,缺少副本數據,內部機器會重新配置一臺來頂替dn2,保證真實節點數據和副本機 制設置的保持一致 7、數據傳輸完成之后,流關閉,執行第二個塊的數據寫操作,步驟同上
示例:從HDFS系統下載一個200M的文件到本地 1、client向NameNode發送下載文件請求,NameNode向client返回目標文件的元數據 2、client根據元數據,通過FSDataInputStream進行讀取,client和距離客戶端最近的dn節點建立傳輸通道 a.注意:讀數據,只需要與一個節點建立通道即可,只要可以讀一次,取到真實數據就行 3、讀數據也是以Packet為單位,注意,第一次讀取時可能會取到第一個塊的數據,但是第二個塊可能存在其它 節點上,這時,其余數據的讀取需要client與其它節點重新建立通道進行讀取。 4、多個塊讀取到client之后,在client會進行緩存,然后合并寫入目標文件,保證讀取的真實數據的完整性
以上是“HDFS如何讀寫數據”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。