好程序員大數據教程分享:HDFS基本概念

1.1 HDFS的介紹

源自於Google的GFS論文 發表於2003年10月 HDFS是GFS克隆版 ,HDFS的全稱是Hadoop Distributed File System易於擴展的分佈式文件系統,運行在大量普通廉價機器上,提供容錯機制,為大量用戶提供性能不錯的文件存取服務

整個Hadoop的體系結構主要是通過HDFS來實現對分佈式存儲的底層支持,並通過MR來實現對分佈式並行任務處理的程序支持。

HDFS採用主從(Master/Slave)結構模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的(在最新的Hadoop2.2版本已經實現多個NameNode的配置-這也是一些大公司通過修改hadoop源代碼實現的功能,在最新的版本中就已經實現了)。NameNode作為主服務器,管理文件系統命名空間和客戶端對文件的訪問操作。DataNode管理存儲的數據。HDFS支持文件形式的數據。

從內部來看,文件被分成若干個數據塊,這若干個數據塊存放在一組DataNode上。NameNode執行文件系統的命名空間,如打開、關閉、重命名文件或目錄等,也負責數據塊到具體DataNode的映射。DataNode負責處理文件系統客戶端的文件讀寫,並在NameNode的統一調度下進行數據庫的創建、刪除和複製工作。NameNode是所有HDFS元數據的管理者,用戶數據永遠不會經過NameNode。

2 HDFS設計目標

自動快速檢測應對硬件錯誤

流式訪問數據

移動計算比移動數據本身更划算

簡單一致性模型

異構平臺可移植

移動計算和移動數據

在學習大數據的時候接觸了移動數據和移動計算這兩種聯繫緊密而又有很大不同的概念,

其中移動計算也叫做本地計算。在以前的數據處理中時使用的

移動數據,其實就是將需要處理的數據傳輸到存放不同處理數據方式邏輯的各個節點上。這樣做的效率很低,特別

是大數據中的數據量是很大的,至少都是GB以上,更大的是TB、PB甚至更大,而且磁盤I/O、網絡I/O的效率是很

低的,這樣處理起來就需要很長的時間,遠遠不能滿足我們的要求。而移動計算就出現了。

移動計算,也叫做本地計算,是數據就存放在節點上不再變動,而是將處理邏輯程序傳輸到各個數據節點上。由於

處理程序的大小肯定不會特別的大,這樣就可以實現很快將程序傳輸到存放數據的各個節點上去,然後本地執行處

理數據,效率高。現在的大數據處理技術都是採用這種方式。

HDFS模型例子:

班級中有這麼多筆記本其實就可以組成一個集群是吧,然後隔壁班需要將文件存儲到筆記本中,一個一個進來隨便找

一個筆記本存儲,走了之後,過了一段時間,需要將文件取走,但是每一個人都不知道自己上傳到那個服務器上了,那麼每

臺都需要找,,這樣一來操作的複雜度就高了,那麼需要怎麼改善這個問題?

犧牲一下,我的筆記本不存數據了,專門記錄存儲的的過程(NameNode),第一個人進來先找我,說我要存儲文件,然後我

說去第一臺電腦存吧,然後就去第一臺電腦存儲了,它在存儲文件的時候,上傳文件需要等幾分鐘,然後第二個人進來了,

也要存文件,然後我說你去第二臺電腦上存儲,那麼我與存儲人之間的交互信息量大嗎?不大,是吧我的主要作用就是告

訴對方去哪存儲, 第一臺電腦在傳第二臺電腦也再傳,是不是同時在傳,那麼這就相當於負載了,那麼他們在上傳的時候

是獨立的資源,而不會去搶佔資源.

問題:什麼時候記錄這個存儲記錄?

是在一開始對話的時候我就記錄,還是在當他傳完數據後記錄?

一定是傳完數據後記錄,這是為了數據的一致性

上傳成功後,是上傳人員告訴我上傳成功還是電腦給發送信息上傳成功

一定是電腦發送信息上傳成功,因為只有電腦去認了上傳成功了有文件有記錄就OK

是不是很簡單,很輕鬆啊,要是早幾年聽是不是HDFS就是你開發的了

HDFS的特點

優點:

高可靠性:Hadoop按位存儲和處理數據的能力值得人們信賴;

高擴展性:Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。

高效性:Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。

高容錯性:Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。

缺點:

不適合低延遲數據訪問。

無法高效存儲大量小文件。

不支持多用戶寫入及任意修改文件。

1.4 hdfs核心設計思想及作用

• 分而治之:將大文件、大批量文件,分佈式存放在大量服務器上,以便於採取分而治之的方式對海量數據進行運算分析;

• 為各類分佈式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務

• hdfs更具體描述

首先,它是一個文件系統,用於存儲文件,通過統一的命名空間——目錄樹來定位文件

其次,它是分佈式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色;

1.5 重要特性如下:

HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數( dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M。

HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。

目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔——namenode是HDFS集群主節點,負責維護整個hdfs文件系統的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器)。

文件的各個block的存儲管理由datanode節點承擔--- datanode是HDFS集群從節點,每一個block都可以在多個datanode上存儲多個副本(副本數量也可以通過參數設置dfs.replication)。

HDFS架構組成

好程序員大數據教程分享:HDFS基本概念

NameNode(NN)

基於內存存儲 :不會和磁盤發生交換隻存在內存中

這樣做的主要目的是為了快,但是內存存儲的一個通病就是掉電易失

一旦斷電內存中存儲的數據就什麼都沒有了,所以就需要持久化了(有點打臉了因為是需要到磁盤中的存儲)

NameNode持久化

NameNode的metadate信息在啟動後會加載到內存

存儲到磁盤中有兩種方法:

第一種:在某個時間點以類似於”拍快照”的形式將數據信息存儲到磁盤中

metadata存儲到磁盤文件名為”fsimage”,Block的位置信息不會保存到fsimage

若是回覆,需要等待DataNode重新彙報信息Block每副本位置(由DataNode上報)

第二種:以日誌的方式生成文件edit log記錄對metadata的操作日誌

NameNode主要功能:

接受客戶端的讀寫服務,收集DataNode彙報的Block列表信息

NameNode保存metadata信息包括

文件所屬權和權限,文件大小,時間(Block列表:Block偏移量),位置信息

DataNode(DN)

DataNode是Block真正存儲的地方。DataNode的本地磁盤以文件形式存儲著Block信息。同時還存儲著Block的元數據信息文件。

元數據主要存儲MD5值 用來進行驗證

HDFS在啟動時,DataNode會向NameNode彙報block的信息。

DataNode通過向NameNode發送心跳保持與其聯繫(3秒一次),如果NameNode 10分鐘沒有收到DataNode的心跳,則認為其已經lost,並複製其上的block到其它DataNode。

SecondaryNameNode(SNN)

初看名字,你可能會以為SecondaryNameNode是NameNode的備份,實際上,SecondaryNameNode的主要作用並不是這個,當然它也可以用來做備份。

要了解SecondaryNameNode的作用,就不得不說一下HDFS的啟動過程。

上面我們已經提到了兩個文件fsimage和edits。fsimage是當前HDFS系統的快照。edits記錄了對HDFS的各種操作日誌。

假設:有一個集群跑了10年一點問題都沒有,fsimage是十年前的一個點,為了不影響性能,只記錄了一次,而edits一直在記錄日子,吧唧,服務器宕機了,重啟恢復,

HDFS在啟動的時候,根據fsimage和edit log日誌可以得到系統當前最新的狀態,併產生一個新的fsimage文件。這樣的啟動時很耗時間的。尤其是當edit log文件非常大的時候,合併會佔用很多額外的時間。

相關推薦

推薦中...