HDFS是如何設計架構的?

前言

         Hadoop到目前爲止發展已經有10餘年,版本通過無數次的更新迭代,目前業內你們把Hadoop大的版本分爲Hadoop1.0、Hadoop2.0、Hadoop3.0 三個版本。3f6bc10622e3b6a98f4bc532c1b9faca.jpgnode

1、Hadoop 簡介

         Hadoop版本剛出來的時候是爲了解決兩個問題:一是海量數據如何存儲的問題,一個是海量數據如何計算的問題。Hadoop的核心設計就是HDFS和 Mapreduce.HDFS解決了海量數據如何存儲的問題, Mapreduce解決了海量數據如何計算的問題。HDFS的全稱:Hadoop Distributed File System。git

2、分佈式文件系統

7bc5bfc8816bdf44a2d79e88a9411dfd.jpg         HDFS其實就能夠理解爲一個分佈式文件系統,能夠看如圖1所示有4個服務器是否是都有他本身的文件系統均可以進行存儲數據,假設每一個服務器的存儲空間存儲10G的數據。假設數據量很小的時候存儲10G的數據仍是ok的當數據量大於服務器的存儲空間時是否是單個服務器就無法存儲了。 咱們是否是能夠在服務器中部署一個Hadoop這樣就能構建出一個集羣(超級大電腦)。這樣就存儲 4*10=40G的數據量,這樣咱們面向用戶時是否是隻有一臺超級大的電腦至關於一個分佈式文件系統。         程序員

         HDFS是一個主從的架構、主節點只有一個NemeNode。從節點有多個DataNode。github

3、HDFS 架構

5377cf36d3ec985c5415fbe9b741f5d1.jpg         假設咱們這裏有5臺服務器每臺服務器都部署上Hadoop,咱們隨便選擇一臺服務器部署上NameNode剩下服務器部署上DataNode。        面試

        客戶端上傳文件時假設文件大小爲129MHDFS默認切分的大小爲128M這時就會產生出2個blkNameNode去通知DataNode上傳文件(這裏有必定的策略),咱們就假設就將這幾個文件分別存儲在4個服務器上。爲什們要進行分別存儲在,假設DataNode服務器有一天忽然掛掉了咱們是否是還可經過DataNode4或2和3進行讀取數據,這樣是否是就防止數據丟失。安全

NameNode服務器

  1. 管理元數據信息(文件目錄樹):文件與Block塊,Block塊與DataNode主機關係
  2. NameNode爲快速響應用戶操做,因此把元數據信息加載到內存裏

DataNode網絡

  1. 存儲數據,把上傳的數據劃分固定大小文件塊(Block)在Hadoop2.73以前是64M以後改成了128M
  2. 爲了保證數據安全,每一個文件默認都是三個副本

SecondaryNamenode
         週期性的到NameNode節點拉取Edtis和fsimage文件,將這兩個文件加入到內存進行 而後將這兩個文件加入到內存中進行合併產生新的fsimage發送給NameNode。架構

4、HDFS寫入數據流程

  1. 客戶端會帶着文件路徑向NameNode發送寫入請求經過 RPC 與 NameNode 創建通信, NameNode 檢查目標文件,返回是否能夠上傳;
  2. Client 請求第一個 block 該傳輸到哪些 DataNode 服務器上;
  3. NameNode 根據副本數量和副本放置策略進行節點分配,返回DataNode節點,如:A,B,C
  4. Client 請求A節點創建pipeline管道,A收到請求會繼續調用B,而後B調用C,將整個pipeline管道創建完成後,逐級返回消息到Client;
  5. Client收到A返回的消息以後開始往A上傳第一個block塊,block塊被切分紅64K的packet包不斷的在pepiline管道里傳遞,從A到B,B到C進行復制存儲
  6. 當一個 block塊 傳輸完成以後,Client 再次請求 NameNode 上傳第二個block塊的存儲節點,不斷往復存儲
  7. 當全部block塊傳輸完成以後,Client調用FSDataOutputSteam的close方法關閉輸出流,最後調用FileSystem的complete方法告知NameNode數據寫入成功

5、HDFS讀取數據流程

  1. 客戶端會先帶着讀取路徑向NameNode發送讀取請求,經過 RPC 與 NameNode 創建通信,NameNode檢查目標文件,來肯定請求文件 block塊的位置信息
  2. NameNode會視狀況返回文件的部分或者所有block塊列表,對於每一個block塊,NameNode 都會返回含有該 block副本的 DataNode 地址
  3. 這些返回的 DataNode 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,而後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;
  4. Client 選取排序靠前的 DataNode 調用FSDataInputSteam的read方法來讀取 block塊數據,若是客戶端自己就是DataNode,那麼將從本地直接獲取block塊數據
  5. 當讀完一批的 block塊後,若文件讀取尚未結束,客戶端會繼續向NameNode 獲取下一批的 block 列表,繼續讀取
  6. 全部block塊讀取完成後,Client調用FSDataInputStream.close()方法,關閉輸入流,並將讀取來全部的 block塊合併成一個完整的最終文件

6、HDFS缺陷

340406b1e75682c811e965d19d2e61e0.jpg注意:早期版本app

  1. 單點問題
  2. 內存受限

總結

         上述給你們講解了簡單的HDFS架構,我在最後面留了一個小問題,我會在下期經過畫圖的方式給你們講解,我在這裏爲你們提供大數據的資料須要的朋友能夠去下面GitHub去下載,信本身,努力和汗水總會能獲得回報的。我是大數據老哥,咱們下期見~~~

資源獲取 獲取Flink面試題,Spark面試題,程序員必備軟件,hive面試題,Hadoop面試題,Docker面試題,簡歷模板等資源請去 GitHub自行下載 https://github.com/lhh2002/Framework-Of-BigData Gitee 自行下載  https://gitee.com/li_hey_hey/dashboard/projects

-End-


0704c89c49897915f37dd486e039e124.jpg

企業是如何選擇技術棧來作離線數倉


506927a34492bffe4dc1cdfcb0bbd6d6.jpg

原來Canal也能夠作HA?


e070c8223445af477313a8e9be732065.jpg

Hive的調優你都知道那些?


82c21f1d782c034896de47ba5cc917cb.jpg

萬字帶你深刻阿里開源的Canal工做原理


掃碼關注

068aff5676eca48a0385523f10e818c7.jpg大數據老哥但願這篇文章能夠幫到你~
歡迎你們點個在看,分享至朋友圈
你我都成爲光發熱之人,在看在看在看~(瘋狂暗示!)

相關文章
相關標籤/搜索