5分鐘深入淺出 HDFS

5分鐘深入淺出 HDFS


640?wx_fmt=jpeg&tp=webp&wxfrom=5

HDFS架構

HDFS Client

大家還記得我們如何向 Hadoop cluster 提交任務嗎?是通過 Hadoop client 進行的。

同樣,我們和 HDFS 打交道也是通過一個 client library. 無論讀取一個文件或者寫一個文件,我們都是把數據交給 HDFS client,它負責和 Name nodes 以及 Data nodes 聯繫並傳輸數據。

Name Nodes

我們在之前的文章中簡要提及過 HDFS 把文件存在多個機器上,並且不把“在哪些機器上存的”,“如何存的”這些內部的信息暴露給使用者,而是隻顯示給用戶一個像普通 linux 文件結構的文件系統。

那麼,是誰在管理這些信息的呢?這就是 Name nodes.

在 HDFS 裏, Name node 保存了整個文件系統信息,包括文件和文件夾的結構。其實和 linux 上的真的很像, HDFS 也是把文件和文件夾表示爲 inode, 每個 inode 有自己的所有者,權限,創建和修改時間等等。HDFS 可以存很大的文件,所以每個文件都被分成一些 data block,存在不同機器上, name node 就負責記錄一個文件有哪些 data block,以及這些 data block 分別存放在哪些機器上。

Name nodes 還負責管理文件系統常用操作,比如創建一個文件,重命名一個文件,創建一個文件夾,重命名一個文件夾等。

當我們通過 HDFS client 向 HDFS 讀取或者寫文件時,所有的讀寫請求都是先發給 Name nodes, 它負責創建或者查詢一個文件,然後再讓 HDFS client 和 Data nodes 聯繫具體的數據傳輸。

Data Nodes

存儲 data block 的機器叫做 Data nodes. 在讀寫過程中,Data nodes 負責直接把用戶讀取的文件 block 傳給 client,也負責直接接收用戶寫的文件。

當我們讀取一個文件時:

  • HDFS client 聯繫 Name nodes,獲取文件的 data blocks 組成、以及每個 data block 所在的機器以及具體存放位置;

  • HDFS client 聯繫 Data nodes, 進行具體的讀寫操作;

重要的事情說三遍。在讀寫一個文件時,當我們從 Name nodes 得知應該向哪些 Data nodes 讀寫之後,我們就直接和 Data node 打交道,不再通過 Name nodes.

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

數據備份

大家猜猜企業存儲數據時最頭疼的事情是什麼?

實際操作中最頭疼的事,不是數據量太大或者讀寫速度不夠快,而是數據丟失。

有很多企業存儲着客戶重要信息,尤其是和錢打交道的信息,一旦丟失,會造成很壞的經濟和聲譽影響。而實際中,一箇中等大小的數據中心就有上千臺機器存儲數據,這些機器每天都在高負荷運轉,所以發生故障,比如硬盤損毀,或者電源故障,經常發生。有多經常?Google 做過統計,Google 全世界運行的數據中心中,每年有1000臺機器要出故障,幾千個硬盤會出錯,一個電源分配設備出故障,造成500到1000臺機器停止運行6小時。

那麼 HDFS 是如何保證在機器故障情況下文件數據依然不丟失的呢?如題,就是數據備份,說白了就是多存幾份。那究竟多存幾份呢?這是一個可以配置的參數,從1到很大;如果我們不去配置,HDFS 默認3份。

Rack

不知道大家有沒有去過數據中心,就是存放運行 Hadoop 和 HDFS 的機器的地方,那裏的計算機和我們平常用的 PC 不太一樣,有若干臺機器垂直地組成一個 Rack,像一個書架一樣。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


通常,一個 rack 共享一個電源,一條網線,一個交換機;據統計,很多數據中心裏的故障都是一整個 rack 出問題。出於這個原因,HDFS 備份數據的時候,(假設還是3份),通常在同一個 rack 上儲存一份,然後在另一個 rack 上儲存另兩份。這樣就保證數據有更高的安全性。

別忘了 HDFS 存儲文件是以 block 爲單位的,所以備份也是以 block 爲單位的。

Name nodes 也需要知道每個 Data node 所在的 rack, 這樣才能給 client 提供準確信息 。這個知識是 HDFS 啓動時數據中心管理員配置給 Name nodes 的。

備份的讀寫選擇

問題來了:如果 HDFS 爲每一個 block 存三份,那 client 如何來寫呢?同時向三個 data node 寫嗎?

不是的。當 client 寫文件創建新 block 的時後,Name nodes 會爲這個 block 創建一個整個 HDFS cluster 裏獨有的 block ID,並且決定哪些 Data nodes l來存儲這個 block 的所有備份。這些被選擇的 Data nodes 組成一個隊列,client 向隊列的第一個 Data node 寫,那麼第一個 Data node 除了把數據存在自己的硬盤上以外,還要把數據傳給隊列裏的下一個 data node,如此這般,直到最後一個 data node 接到數據完畢。如下圖所示

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

同樣的,當 HDFS client 讀取一個文件時,它首先從 Name nodes 獲得這個文件所有 blocks 和每個 block 的所有備份所在機器位置。當 client 開始讀取 block 時,client 會選擇從“最近”的一臺機器讀取備份(“最近”指的是網絡延遲最短),如果第一個備份出現問題,比如網絡突然中斷,或者硬盤出故障,那 client 就從第二個備份讀,以此類推。

預告

綜上,這篇文章洋洋灑灑爲大家介紹了 HDFS 的架構和如何實現讀寫容錯。其實容錯性對於所有分佈式系統都是個重要問題,下篇文章我們就爲大家介紹 Hadoop MapReduce 是如何實現容錯的,這也是 Hadoop 被稱爲業界良心的重要原因之一,歡迎大家繼續關注我們。




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