HDFS的文件上傳下載的核心原理

1,什麼是大數據?


什麼是大數據?先來一組直觀的數據感受下什麼是大數據:    

    

1)紐約證交所每天產生的交易數據大約是4TB到5TB之間;

2)截止到2015年7月,微信朋友圈每天的發表量(包括贊和評論)超過10億,瀏覽量超過100億;

3)微博每天7500萬條微博發佈,每條可輸入140字,總共105億字,1G可存儲5億字,每天就需21G的空間;

4)百度網盤網盤用戶數量達到2億,每個人可有2TB的存儲空間,可見存儲數據量之大。


可見,大數據就是數據量非常大,大到一臺計算機的容量無法存儲。那麼,這麼大的數據量該如何存儲呢?


2,大數據如何存儲?


舉個例子,假如我們用水桶盛水,當你不斷往水桶注水,那麼水滿了自然就會溢出。此時爲了不讓水溢出,那麼你自然會添加水桶來盛水。你會根據水量大小來計算需要多少水桶來盛水,當不夠水桶了,你會添加水桶。同理,當數據量非常大時,大到一臺計算機無法存儲時,此時可以用兩臺計算機來存儲,兩臺不計算機不夠存儲,擴展至三臺計算機來存儲。。。於是,這就涉及分佈式存儲了。


分佈式存儲中最有名且目前用的最多的當屬Hadoop的HDFS(Hadoop Distributed File System),思想起源於谷歌的三篇論文之一的GFS(The Google File System)。


3,什麼是Hadoop?


Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。Hadoop核心組件主要包括HDFS,YARN和MapReduce,而Hadoop的框架最核心的設計就是HDFS和MapReduce,其中HDFS爲海量的數據提供了存儲,而MapReduce則爲海量的數據提供了計算。另外YARN是 Hadoop 的資源調度管理器,它是一個通用資源管理系統,可爲上層應用提供統一的資源管理和調度。


4,Hadoop生態系統相關組件


圖1

圖1是Hadoop生態系統相關組件即目前大數據用到的相關技術,從中可以看到HDFS處於Hadoop生態系統最底層,即爲大數據相關組件提供存儲。其中Hive的數據是存儲在HDFS上的,因爲Hive的表是一張邏輯表,這張表的定義的描述了表數據與HDFS之間的映射關係;Hbase的底層存儲機制也是HDFS,一些流計算框架比如Spark Streaming,Storm和FLink的經過流式計算後也可以將數據輸出到HDFS上存儲。


5,什麼是HDFS?


既然HDFS能提供如此強大的存儲能力,那麼HDFS究竟是何方神聖?


當數據量非常大,大到一臺電腦無法存儲時,此時就得把數據拆分成幾部分,然後分別存儲在不同的計算機上,管理網絡中跨多臺計算機存儲的文件系統即爲分佈式文件系統(HDFS)。


HDFS可以存儲各種各樣的文件,比如text文本文件,csv文件,二進制文件等等。


6,HDFS的核心概念


學習HDFS的核心原理,那麼必須從其的核心組件學起,HDFS涉及的核心概念主要包含了數據塊,NameNode和DataNode。


數據塊:平時我們用的磁盤一般都有數據塊的大小,數據塊一般是文件讀寫的基本單位,同樣,HDFS也有默認的數據塊,HDFS的數據塊大小是128M.


NameNode:HDFS一般是一個由NameNode和DataNode組成的主從架構分佈式集羣,其中NameNode就相當於主節點,管理文件系統名稱空間,元數據和控制客戶端文件的訪問。


DataNode:DataNode就是存儲數據的節點,一個文件可以拆分成幾份分別存儲在不同的DataNode上。


7,我們如何將文件上傳至HDFS上呢?


既然明白了HDFS是這麼一個好東西,當數據量非常大時,我們可以通過擴展機器的方式來提高存儲量。那麼,此時我們將如何把文件上傳至HDFS上呢?

請看下圖,感受下HDFS上傳文件的核心流程。


圖2

根據上圖,我給大家梳理一些核心流程:


1,請求上傳300M的xxx.mp4文件,即hdfs控制檯上敲入hdfs dfs -put xxx.mp4 /filedir命令即可上傳xxx.mp4文件。


2,隨後HDFS客戶端創建DistrubutedFileSystem對象。


3,然後DistrubutedFileSystem對象與NameNode節點建立RPC通信,並生成一個NameNode代理對象NameNodeProxy。


4,NameNode創建文件相關的元數據信息並保存在內存中,保存的元數據說白了就是xxx.mp4這個文件分爲幾個數據塊來存儲,每隔數據塊存儲在哪個DataNode上。如下圖:

這裏的元數據表示xxx.mp4文件大小是300M,而HDFS的DataNode的數據塊大小默認是128M,因此xxx.mp4無法存儲到一個DataNode上。因此就需要將xxx.mp4文件分割成三部分:part-0(128M),part-1(128M)和part-3(44M)。爲了保證某個DataNode節點宕機數據不丟失,於是採用冗餘的策略,即一份文件在三個DataNode中存儲。以拆分的part-0文件爲例,part-0文件最終會寫入DataNode1,DataNode2DataNode3。


5,因爲元數據是保存在內存中的,當元數據滿了則寫入磁盤。


6,NameNode寫完元數據後,此時會將元數據相關信息返回給HDFS客戶端。


7,HDFS客戶端獲取NameNode返回的元數據後,創建FSDataOutputStream對象。


8,然後HDFS客戶端打開OutputStream,根據元數據信息開始寫數據。這裏的元數據即xxx.mp4這個文件分爲幾個數據塊來存儲,每隔數據塊存儲在哪個DataNode上,前面說過。


9,因此,有了元數據的指引,FSDataOutputStream對象將所有數據對象寫入DataNode中。以寫拆分的part-0文件爲例,FSDataOutputStream對象首先會將part-0文件寫入DataNode1中


10,爲了保證數據高可用,然後DataNode1會將part-0文件水平復制到DataNode2,再然後DataNode2再將part-0文件複製到DataNode5中,見下圖紅框部分:



11,最後一個節點DataNode5接收完畢part-0文件後,那麼就會返回ACK應答給DataNode2,同樣的DataNode2會返回應答給DataNode1,最終給你DataNode1會將應答返回給HDFS客戶端,見下圖紅框部分:




12,根據上面9,10,11步驟的寫part-0文件過程,同理FSDataOutputStream對象將part-1,part-2對象寫入datanode,直到寫完數據爲止。


因此經過上面的幾個步驟,HDFS文件上傳的原理就給大家說明白了。


8,明白了HDFS的文件上傳過程,那麼我們如何將文件從HDFS上下載下來呢?


既然你已經明白了HDFS文件的上傳過程,那麼HDFS文件的下載過程其實就是HDFS文件上傳過程的逆過程而已,不過有一點需要注意的是,下載的過程HDFS會比較智能,會選擇文件存儲最近的DataNode節點來下載文件,這是因爲網絡傳輸是需要成本的。詳細步驟這裏不再累述,詳情請見下圖:


好了,HDFS的來源,文件上傳及下載過程就給大家說明白了。


最後留兩道思考題請大家思考:


1,在生產部署中,高可用非常最重要。那麼HDFS集羣如何保證高可用呢?萬一NameNode節點掛了怎麼辦?

2,HDFS在文件下載過程中,若存儲文件的某個DataNode節點掛了怎麼辦?此時還能下載完整的文件嗎?還有,下次下載文件時,HDFS客戶端還會訪問出故障的DataNode節點嗎?


答案將在下期爲大家揭曉,敬請關注。


由於作者水平有限,若文中有錯誤還請提出,最後表示感謝。



本文分享自微信公衆號 - 源碼筆記(jinyue_lll)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章