深入剖析分布式文件系統HDFS

      網友投稿 1063 2022-05-29

      Hadoop主要由HDFS和MapReduce 兩個核心部分組成。其中最底部就是HDFS,它被用來存儲Hadoop 集群中所有存儲節點上的文件。 那么在這個學習任務中,小講就跟大家一起來學習hadoop的核心子項目——HDFS(分布式文件系統),我們將從HDFS的背景、基本概念開始,步步深入了解HDFS的設計目標、HDFS的基本結構以及HDFS的相關操作等核心知識。

      (一)HDFS 的產生背景?

      隨著數據量越來越大,在一個操作系統管轄的范圍內存不下了,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,迫切需要一種系統來管理多臺機器上的文件,這就是分布式文件管理系統。HDFS只是分布式文件管理系統中的一種。

      (二)HDFS 到底是什么?

      HDFS(Hadoop Distributed File System)是Hadoop的核心子項目,是一個可以運行在普通硬件設備上的分布式文件系統,是分布式計算中數據存儲和管理的基礎,是基于流數據模式訪問和處理超大文件的需求而開發的。它所具有的高容錯、高可靠性、高可擴展性、高吞吐率等特征為海量數據提供了不怕故障的存儲,給超大數據集(Large Data Set)的應用處理帶來了很多便利。

      (三)HDFS 從何而來?

      HDFS 源于 Google 在2003年10月份發表的GFS(Google File System) 論文。 它其實就是 GFS 的一個克隆版本。

      (四)HDFS的設計目標

      1、硬件故障是常態,而不是異常

      2、適合流式數據訪問

      3、適合大規模數據集

      4、簡單的一致性模型

      5、移動計算比移動數據更劃算

      6、輕便的訪問異構的軟硬件平臺

      (五)HDFS的架構和數據存儲原理

      HDFS是一個主/從(Mater/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統一樣,可以通過目錄路徑對文件執行CRUD(Create、Read、Update和Delete)操作。但由于分布式存儲的性質,HDFS集群擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端通過同NameNode和DataNodes的交互訪問文件系統。客戶端聯系NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。

      這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分。

      Client:就是客戶端。

      1、文件切分。文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然后進行存儲。

      2、與 NameNode 交互,獲取文件的位置信息。

      3、與 DataNode 交互,讀取或者寫入數據。

      4、Client 提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。

      5、Client 可以通過一些命令來訪問 HDFS。

      NameNode:就是 master,它是一個主管、管理者。

      1、管理 HDFS 的名稱空間。

      2、管理數據塊(Block)映射信息

      3、配置副本策略

      4、處理客戶端讀寫請求。

      DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操作。

      1、存儲實際的數據塊。

      2、執行數據塊的讀/寫操作。

      Secondary NameNode:并非 NameNode 的熱備。當NameNode 掛掉的時候,它并不能馬上替換 NameNode 并提供服務。

      1、輔助 NameNode,分擔其工作量。

      2、定期合并 fsimage和fsedits,并推送給NameNode。

      3、在緊急情況下,可輔助恢復 NameNode。

      (六)為什么選擇 HDFS 存儲數據?

      1、之所以選擇 HDFS 存儲數據,是因為 HDFS 具有以下優點:

      (1)高容錯性

      1)數據自動保存多個副本。它通過增加副本的形式,提高容錯性。

      2)某一個副本丟失以后,它可以自動恢復,這是由 HDFS 內部機制實現的,我們不必關心。

      (2)適合批處理

      1)它是通過移動計算而不是移動數據。

      2)它會把數據位置暴露給計算框架。

      (3)適合大數據處理

      深入剖析分布式文件系統HDFS

      1)數據規模:能夠處理數據規模達到 GB、TB、甚至PB級別的數據。

      2)文件規模:能夠處理百萬規模以上的文件數量,數量相當之大。

      3)節點規模:能夠處理10K節點的規模。

      (4)流式數據訪問

      1)一次寫入,多次讀取,不能修改,只能追加。

      2)它能保證數據的一致性。

      (5)可構建在廉價機器上

      1)它通過多副本機制,提高可靠性。

      2)它提供了容錯和恢復機制。比如某一個副本丟失,可以通過其它副本來恢復。

      2、當然 HDFS 也有它的劣勢,并不適合所有的場合:

      (1)不適合低延時數據訪問

      1)比如毫秒級的來存儲數據,這是不行的,它做不到。

      2)它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。但是它在低延時的情況下是不行的,比如毫秒級以內讀取數據,這樣它是很難做到的。

      改進策略

      (2)無法高效的對大量小文件進行存儲

      1)存儲大量小文件的話,它會占用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的。

      2)小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標。

      改進策略

      (3)并發寫入、文件隨機修改

      1)一個文件只能有一個寫,不允許多個線程同時寫。

      2)僅支持數據 append(追加),不支持文件的隨機修改。

      (七)HDFS 如何讀取文件?

      HDFS的文件讀取原理,主要包括以下幾個步驟:

      1、首先調用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。

      2、DistributedFileSystem通過RPC(遠程過程調用)獲得文件的第一批block的locations,同一block按照重復數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面。

      3、前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方 法,DFSInputStream就會找出離客戶端最近的datanode并連接datanode。

      4、數據從datanode源源不斷的流向客戶端。

      5、如果第一個block塊的數據讀完了,就會關閉指向第一個block塊的datanode連接,接著讀取下一個block塊。這些操作對客戶端來說是透明的,從客戶端的角度來看只是讀一個持續不斷的流。

      6、如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然后繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。

      (八)HDFS 如何寫入文件?

      HDFS的文件寫入原理,主要包括以下幾個步驟:

      1.客戶端通過調用 DistributedFileSystem 的create方法,創建一個新的文件。

      2.DistributedFileSystem 通過 RPC(遠程過程調用)調用 NameNode,去創建一個沒有blocks關聯的新文件。創建前,NameNode 會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,NameNode 就會記錄下新文件,否則就會拋出IO異常。

      3.前兩步結束后會返回 FSDataOutputStream 的對象,和讀文件的時候相似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 可以協調 NameNode和 DataNode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然后排成隊列 data queue。

      4.DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode里,比如重復數是3,那么就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。

      5.DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue才會把對應的packet包移除掉。

      6.客戶端完成寫數據后,調用close方法關閉寫入流。

      7.DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一個 ack 后,通知 DataNode 把文件標示為已完成。

      (九)HDFS 副本存放策略

      namenode 如何選擇在哪個 datanode 存儲副本(replication)?這里需要對可靠性、寫入帶寬和讀取帶寬進行權衡。 Hadoop 對 datanode 存儲副本有自己的副本策略,在其發展過程中一共有兩個版本的副本策略,分別如下所示。

      Hadoop 0.17之前的副本策略

      第一個副本:存儲在同機架的不同節點上。

      第二個副本:存儲在同機架的另外一個節點上。

      第三個副本:存儲在不同機架的另外一個節點。

      其它副本:選擇隨機存儲。

      Hadoop 0.17 之后的副本策略

      第一個副本:存儲在同 Client 相同節點上。

      第二個副本:存儲在不同機架的節點上。

      第三個副本:存儲在第二個副本機架中的另外一個節點上。

      其它副本:選擇隨機存儲。

      分布式 Hadoop

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Photoshop CS6專家講堂視頻教程
      下一篇:MongoDB快速入門之常用命令
      相關文章
      亚洲色精品三区二区一区| 亚洲美女免费视频| 亚洲欧洲国产成人精品| 亚洲人成网站在线播放影院在线| 亚洲日韩中文字幕在线播放| 亚洲无线码在线一区观看| 亚洲一区二区三区偷拍女厕| 亚洲精品乱码久久久久66| 中文字幕亚洲不卡在线亚瑟| 2022中文字字幕久亚洲| 亚洲综合网站色欲色欲| 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲乱码一二三四区麻豆| 亚洲国产日韩女人aaaaaa毛片在线 | 国产专区一va亚洲v天堂| 久久亚洲国产精品五月天婷| 在线日韩日本国产亚洲| 亚洲日本乱码在线观看| 亚洲AV永久无码精品一百度影院| 亚洲av色福利天堂| 亚洲的天堂av无码| 激情亚洲一区国产精品| 最新国产精品亚洲| 亚洲国产成人AV网站| 亚洲国产精品无码久久青草 | 中文字幕亚洲日本岛国片| 亚洲精品国产精品乱码在线观看| 亚洲精品无码久久久影院相关影片| 国产V亚洲V天堂无码久久久| 亚洲一区二区三区首页| 亚洲成a人片在线观看中文app| 色在线亚洲视频www| 综合一区自拍亚洲综合图区 | 国产AV无码专区亚洲AV漫画| 亚洲av日韩av激情亚洲| 亚洲欧洲自拍拍偷综合| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 日韩亚洲产在线观看| 国产尤物在线视精品在亚洲| 亚洲午夜国产片在线观看| 亚洲AV综合色区无码一区|