當前位置:首頁 » 雲伺服器 » 什麼是hdfs集群的主伺服器

什麼是hdfs集群的主伺服器

發布時間: 2023-01-26 03:50:57

Ⅰ Hadoop生態系統-新手快速入門(含HDFS、HBase系統架構)

Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。

用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲

Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。

Hadoop的框架最核心的設計就是:HDFS和MapRece。HDFS為海量的數據提供了存儲,而MapRece則為海量的數據提供了計算。

廣義的Hadoop,一般稱為Hadoop生態系統,如下所示。

Hadoop生態系統中這些軟體的作用:

HDFS 採用了主從(Master/Slave)結構模型,一個HDFS集群包括一個名稱節點(NameNode)和若干個數據節點(DataNode)。

HDFS採用Java語言開發,因此任何支持JVM的機器都可以部署名稱節點和數據節點。

在配置好Hadoop 集群之後,可以通過瀏覽器訪問 http://[NameNodeIP]:9870,查詢HDFS文件系統。通過該Web界面,可以查看當前文件系統中各個節點的分布信息。

HBase系統架構如下所示,包括客戶端、Zookeeper伺服器、Master主伺服器、Region伺服器。一般而言,HBase會採用HDFS作為底層數據存儲。

在HBase伺服器集群中,包含了一個Master和多個Region伺服器,Master是HBase集群的「總管」,它必須知道Region伺服器的狀態。

HBase中可以啟動多個Master,但是Zookeeper 可以幫助選舉出一個Master 作為集群的總管,並保證在任何時刻總有唯一一個Master在運行,這樣可以避免Master單點失效的問題。

Region伺服器是HBase中最核心的模塊,負責維護分配給自己的Region,並響應用戶的讀寫請求。

Store是Region伺服器的核心。每個Store對應了表中的一個列族的存儲。每一個Store包含了一個MemStore緩存和若干個StoreFile文件。

HBase採用HLog來保證系統發生故障時,能夠恢復到正確的狀態。HLog是磁碟上面的記錄文件,它記錄著所有的更新操作。

HBase系統為每個Region伺服器配置了一個HLog文件,它是一種預寫式日誌(Write Ahead Log),也就是說,用戶更新數據必須首先被記入日誌後,才能寫入MemStore緩存。

此外,Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS數據導入功能,使得傳統資料庫數據向HBase中遷移變的非常方便。

注意:Hadoop 安裝完成之後,只包含HDFS和MapRece,並不含HBase,因此需要在Hadoop 之上繼續安裝HBase。

Ⅱ Hadoop文檔(2.9.2) - HDFS架構

Hadoop分布式文件系統(HDFS)是一種運行在通用硬體上的分布式文件系統。它與傳統的分布式文件系統有很多相似之處,但是也有顯著的不同。HDFS是高容錯的,可以部署在低成本硬體上。HDFS提供了對應用數據的高吞吐量訪問,適用於具有大數據集的應用。HDFS為了流數據訪問放鬆了一些POSIX的限制。

HDFS是主從結構。一個HDFS集群由一個NameNode和一組DataNode組成。NameNode是主伺服器,負責管理文件系統命名空間以及客戶端對文件的訪問。DataNode通常每個節點一個,負責管理存儲。HDFS對外暴露了一個文件系統命名空間並允許用戶數據作為文件存儲。在內部實現上,一個文件會被分割成一個或多個block,這些block存儲在一組DataNode上。NameNode負責執行文件系統命名空間操作,例如打開,關閉,重命名文件和目錄等。此外NameNode還維護著block和DataNode之間的映射關系。DataNode負責處理來自客戶端的讀寫請求,並根據NameNode的指令創建,刪除,備份block。

NameNode和DataNode都是運行在通用機器上的軟體。這些機器通常使用Linux系統。HDFS使用Java構建,任何支持Java的機器都可以運行NameNode和DataNode。一種典型的集群部署方式是使用一台機器運行NameNode,其它機器每台運行一個DataNode實例。

HDFS使用傳統的分層文件結構。用戶可以創建目錄並在目錄下存儲文件。文件系統命名空間結構與傳統文件系統類似,用戶可以創建,刪除文件,將文件從一個目錄移動到另一個目錄,重命名文件。HDFS支持用戶限額和訪問許可權。

NameNode維護整個文件系統命名空間,它會記錄任何對命名空間的修改。應用程序可以指定HDFS中文件的備份數量。文件的拷貝數稱為該文件的備份因子。這個信息也存儲在NameNode中。

HDFS可以跨機器存儲海量文件。每個文件分成一個block的序列存儲。為了容錯,文件的block會被備份。每個文件的block大小和備份因子都是可配置的。

文件中所有block的大小是相等的(除了最後一個),而對append和hsync提供可變長block支持後,用戶可以直接創建一個新block,不必繼續填充最後一個block。

應用程序可以指定文件的備份數。備份因子可在文件創建時指定,也可以稍後修改。HDFS的文件都是一次寫入的(除了append和truncate),並且任何時候都只有一個寫入器。

NameNode決定如何備份block。它周期性的接收來自DataNode的心跳檢測和block報表。收到心跳檢測說明DataNode工作正常,block報表包含該DataNode上的所有block。

備份文件的位置對HDFS的可用性和性能至關重要。對備份的優化讓HDFS從眾多分布式系統中脫穎而出。這個工作需要大量的優化和經驗。機架感知備份放置策略的目的是提高數據的可靠性,可用性和網路帶寬利用率。目前的備份放置策略實現是這個方向上的第一步。短期目標是在生產環境上對其進行驗證,更多的了解它的行為,為測試和研究更復雜的策略奠定基礎。

大型HDFS集群的機器通常隸屬於多個機架。兩個不同機架上的節點進行通信必須通過交換機。一般來說,同一機架機器之間的網路帶寬要優於不同機架機器間的網路帶寬。

NameNode通過Hadoop Rack Awareness進程確定每個DataNode所屬的機架ID。一個簡單但是並非最優的策略是將備份放置在獨立的機架上。這種策略可以避免機架故障時丟失數據,讀數據時也可以利用多個機架的網路帶寬。這種策略在集群中平均分配備份文件,這樣組件發生故障時可以平衡負載。但是這種策略會增加寫入成本,因為數據需要跨機架傳輸。

最常見的情況,備份因子是3。HDFS的放置策略是:如果寫入器位於DataNode上,則將副本放置在本地計算機,否則隨機選擇一個DataNode,另一個副本放置在另一個遠程機架的節點上,最後一個副本放在同一個遠程機架的另一個節點上。這種策略減少了機架間的寫入流量,從而提高寫性能。機架發生故障的幾率遠小於節點故障幾率。這種策略並不影響數據可靠性和可用性,但是它確實減少了讀操作時的聚合網路帶寬,因為一個block被放置到兩個機架上而不是三個。這種策略的文件副本並不是均勻的分布在所有機架上,副本的三分之一位於一個節點,剩下的三分之二位於另一個機架上。這種策略可以提高寫性能,而不會影響數據可靠性和讀性能。

如果備份因子大於3,那麼第四個和之後的副本隨機放置,同時要保證副本數量不能超過機架的上限(公式: (replicas - 1) / racks + 2 )。

由於DataNode不能放置同一個block的多個副本,所以最大備份因子就是最大DataNode數。

在提供了存儲類型和存儲策略的支持之後,除了機架感知,NameNode放置副本時也會考慮放置策略。NameNode首先根據機架感知選擇節點,然後根據備份文件的放置策略檢查該節點的存儲類型,如果該候選節點沒有要求的存儲類型,NameNode會查找下一個節點。如果第一輪沒有找到足夠的節點放置備份,NameNode會使用後備存儲類型開始第二輪查找。

目前,副本放置策略依然在開發中。

為了減少帶寬消耗和讀延遲,HDFS會嘗試找尋一個離讀請求最近的副本。如果讀請求節點所在機架有這樣一個副本,HDFS就優先使用這個副本。如果HDFS集群跨越多個數據中心,則本地數據中心的副本優先於遠程副本。

啟動HDFS時,NameNode會進入一種稱為安全模式的特殊狀態。安全模式下數據block無法備份。NameNode會從DataNode接收心跳檢測和block報表。block報表包含該DataNode下所有數據block的列表信息。每個block都有一個指定的最小備份數。只有block的最小備份數登記到NameNode中後,block才可以備份。備份登記結束後,NameNode退出安全模式。這是如果還有block不滿足最小備份數的條件,NameNode才開始備份這些block。

HDFS命名空間由NameNode保存,NameNode使用一個稱為EditLog的事務日誌記錄對文件系統元數據的所有更改。例如,創建一個新文件會在EditLog中插入一條對應記錄,同樣的,修改文件備份因子也會插入一條記錄。NameNode使用本地文件存儲EditLog。整個文件系統命名空間,包括文件與block之間的映射關系,文件系統數據等,都保存在FsImage文件中。

NameNode在內存中維護文件系統命名空間和文件block映射關系的鏡像。當NameNode啟動,或者某個閾值觸發了檢查點時,NameNode從磁碟上讀取FsImage和EditLog的內容,將所有EditLog中的事務操作應用到FsImage的內存鏡像中,然後在磁碟上生成一個全新的FsImage。之後可以截斷EditLog,因為所有事務都已持久化到FsImage。這個過程稱為檢查點。檢查點的目的是通過獲取文件系統元數據的快照並保存到FsImage來保證HDFS文件系統元數據的一致性。讀取FsImage可能很快,但是持續編輯FsImage就不同了。因此我們將操作記錄到EditLog中,而不是直接修改FsImage。在檢查點期間,所有EditLog操作應用到FsImage。檢查點可以按周期觸發( dfs.namenode.checkpoint.period ),也可以按事務數觸發( dfs.namenode.checkpoint.txns )。如果兩個屬性都設置了,第一個滿足的閾值會觸發檢查點。

DataNode在本地文件系統中存儲HDFS數據。DataNode對HDFS文件一無所知,它以block為單位存儲HDFS數據。DataNode不會在同一個目錄下保存所有文件。相反,它使用啟發式方法來確定每個目錄的最佳文件數,並適時創建子目錄。在同一個目錄下創建所有文件並不是最佳選擇,因為本地文件系統可能無法支持一個目錄下的大量文件。DataNode啟動時,它會掃描整個本地文件系統,生成一個本地文件與數據block之間的關系列表,將其發送給NameNode,這個列表稱為block報告。

所有HDFS通信協議都構建在TCP/IP協議之上。客戶端通過TCP埠與NameNode建立連接,它使用ClientProtocol與NameNode交互。DataNode使用DataProtocol與NameNode交互。一個RPC抽象封裝了客戶端協議和DataNode協議。NameNode從不初始化任何RPC,它只是響應來自的客戶端和DataNode的請求。

HDFS的主要目標是即使出現故障也可以可靠的存儲數據。三種常見的故障分別是:NameNode故障,DataNode故障和網路分區。

DataNode周期性的發送心跳檢測給NameNode。網路分區可能導致某些DataNode無法連接NameNode。NameNode無法收到DataNode的心跳檢測後,它會把這樣的DataNode標記為dead,並不在發送新的I/O請求。注冊到死亡DataNode上的數據對HDFS來說不再可用,也會導致某些block的備份數少於文件指定的最小備份數。NameNode持續追蹤block的備份情況並在必要時初始化備份操作。重備份的原因是多種多樣的:DataNode不可用,某個備份文件損壞,DataNode磁碟故障,或者文件的備份因子增大。

為了避免DataNode狀態抖動引起的備份風暴,標記DataNode死亡的超時時間設置的很長(默認超過10分鍾)。用戶可以設置一個更短的時間將DataNode標記為陳舊(stale),這樣可以避免對性能敏感的工作負載的陳舊DataNode的讀寫操作。

HDFS架構與數據重平衡scheme兼容。scheme可以在DataNode的磁碟空間低於某個閾值時將數據移動到另一個DataNode上。如果對某個文件的需求特別高,scheme還可以動態創建額外的副本並平衡到整個集群中。這些數據平衡scheme還未實現。

從DataNode中讀取的block可能是損壞的。損壞的原因有多種:磁碟故障,網路故障,或者軟體問題。HDFS客戶端會對文件內容進行校驗和檢查。當客戶端創建一個HDFS文件時,它會計算出文件所有block的校驗和並保存在同一個命名空間的一個獨立的隱藏文件中。當客戶單檢索文件時還要檢查對應校驗和文件中的值。如果校驗和不匹配,客戶端會嘗試該block其它節點上的副本。

FsImage和EditLog是HDFS的核心數據結構。如果它們發生損壞,HDFS就無法使用了。因此,可以通過配置讓NameNode維護多個FsImage和EditLog的拷貝。對兩個文件的修改會同步到所有拷貝中。這種同步操作會降低NameNode的TPS,但是這種犧牲是可接受的,因為HDFS是數據密集,不是元數據密集。NameNode重啟時,它會選擇最一致的FsImage和EditLog使用。

另一種減低故障的辦法是使用HA。

(略)

HDFS的目的是支持大型文件。HDFS支持一次寫入多次讀取。一個典型的block大小是128MB。因此,HDFS文件按照128MB的大小分割,每個block可能分布在不同的節點上。

客戶端向HDFS文件寫入數據時,如果備份因子是三,NameNode使用備份目標選擇演算法檢索出一組DataNode。這個列表是可以存儲副本的DataNode。客戶端先向第一個DataNode寫入數據,DataNode接收數據並將數據傳輸到列表中的第二個DataNode。第二個DataNode開始接收數據並繼續傳輸數據到第三個DataNode。這樣,數據通過管道從一個DataNode傳輸到下一個。

(略)

如果開啟了trash配置,從FS shell中刪除的文件並不會立刻從HDFS中刪除,HDFS將它移動到一個trash目錄(每個用戶都有自己的trash目錄, /user/<username>/.Trash )。只要文件還在trash目錄中就可以快速恢復。

最近刪除的文件移動到 /user/<username>/.Trash/Current 目錄中,每隔一段時間,HDFS會為這些文件創建檢查點文件( /user/<username>/.Trash/<date> )並刪除舊檢查點文件。

如果trash中的文件過期了,NameNode將這些文件從命名空間中刪除。與文件關聯的block被釋放。刪除文件和空間釋放之間可能會有延遲。

下面是一個例子,首先創建兩個文件:

然後刪除test1,該文件會被移到Trash目錄:

接著跳過Trash刪除test2:

現在可以查看Trash目錄:

文件的備份因子降低後,NameNode選擇可以刪除的副本,在下次心跳檢測時把信息發送給DataNode,之後DataNode刪除block並釋放空間。

Ⅲ HDFS 系統架構

HDFS Architecture

Hadoop Distributed File System (HDFS) 是設計可以運行於普通商業硬體上的分布式文件系統。它跟現有的分布式文件系統有很多相通的地方,但是區別也是顯著的。HDFS具有高度容錯性能,被設計運行於低成本硬體上。HDFS可以向應用提供高吞吐帶寬,適合於大數據應用。HDFS 放寬了一些 POSIX 的要求,以開啟對文件系統數據的流式訪問。HDFS 最初是作為Apache Nutch web 搜索引擎項目的基礎設施開發的。HDFS 現在是 Apache Hadoop 核心項目的一部分。

HDFS是主從架構。一個HDFS集群包含一個NameNode,一個管理文件系統命名空間和控制客戶端訪問文件的master server。以及,若乾的 DataNodes,通常集群的每個node一個,管理運行DataNode的節點上的存儲。HDFS 發布一個文件系統命名空間,並允許用戶數據已文件的形式存儲在上面。內部,一個文件被分成一個或多個塊,存儲在一組DataNodes上。NameNode 執行文件系統命名空間操作,比如:打開、關閉、重命名文件或目錄。它還確定塊到DataNodes的映射。DataNodes 負責向文件系統客戶端提供讀寫服務。DataNodes 根據 NameNode 的指令執行塊的創建、刪除以及復制。

NameNode 和 DataNode 是設計運行於普通商業機器的軟體。這些機器通常運行 GNU/Linux 操作系統。HDFS 是Java 語言編寫的;任何支持Java的機器都可以運行NameNode or DataNode 軟體。使用高移植性Java語言,意味著HDFS可以部署在很大范圍的機器上。一個典型的部署就是一台特定的機器只運行NameNode 軟體,而集群內的其他機器運行DataNode 軟體的一個實例。這種架構不排除一台機器上運行多個DataNodes ,但是在實際部署中很少見。

單 NameNode 節點的存在大大簡化了架構。NameNode 是所有HDFS 元數據的仲裁和倉庫。系統設計上,用戶數據永遠不經過NameNode。

HDFS 支持傳統的文件分級組織。用戶或應用可以創建目錄,並在目錄內存儲文件。 文件系統命名空間的層次結構跟其他文件系統類似;可以創建、刪除、移動、重命名文件。HDFS 支持 user quotas 和 access permissions 。 HDFS 不支持軟、硬鏈接。但是,HDFS 架構不排除實現這些功能。

雖然HDFS遵守 文件系統命名約定 ,一些路徑和名稱 (比如/.reserved 和.snapshot ) 保留了。比如功能 transparent encryption 和 snapshot 就使用的保留路徑。

NameNode 維護文件系統命名空間。任何文件系統命名空間或屬性的變化,都會被NameNode記錄。 應用可以指定HDFS應維護的文件副本數量。文件副本的數量被稱為該文件的復制因子 replication factor 。該信息存儲於NameNode。

HDFS 被設計用於在一個大規模集群上跨機器可靠地存儲巨大的文件。它以一序列的塊的方式存儲文件。每個文件都可以配置塊尺寸和復制因子。

一個文件除了最後一個塊外,其他的塊一樣大。在 append 和 hsync 添加了可變長度塊的支持後,用戶可以啟動一個新的塊,而不用填充最後一個塊到配置的塊大小。

應用可以指定一個文件的副本數量。復制因子可以在創建的時候指定,也可以以後更改。HDFS的文件只寫一次(除了 appends 和 truncates) ,並在任何時候只允許一個 writer 。

NameNode 指定塊復制的所有決策。它周期性的從集群的每個DataNodes 接受 Heartbeat 和 Blockreport。Heartbeat 的接受代表 DataNode 工作正常。Blockreport 包含了DataNode上所有塊的清單。

副本的位置對HDFS的可靠性和性能至關重要。副本位置的優化是HDFS和其他大多數分布式文件系統的區別。這是一個需要大量調優和經驗的特性。Rack-aware 復制策略的目的就是提高數據可靠性,可用性和網路帶寬利用率。當前副本位置策略的實現是這個方向的第一步。實施該策略的短期目標是在生產環境驗證它,了解其更多的行為,為測試和研究更復雜的策略打下基礎。

大型HDFS實例運行在跨多個Rack的集群伺服器上。不同rack的兩個node通信需要通過交換機。大多數情況下,同一rack內的帶寬大於rack之間的帶寬。

NameNode 通過在 Hadoop Rack Awareness 內的進程描述 判斷DataNode 屬於哪個rack id。一個簡單但是並非最佳的策略是將副本分布於不同的racks。這可以防止整個機架發生故障時丟失數據,並允許在讀取數據時使用多個機架的帶寬。該策略在群集中均勻地分布副本,使得組件故障時很容易平衡負載。 但是,該策略會增加寫入成本,因為寫入操作需要將塊傳輸到多個機架。

一般,復制因子設置為3, HDFS 的分布策略是:如果writer在datanode上則將一個副本放到本地機器, 如果writer不在datanode上則將一個副本放到writer所在機櫃的隨機datanode 上;另一個副本位於不同機架的node上;最後一個副本位於同一遠程機架的不同node上。 該策略減少了機架間的寫流量,提升了寫性能。機架故障的概率遠小於節點故障的概率;此策略不會影響數據可靠性和可用性承諾。但是,在讀取數據時,它確實減少了聚合帶寬,因為塊存儲於兩個機櫃而不是三個機櫃內。使用此策略,副本不會均勻的分布於機架上。1/3 副本 位於同一節點, 2/3 副本位於同一機架, 另1/3副本位於其他機架。該策略提升了寫性能而不影響數據可靠性和讀性能。

如果復制因子大於3,那麼第4個及以後的副本則隨機放置,只要滿足每個機架的副本在(replicas - 1) / racks + 2)之下。

因為 NameNode 不允許 DataNodes 擁有同一個塊的多個副本,所以副本的最大數就是DataNodes的數量。

在把對 存儲類型和存儲策略 的支持添加到 HDFS 後,除了上面介紹的rack awareness外, NameNode 會考慮其他副本排布的策略。NameNode 先基於rack awareness 選擇節點,然後檢查候選節點有文件關聯的策略需要的存儲空間。 如果候選節點沒有該存儲類型, NameNode 會查找其他節點。如果在第一條路徑中找不到足夠的節點來放置副本,NameNode會在第二條路徑中查找具有回滾存儲類型的節點。 、

當前,這里描述的默認副本排布策略正在使用中。

為了最小化全局帶寬消耗和讀取延遲, HDFS 會嘗試從最靠近reader的副本響應讀取請求。如果在reader節點的同一機架上上存在副本,則該副本有限響應讀請求。如果HDFS集群跨多個數據中心,則本地數據中心優先。

啟動時,NameNode 會進入一個稱為 Safemode 的特殊狀態。當NameNode處於Safemode狀態時,不會復制數據塊。NameNode從DataNodes接收Heartbeat和Blockreport消息。Blockreport包含DataNode託管的數據塊列表。每個塊都指定了最小副本數。當數據塊的最小副本數已與NameNode簽入時,該塊被認為是安全復制的。在NameNode簽入安全復制數據塊的已配置百分比(加上額外的30秒)後,NameNode退出Safemode狀態。然後,它判斷列表內的數據塊清單是否少於副本指定的數量。NameNode 然後復制這些塊給其他 DataNodes。

HDFS 命名空間由 NameNode 存儲。NameNode 使用事務日誌 EditLog 來持久化的保存系統元數據的每次變更。比如,在HDFS創建一個新文件,NameNode會在 EditLog 插入一條記錄來指示該變更。類似的,變更文件的復制因子也會在 EditLog 插入一條新記錄。NameNode 以文件的形式,將 EditLog 保存在本地OS文件系統上。整個文件系統命名空間,包括塊到文件的映射、文件系統屬性,都存儲於名字為 FsImage 的文件內。 FsImage 也以文件的形式,存儲在NameNode的本地文件系統上。

NameNode 將包含整個文件系統和塊映射的image保存在內存中。當NameNode啟動時,或檢查點被預先定義的閾值觸發時,它會從磁碟讀取 FsImage 和 EditLog ,把 EditLog 內的事物應用到內存中的FsImage,再將新版本刷新回磁碟的新 FsImage 。然後會截斷舊的 EditLog ,因為它的事物已經應用到了持久化的 FsImage 上。 這個過程稱為檢查點 checkpoint 。檢查點的目的是通過對文件系統元數據進行快照並保存到FsImage,來確保HDFS擁有文件系統元數據的一致性視圖。盡管讀取 FsImage 是高效的,但是對 FsImage 直接增量修改是不高效的。不是對每次編輯修改 FsImage ,而是將每次編輯保存到 Editlog 。在檢查點期間,將 Editlog 的變更應用到 FsImage 。一個檢查點可以在固定周期(dfs.namenode.checkpoint.period)(以秒為單位)觸發,也可以文件系統事物數量達到某個值(dfs.namenode.checkpoint.txns)的時候觸發。

DataNode 在本地文件系統上以文件的形式存儲 HDFS data 。DataNode 不知道 HDFS 文件。它將HDFS data 的每個塊以獨立的文件存儲於本地文件系統上。DataNode 不在同一目錄創建所有的文件。而是,使用heuristic來確定每個目錄的最佳文件數量,並適當的創建子目錄。在一個目錄創建所有的本地文件是不好的,因為本地文件系統可能不支持單目錄的海量文件數量。當DataNode啟動的時候,它掃描本地文件系統,生成與本地文件系統一一對應的HDFS數據塊列表,然後報告給NameNode。這個報告稱為 Blockreport。

所有的HDFS通信協議都在TCP/IP協議棧上。客戶端與NameNode指定的埠建立連接。與NameNode以ClientProtocol 通信。DataNodes與NameNode以DataNode Protocol進行通信。遠程過程調用(RPC)封裝了Client Protocol 和 DataNode Protocol。設計上,NameNode從不啟動任何RPCs。相反,它只應答DataNodes or clients發出的RPC請求。

HDFS的主要目標是可靠的存儲數據,即使是在故障的情況下。常見故障類型有三種: NameNode failures , DataNode failures network partitions

每個DataNode都周期性的向NameNode發送心跳信息。 一個 network partition 可能導致DataNodes子集丟失與NameNode的連接。NameNode會基於心跳信息的缺失來偵測這種情況。NameNode將沒有心跳信息的DataNodes標記為 dead ,並不再轉發任何IO請求給它們。任何注冊到dead DataNode的數據對HDFS將不再可用。DataNode death會導致某些塊的復制因子低於它們指定的值。NameNode不斷跟蹤需要復制的塊,並在必要時啟動復制。很多因素會導致重新復制:DataNode不可用,副本損壞,DataNode上硬碟故障,復制因子增加。

標記 DataNodes dead 的超時時間保守地設置了較長時間 (默認超過10分鍾) 以避免DataNodes狀態抖動引起的復制風暴。對於性能敏感的應用,用戶可以設置較短的周期來標記DataNodes為過期,讀寫時避免過期節點。

HDFS 架構支持數據再平衡schemes。如果一個DataNode的空餘磁碟空間低於閾值,sheme就會將數據從一個DataNode 移動到另外一個。在某些文件需求突然增長的情況下,sheme可能會在集群內動態的創建額外的副本,並再平衡其他數據。這些類型的數據再平衡schemes還沒有實現。

有可能從DataNode獲取的數據塊,到達的時候損壞了。這種損壞可能是由於存儲設備故障、網路故障、軟體bug。HDFS客戶端軟體會HDFS的內容進行校驗。當客戶端創建HDFS文件的時候,它計算文件每個塊的校驗值,並以獨立的隱藏文件存儲在同一HDFS命名空間內。當客戶端檢索文件時候,它會校驗從每個DataNode獲取的數據,是否與關聯校驗文件內的校驗值匹配。 如果不匹配,客戶端可以從另外擁有副本塊的DataNode檢索。

FsImage 和 EditLog 是HDFS的核心數據結構。這些文件的損壞將導致HDFS實例異常。 因此,NameNode可以配置為支持多 FsImage 和 EditLog 副本模式。任何對 FsImage or EditLog 的更新都會導致每個 FsImages 和 EditLogs 的同步更新。 FsImage 和 EditLog 的同步更新會導致降低命名空間每秒的事物效率。但是,這種降級是可以接受的,因為HDFS應用是數據密集型,而不是元數據密集型。當NameNode重啟的時候,它會選擇最新的一致的 FsImage 和 EditLog 。

另外一種提供故障恢復能力的辦法是多NameNodes 開啟HA,以 shared storage on NFS or distributed edit log (called Journal)的方式。推薦後者。

Snapshots - 快照,支持在特定時刻存儲數據的副本。快照功能的一個用法,可以回滾一個故障的HDFS實例到已知工作良好的時候。

HDFS被設計與支持超大的文件。與HDFS適配的軟體都是處理大數據的。這些應用都只寫一次,但是它們會讀取一或多次,並且需要滿足流式讀速度。HDFS支持文件的 一次寫入-多次讀取 語義。 HDFS典型的塊大小是128 MB.。因此,HDFS文件被分割為128 MB的塊,可能的話每個塊都位於不同的DataNode上。

當客戶端以復制因子3寫入HDFS文件時,NameNode以 復制目標選擇演算法 replication target choosing algorithm 檢索DataNodes 列表。該列表包含了承載該數據塊副本的DataNodes清單。然後客戶端寫入到第一個DataNode。第一DataNode逐步接受數據的一部分,將每一部分內容寫入到本地倉庫,並將該部分數據傳輸給清單上的第二DataNode。第二DataNode,按順序接受數據塊的每個部分,寫入到倉庫,然後將該部分數據刷新到第三DataNode。最終,第三DataNode將數據寫入到其本地倉庫。
因此,DataNode從管道的前一個DataNode獲取數據,同時轉發到管道的後一個DataNode。因此,數據是以管道的方式從一個DataNode傳輸到下一個的。

應用訪問HDFS有很多方式。原生的,HDFS 提供了 FileSystem Java API 來給應用調用。還提供了 C language wrapper for this Java API 和 REST API 。另外,還支持HTTP瀏覽器查看HDFS實例的文件。 通過使用 NFS gateway ,HDFS還可以掛載到客戶端作為本地文件系統的一部分。

HDFS的用戶數據是以文件和目錄的形式組織的。它提供了一個命令行介面 FS shell 來提供用戶交互。命令的語法類似於其他shell (比如:bash, csh)。如下是一些範例:

FS shell 的目標是向依賴於腳本語言的應用提供與存儲數據的交互。

DFSAdmin 命令用於管理HDFS集群。這些命令僅給HDFS管理員使用。如下範例:

如果啟用了回收站配置,那麼文件被 FS Shell 移除時並不會立即從HDFS刪除。HDFS會將其移動到回收站目錄(每個用戶都有回收站,位於 /user/<username>/.Trash )。只要文件還在回收站內,就可以快速恢復。

最近刪除的文件大多數被移動到 current 回收站目錄 ( /user/<username>/.Trash/Current ),在配置周期內,HDFS給 current目錄內的文件創建檢查點 checkpoints (位於 /user/<username>/.Trash/<date> ) ,並刪除舊的檢查點。參考 expunge command of FS shell 獲取更多關於回收站檢查點的信息。

在回收站過期後,NameNode從HDFS命名空間刪除文件。刪除文件會將文件關聯的塊釋放。注意,在用戶刪除文件和HDFS增加free空間之間,會有一個明顯的延遲。

如下範例展示了FS Shell如何刪除文件。我們在delete目錄下創建兩個文件(test1 & test2)

我們刪除文件 test1。如下命令顯示文件被移動到回收站。

現在我們嘗試以skipTrash參數刪除文件,該參數將不將文件發送到回收站。文件將會從HDFS完全刪除。

我們檢查回收站,只有文件test1。

如上,文件test1進了回收站,文件test2被永久刪除了。

當縮減文件的復制因子時,NameNode選擇可以被刪除的多餘副本。下一個Heartbeat會通報此信息給DataNode。DataNode然後會刪除響應的塊,相應的剩餘空間會顯示在集群內。同樣,在setReplication API調用完成和剩餘空間在集群顯示之間會有一個時間延遲。

Hadoop JavaDoc API .

HDFS source code: http://hadoop.apache.org/version_control.html

Ⅳ hdfs的主伺服器名稱

hdfs的主伺服器名稱:由一個NameNode和若干個DataNode組成的。

其中NameNode作為主伺服器,管理文件系統的命名空間和客戶端對文件系統的訪問操作;集群中的DataNode管理存儲的數據。

對於集群來說,取決於集群中所有DataNode節點的硬碟大小之和。但是需要注意考慮集群的備份數量,假設備份數量為3,集群總容量為3TB,則實際可以存儲1TB的文件。

名位元組點和數據節點:

這些塊被存儲在一組數據節點中。名位元組點用來操作文件命名空間的文件或目錄操作,如打開,關閉,重命名等等。它同時確定塊與數據節點的映射。數據節點負責來自文件系統客戶的讀寫請求。數據節點同時還要執行塊的創建,刪除,和來自名位元組點的塊復制指令。

Ⅳ Hadoop系列之HDFS架構

    本篇文章翻譯了Hadoop系列下的 HDFS Architecture ,原文最初經過筆者翻譯後大概有6000字,之後筆者對內容進行了精簡化壓縮,從而使筆者自己和其他讀者們閱讀本文時能夠更加高效快速的完成對Hadoop的學習或復習。本文主要介紹了Hadoop的整體架構,包括但不限於節點概念、命名空間、數據容錯機制、數據管理方式、簡單的腳本命令和垃圾回收概念。

    PS:筆者新手一枚,如果看出哪裡存在問題,歡迎下方留言!

    Hadoop Distributed File System(HDFS)是高容錯、高吞吐量、用於處理海量數據的分布式文件系統。

    HDFS一般由成百上千的機器組成,每個機器存儲整個數據集的一部分數據,機器故障的快速發現與恢復是HDFS的核心目標。

    HDFS對介面的核心目標是高吞吐量而非低延遲。

    HDFS支持海量數據集合,一個集群一般能夠支持千萬以上數量級的文件。

    HDFS應用需要對文件寫一次讀多次的介面模型,文件變更只支持尾部添加和截斷。

    HDFS的海量數據與一致性介面特點,使得遷移計算以適應文件內容要比遷移數據從而支持計算更加高效。

    HDFS支持跨平台使用。

    HDFS使用主從架構。一個HDFS集群由一個NameNode、一個主伺服器(用於管理系統命名空間和控制客戶端文件介面)、大量的DataNode(一般一個節點一個,用於管理該節點數據存儲)。HDFS對外暴露了文件系統命名空間並允許在文件中存儲用戶數據。一個文件被分成一個或多個塊,這些塊存儲在一組DataNode中。NameNode執行文件系統命名空間的打開關閉重命名等命令並記錄著塊和DataNode之間的映射。DataNode用於處理客戶端的讀寫請求和塊的相關操作。NameNode和DataNode一般運行在GNU/Linux操作系統上,HDFS使用Java語言開發的,因此NameNode和DataNode可以運行在任何支持Java的機器上,再加上Java語言的高度可移植性,使得HDFS可以發布在各種各樣的機器上。一個HDFS集群中運行一個NameNode,其他機器每個運行一個(也可以多個,非常少見)DataNode。NameNode簡化了系統的架構,只用於存儲所有HDFS元數據,用戶數據不會進入該節點。下圖為HDFS架構圖:

    HDFS支持傳統的分層文件管理,用戶或者應用能夠在目錄下創建目錄或者文件。文件系統命名空間和其他文件系統是相似的,支持創建、刪除、移動和重命名文件。HDFS支持用戶數量限制和訪問許可權控制,不支持軟硬鏈接,用戶可以自己實現軟硬鏈接。NameNode控制該命名空間,命名空間任何變動幾乎都要記錄到NameNode中。應用可以在HDFS中對文件聲明復制次數,這個次數叫做復制系數,會被記錄到NameNode中。

    HDFS將每個文件存儲為一個或多個塊,並為文件設置了塊的大小和復制系數從而支持文件容錯。一個文件所有的塊(除了最後一個塊)大小相同,後來支持了可變長度的塊。復制系數在創建文件時賦值,後續可以更改。文件在任何時候只能有一個writer。NameNode負責塊復制,它周期性收到每個數據節點的心跳和塊報告,心跳錶示數據節點的正常運作,塊報告包含了這個DataNode的所有塊。

    副本存儲方案對於HDFS的穩定性和性能至關重要。為了提升數據可靠性、靈活性和充分利用網路帶寬,HDFS引入了機架感知的副本存儲策略,該策略只是副本存儲策略的第一步,為後續優化打下基礎。大型HDFS集群一般運行於橫跨許多支架的計算機集群中,一般情況下同一支架中兩個節點數據傳輸快於不同支架。一種簡單的方法是將副本存放在單獨的機架上,從而防止丟失數據並提高帶寬,但是增加了數據寫入的負擔。一般情況下,復制系數是3,HDFS存儲策略是將第一份副本存儲到本地機器或者同一機架下一個隨機DataNode,另外兩份副本存儲到同一個遠程機架的不同DataNode。NameNode不允許同一DataNode存儲相同副本多次。在機架感知的策略基礎上,後續支持了 存儲類型和機架感知相結合的策略 ,簡單來說就是在機架感知基礎上判斷DataNode是否支持該類型的文件,不支持則尋找下一個。

    HDFS讀取數據使用就近原則,首先尋找相同機架上是否存在副本,其次本地數據中心,最後遠程數據中心。

    啟動時,NameNode進入安全模式,該模式下不會發生數據塊復制,NameNode接收來自DataNode的心跳和塊報告,每個塊都有一個最小副本數量n,數據塊在NameNode接受到該塊n次後,認為這個數據塊完成安全復制。當完成安全復制的數據塊比例達到一個可配的百分比值並再過30s後,NameNode退出安全模式,最後判斷是否仍然存在未達到最小復制次數的數據塊,並對這些塊進行復制操作。

    NameNode使用名為EditLog的事務日誌持續記錄文件系統元數據的每一次改動(如創建文件、改變復制系數),使用名為FsImage的文件存儲全部的文件系統命名空間(包括塊到文件的映射關系和文件系統的相關屬性),EditLog和FsImage都存儲在NameNode本地文件系統中。NameNode在內存中保存著元數據和塊映射的快照,當NameNode啟動後或者某個配置項達到閾值時,會從磁碟中讀取EditLog和FsImage,通過EditLog新的記錄更新內存中的FsImage,再講新版本的FsImage刷新到磁碟中,然後截斷EditLog中已經處理的記錄,這個過程就是一個檢查點。檢查點的目的是確保文件系統通過在內存中使用元數據的快照從而持續的觀察元數據的變更並將快照信息存儲到磁碟FsImage中。檢查點通過下面兩個配置參數出發,時間周期(dfs.namenode.checkpoint.period)和文件系統事務數量(dfs.namenode.checkpoint.txns),二者同時配置時,滿足任意一個條件就會觸發檢查點。

    所有的HDFS網路協議都是基於TCP/IP的,客戶端建立一個到NameNode機器的可配置的TCP埠,用於二者之間的交互。DataNode使用DataNode協議和NameNode交互,RPC包裝了客戶端協議和DataNode協議,通過設計,NameNode不會發起RPC,只負責響應來自客戶端或者DataNode的RPC請求。

    HDFS的核心目標是即使在失敗或者錯誤情況下依然能夠保證數據可靠性,三種常見失敗情況包括NameNode故障、DataNode故障和network partitions。

    網路分區可能會導致部分DataNode市區和NameNode的連接,NameNode通過心跳包判斷並將失去連接的DataNode標記為掛掉狀態,於是所有注冊到掛掉DataNode的數據都不可用了,可能會導致部分數據塊的復制數量低於了原本配置的復制系數。NameNode不斷地追蹤哪些需要復制的塊並在必要時候進行復制,觸發條件包含多種情況:DataNode不可用、復制亂碼、硬體磁碟故障或者認為增大負值系數。為了避免DataNode的狀態不穩定導致的復制風暴,標記DataNode掛掉的超時時間設置比較長(默認10min),用戶可以設置更短的時間間隔來標記DataNode為陳舊狀態從而避免在對讀寫性能要求高的請求上使用這些陳舊節點。

    HDFS架構兼容數據各種重新平衡方案,一種方案可以在某個DataNode的空閑空間小於某個閾值時將數據移動到另一個DataNode上;在某個特殊文件突然有高的讀取需求時,一種方式是積極創建額外副本並且平衡集群中的其他數據。這些類型的平衡方案暫時還未實現(不太清楚現有方案是什麼...)。

    存儲設備、網路或者軟體的問題都可能導致從DataNode獲取的數據發生亂碼,HDFS客戶端實現了對文件內容的校驗,客戶端在創建文件時,會計算文件中每個塊的校驗值並存儲到命名空間,當客戶端取回數據後會使用校驗值對每個塊進行校驗,如果存在問題,客戶端就會去另一個DataNode獲取這個塊的副本。

    FsImage和EditLog是HDFS的核心數據結構,他們的錯誤會導致整個HDFS掛掉,因此,NameNode應該支持時刻維持FsImage和EditLog的多分復制文件,它們的任何改變所有文件應該同步更新。另一個選擇是使用 shared storage on NFS 或者 distributed edit log 支持多個NameNode,官方推薦 distributed edit log 。

    快照能夠存儲某一特殊時刻的數據副本,從而支持HDFS在發生錯誤時會滾到上一個穩定版本。

    HDFS的應用場景是大的數據集下,且數據只需要寫一次但是要讀取一到多次並且支持流速讀取數據。一般情況下一個塊大小為128MB,因此一個文件被切割成128MB的大塊,且每個快可能分布在不同的DataNode。

    當客戶端在復制系數是3的條件下寫數據時,NameNode通過目標選擇演算法收到副本要寫入的DataNode的集合,第1個DataNode開始一部分一部分的獲取數據,把每個部分存儲到本地並轉發給第2個DataNode,第2個DataNode同樣的把每個部分存儲到本地並轉發給第3個DataNode,第3個DataNode將數據存儲到本地,這就是管道復制。

    HDFS提供了多種訪問方式,比如 FileSystem Java API 、 C language wrapper for this Java API 和 REST API ,而且還支持瀏覽器直接瀏覽。通過使用 NFS gateway ,客戶端可以在本地文件系統上安裝HDFS。

    HDFS使用目錄和文件的方式管理數據,並提供了叫做 FS shell 的命令行介面,下面有一些簡單的命令:

    DFSAdmin命令集合用於管理HDFS集群,這些命令只有集群管理員可以使用,下面有一些簡單的命令:

正常的HDFS安裝都會配置一個web服務,通過可配的TCP埠對外暴露命名空間,從而使得用戶可以通過web瀏覽器查看文件內容。

如果垃圾回收配置打開,通過FS shell移除的文件不會立刻刪除,而是會移動到一個垃圾文件專用的目錄(/user/<username>/.Trash),類似回收站,只要文件還存在於那個目錄下,則隨時可以被回復。絕大多數最近刪除的文件都被移動到了垃圾目錄(/user/<username>/.Trash/Current),並且HDFS每個一段時間在這個目錄下創建一個檢查點用於刪除已經過期的舊的檢查點,詳情見 expunge command of FS shell 。在垃圾目錄中的文件過期後,NameNode會刪除這個文件,文件刪除會引起這個文件的所有塊的空間空閑,需要注意的是在文件被刪除之後和HDFS的可用空間變多之間會有一些時間延遲(個人認為是垃圾回收機制佔用的時間)。下面是一些簡單的理解刪除文件的例子:

    當文件復制系數減小時,NameNode會選擇多餘的需要刪除的副本,在收到心跳包時將刪除信息發送給DataNode。和上面一樣,這個刪除操作也是需要一些時間後,才能在集群上展現空閑空間的增加。

HDFS Architecture

Ⅵ HDFS 架構

HDFS 涉及兩個重要進程:NameNode、DataNode。
他們一般都部署單獨部署在不同伺服器上,運行 NameNode 的伺服器是主伺服器,運行 DataNode 的伺服器是從伺服器。主伺服器只有一個,從伺服器有多個。
這種一主多從的架構基本適用於所有分布式系統或框架。可重復使用的架構方案叫作架構模式,一主多從可謂是大數據領域的最主要的架構模式。主伺服器只有一台,掌控全局。從伺服器有很多台,負責具體的事情。這樣很多台伺服器可以有效組織起來,對外表現出一個統一又強大的存儲計算能力。

DataNode 負責文件數據的存儲和讀寫操作,HDFS 將文件數據分割成若干數據塊(Block),每個 DataNode 存儲一部分數據塊,這樣文件就分布存儲在整個 HDFS 伺服器集群中。應用程序客戶端(Client)可以並行對這些數據塊進行訪問,從而使得 HDFS 可以在伺服器集群規模上實現數據並行訪問,極大地提高了訪問速度。

在實踐中,HDFS 集群的 DataNode 伺服器會有很多台,一般在幾百台到幾千台這樣的規模,每台伺服器配有數塊磁碟,整個集群的存儲容量大概在幾 PB 到數百 PB。

NameNode 負責整個分布式文件系統的元數據(MetaData)管理,也就是文件路徑名、數據塊的 ID 以及存儲位置等信息,相當於操作系統中文件分配表(FAT)的角色。HDFS 為了保證數據的高可用,會將一個數據塊復制為多份(默認3份),並將多份相同的數據塊存儲在不同的機架的伺服器上。這樣當有磁碟損壞,或者某個 DataNode 伺服器宕機,甚至某個交換機宕機時,系統能通過其備份的數據塊進行查找。

處理客戶端的請求。

客戶端向 HDFS 上傳文件。

客戶端向 HDFS 讀取文件。

像 NameNode 這樣主從伺服器管理同一份數據的場景,如果從伺服器錯誤地以為主伺服器宕機而接管集群管理,會出現主從伺服器一起對 DataNode 發送指令,進而導致集群混亂,也就是所謂的「腦裂」。這也是這類場景選舉主伺服器時,引入 ZooKeeper 的原因。

Ⅶ 什麼是HDFS

HDFS,全稱Hadoop Distributed File System,意思是分布式文件系統。
Hadoop分布式文件系統是指被設計成適合運行在通用硬體(commodity hardware)上的分布式文件系統。

Ⅷ hdfs的元數據持久化觸發的條件是什麼

hdfs的元數據持久化觸發的條件是:

在一個BFC中,垂直方向上,盒子是從包含塊頂部開始一個挨著一個布局的,兩個相鄰的盒子的垂直距離是由margin屬性決定的,在一個BFC中的兩個相鄰的塊級盒子的垂直外邊距會產生塌陷。

在一個BFC中,水平方向上,每個盒子的左邊緣都會接觸包含塊的左邊緣(從右向左的格式則相反)。除非出現浮動元素和其他元素相互作用的情況(當有浮動元素時,行盒可能因浮動元素而收縮,如果有盒子形成了新的BFC,那這個盒子也可能因浮動元素而變窄)。

名位元組點和數據節點

HDFS是一個主從結構,一個HDFS集群是由一個名位元組點,它是一個管理文件命名空間和調節客戶端訪問文件的主伺服器,當然還有一些數據節點,通常是一個節點一個機器,它來管理對應節點的存儲。HDFS對外開放文件命名空間並允許用戶數據以文件形式存儲。

內部機制是將一個文件分割成一個或多個塊,這些塊被存儲在一組數據節點中。名位元組點用來操作文件命名空間的文件或目錄操作,如打開,關閉,重命名等等。

Ⅸ HDFS 為何在大數據領域經久不衰

大數據中最寶貴、最難以代替的就是數據,一切都圍繞數據。

HDFS是最早的大數據存儲系統,存儲著寶貴的數據資產,各種新演算法、框架要想得到廣泛使用,必須支持HDFS,才能獲取已存儲在裡面的數據。所以大數據技術越發展,新技術越多,HDFS得到的支持越多,越離不開HDFS。 HDFS也許不是最好的大數據存儲技術,但依然是最重要的大數據存儲技術

HDFS是如何實現大數據高速、可靠的存儲和訪問的呢?

Hadoop分布式文件系統HDFS的設計目標是管理數以千計的伺服器、數以萬計的磁碟,將大規模的伺服器計算資源當作一個單一存儲系統進行管理,對應用程序提供數以PB計的存儲容量,讓應用程序像使用普通文件系統一樣存儲大規模的文件數據。

文件以多副本的方式進行存儲:

缺點:

優點:

HDFS的大容量存儲和高速訪問的實現。

RAID將數據分片後,在多塊磁碟上並發進行讀寫訪問,提高了存儲容量、加快了訪問速度,並通過數據冗餘校驗提高了數據可靠性,即使某塊磁碟損壞也不會丟數據。將RAID的設計理念擴大到整個分布式伺服器集群,就產生了分布式文件系統,這便是Hadoop分布式文件系統的核心原理。

和RAID在多個磁碟上進行文件存儲及並行讀寫的思路一樣,HDFS是在一個大規模分布式伺服器集群上,對數據分片後進行並行讀寫及冗餘存儲。因為HDFS可部署在一個大的伺服器集群,集群中所有伺服器的磁碟都可供HDFS使用,所以整個HDFS的存儲空間可以達到PB級。

HDFS是主從架構。一個HDFS集群會有一個NameNode(命名節點,簡稱NN),作為主伺服器(master server)。

HDFS公開了文件系統名稱空間,允許用戶將數據存儲在文件中,就好比我們平時使用os中的文件系統一樣,用戶無需關心底層是如何存儲數據的。 在底層,一個文件會被分成一或多個數據塊,這些資料庫塊會被存儲在一組數據節點中。在CDH中數據塊的默認128M。 在NameNode,可執行文件系統的命名空間操作,如打開,關閉,重命名文件等。這也決定了數據塊到數據節點的映射。

HDFS被設計為可運行在普通的廉價機器上,而這些機器通常運行著一個Linux操作系統。一個典型的HDFS集群部署會有一個專門的機器只能運行 NameNode ,而其他集群中的機器各自運行一個 DataNode 實例。雖然一台機器上也可以運行多個節點,但不推薦。

負責文件數據的存儲和讀寫操作,HDFS將文件數據分割成若干數據塊(Block),每個DataNode存儲一部分Block,這樣文件就分布存儲在整個HDFS伺服器集群中。

應用程序客戶端(Client)可並行訪問這些Block,從而使得HDFS可以在伺服器集群規模上實現數據並行訪問,極大提高訪問速度。

HDFS集群的DataNode伺服器會有很多台,一般在幾百台到幾千台,每台伺服器配有數塊磁碟,整個集群的存儲容量大概在幾PB~數百PB。

負責整個分布式文件系統的元數據(MetaData)管理,即文件路徑名、數據塊的ID以及存儲位置等信息,類似os中的文件分配表(FAT)。

HDFS為保證數據高可用,會將一個Block復制為多份(默認3份),並將多份相同的Block存儲在不同伺服器,甚至不同機架。當有磁碟損壞或某個DataNode伺服器宕機,甚至某個交換機宕機,導致其存儲的數據塊不能訪問時,客戶端會查找其備份Block訪問。

HDFS中,一個文件會被拆分為一個或多個數據塊。默認每個數據塊有三個副本,每個副本都存放在不同機器,而且每一個副本都有自己唯一的編號:

文件/users/sameerp/data/part-0的復制備份數設為2,存儲的BlockID分別為1、3:

上述任一台伺服器宕機後,每個數據塊都至少還有一個備份存在,不會影響對文件/users/sameerp/data/part-0的訪問。

和RAID一樣,數據分成若干Block後,存儲到不同伺服器,實現數據大容量存儲,並且不同分片的數據能並行進行讀/寫操作,實現數據的高速訪問。

副本存放:NameNode節點選擇一個DataNode節點去存儲block副本的過程,該過程的策略是在可靠性和讀寫帶寬間權衡。

《Hadoop權威指南》中的默認方式:

Google大數據「三駕馬車」的第一駕是GFS(Google 文件系統),而Hadoop的第一個產品是HDFS,分布式文件存儲是分布式計算的基礎。

這些年來,各種計算框架、各種演算法、各種應用場景不斷推陳出新,但大數據存儲的王者依然是HDFS。

磁碟介質在存儲過程中受環境或者老化影響,其存儲的數據可能會出現錯亂。

HDFS對存儲在DataNode上的數據塊,計算並存儲校驗和(CheckSum)。在讀數據時,重新計算讀取出來的數據的校驗和,校驗不正確就拋異常,應用程序捕獲異常後就到其他DataNode上讀取備份數據。

DataNode監測到本機的某塊磁碟損壞,就將該塊磁碟上存儲的所有BlockID報告給NameNode,NameNode檢查這些數據塊還在哪些DataNode上有備份,通知相應的DataNode伺服器將對應的數據塊復制到其他伺服器上,以保證數據塊的備份數滿足要求。

DataNode會通過心跳和NameNode保持通信,如果DataNode超時未發送心跳,NameNode就會認為這個DataNode已經宕機失效,立即查找這個DataNode上存儲的數據塊有哪些,以及這些數據塊還存儲在哪些伺服器上,隨後通知這些伺服器再復制一份數據塊到其他伺服器上,保證HDFS存儲的數據塊備份數符合用戶設置的數目,即使再出現伺服器宕機,也不會丟失數據。

NameNode是整個HDFS的核心,記錄著HDFS文件分配表信息,所有的文件路徑和數據塊存儲信息都保存在NameNode,如果NameNode故障,整個HDFS系統集群都無法使用;如果NameNode上記錄的數據丟失,整個集群所有DataNode存儲的數據也就沒用了。

所以,NameNode高可用容錯能力非常重要。NameNode採用主從熱備的方式提供高可用服務:

集群部署兩台NameNode伺服器:

兩台伺服器通過Zk選舉,主要是通過爭奪znode鎖資源,決定誰是主伺服器。而DataNode則會向兩個NameNode同時發送心跳數據,但是只有主NameNode才能向DataNode返回控制信息。

正常運行期,主從NameNode之間通過一個共享存儲系統shared edits來同步文件系統的元數據信息。當主NameNode伺服器宕機,從NameNode會通過ZooKeeper升級成為主伺服器,並保證HDFS集群的元數據信息,也就是文件分配表信息完整一致。

軟體系統,性能差點,用戶也許可接受;使用體驗差,也許也能忍受。但若可用性差,經常出故障不可用,就麻煩了;如果出現重要數據丟失,那開發攤上大事。

而分布式系統可能出故障地方又非常多,內存、CPU、主板、磁碟會損壞,伺服器會宕機,網路會中斷,機房會停電,所有這些都可能會引起軟體系統的不可用,甚至數據永久丟失。

所以在設計分布式系統的時候,軟體工程師一定要綳緊可用性這根弦,思考在各種可能的故障情況下,如何保證整個軟體系統依然是可用的。

## 6 保證系統可用性的策略

任何程序、任何數據,都至少要有一個備份,也就是說程序至少要部署到兩台伺服器,數據至少要備份到另一台伺服器上。此外,稍有規模的互聯網企業都會建設多個數據中心,數據中心之間互相進行備份,用戶請求可能會被分發到任何一個數據中心,即所謂的異地多活,在遭遇地域性的重大故障和自然災害的時候,依然保證應用的高可用。

當要訪問的程序或者數據無法訪問時,需要將訪問請求轉移到備份的程序或者數據所在的伺服器上,這也就是 失效轉移 。失效轉移你應該注意的是失效的鑒定,像NameNode這樣主從伺服器管理同一份數據的場景,如果從伺服器錯誤地以為主伺服器宕機而接管集群管理,會出現主從伺服器一起對DataNode發送指令,進而導致集群混亂,也就是所謂的「腦裂」。這也是這類場景選舉主伺服器時,引入ZooKeeper的原因。ZooKeeper的工作原理,我將會在後面專門分析。

當大量的用戶請求或者數據處理請求到達的時候,由於計算資源有限,可能無法處理如此大量的請求,進而導致資源耗盡,系統崩潰。這種情況下,可以拒絕部分請求,即進行 限流 ;也可以關閉部分功能,降低資源消耗,即進行 降級 。限流是互聯網應用的常備功能,因為超出負載能力的訪問流量在何時會突然到來,你根本無法預料,所以必須提前做好准備,當遇到突發高峰流量時,就可以立即啟動限流。而降級通常是為可預知的場景准備的,比如電商的「雙十一」促銷,為了保障促銷活動期間應用的核心功能能夠正常運行,比如下單功能,可以對系統進行降級處理,關閉部分非重要功能,比如商品評價功能。

HDFS是如何通過大規模分布式伺服器集群實現數據的大容量、高速、可靠存儲、訪問的。

1.文件數據以數據塊的方式進行切分,數據塊可以存儲在集群任意DataNode伺服器上,所以HDFS存儲的文件可以非常大,一個文件理論上可以占據整個HDFS伺服器集群上的所有磁碟,實現了大容量存儲。

2.HDFS一般的訪問模式是通過MapRece程序在計算時讀取,MapRece對輸入數據進行分片讀取,通常一個分片就是一個數據塊,每個數據塊分配一個計算進程,這樣就可以同時啟動很多進程對一個HDFS文件的多個數據塊進行並發訪問,從而實現數據的高速訪問。關於MapRece的具體處理過程,我們會在專欄後面詳細討論。

3.DataNode存儲的數據塊會進行復制,使每個數據塊在集群里有多個備份,保證了數據的可靠性,並通過一系列的故障容錯手段實現HDFS系統中主要組件的高可用,進而保證數據和整個系統的高可用。

Ⅹ HDFS由什麼組成

大數據平台包含了採集層、存儲層、計算層和應用層,是一個復雜的IT系統,需要學會Hadoop等分布式系統的開發技能。
1.1採集層:Sqoop可用來採集導入傳統關系型資料庫的數據、Flume對於日誌型數據採集,另外使用Python一類的語言開發網路爬蟲獲取網路數據;
1.2儲存層:分布式文件系統HDFS最為常用;採用了主從(Master/Slave)結構模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理文件系統的命名空間和客戶端對文件的訪問操作;集群中的DataNode管理存儲的數據。
1.3計算層:有不同的計算框架可以選擇,常見的如MapRece、Spark等,一般來講,如果能使用計算框架的「原生語言」,運算效率會最高(MapRece的原生支持Java,而Spark原生支持Scala);
1.4應用層:包括結果數據的可視化、交互界面開發以及應用管理工具的開發等,更多的用到Java、Python等通用IT開發前端、後端的能力;

熱點內容
堅果策劃商品腳本這么寫 發布:2023-01-30 22:03:29 瀏覽:66
銅陵編程貓 發布:2023-01-30 22:02:33 瀏覽:600
qq郵箱忘記獨立密碼了怎麼辦 發布:2023-01-30 22:02:24 瀏覽:743
資料庫uml 發布:2023-01-30 22:00:33 瀏覽:244
運營寫腳本 發布:2023-01-30 21:58:58 瀏覽:811
醫生無刪減ftp 發布:2023-01-30 21:58:11 瀏覽:718
dsw文件編譯軟體 發布:2023-01-30 21:55:45 瀏覽:928
安卓怎麼開啟位置 發布:2023-01-30 21:53:45 瀏覽:476
上傳作業的傳 發布:2023-01-30 21:50:57 瀏覽:866
資料庫表的外鍵 發布:2023-01-30 21:41:30 瀏覽:588