天天看點

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

大資料技術原理與應用——大資料存儲與管理

1.分布式檔案系統

(1)計算機叢集結構

叢集的概念

叢集是指将多台伺服器整合在一起,每台伺服器都實作相同的業務,做相同的事情。

每台伺服器并不是缺一不可,它存在的作用主要是:

  緩解并發壓力、提升計算性能

  單點故障轉移問題

傳統版叢集結構示意

1.傳統叢集使用多個處理器和專用進階硬體的并行化處理裝置

2.緊密/集中構造

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

阿姆達爾定律——并行度和可擴充性關系

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
普通版計算機叢集結構

普及化的計算機叢集,都是由普通硬體構成的,硬體成本上低、使用和開發的門檻降低 - 互相之間分散——是以也稱分布式

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(2)分布式檔案系統結構

分布式計算機系統

業務分工和總體協調

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料存儲的解決途徑

集中擴充模式

通過檔案系統管理、存儲資料

資訊爆炸時代擷取的資料成指數倍的增長,單純通過增加硬碟個數來擴充計算機檔案系統的存儲容量的方式/以及專用的存儲系統

分散存儲組合 - 分布式

檔案系統管理的實體存儲資源不一定直接連接配接在本地節點上,而是通過計算機網絡與節點(可簡單的了解為一台計算機)相連,通過多節點…

解決存儲和管理難題:

将固定于某個地點的某個檔案系統,擴充到任意多個地點/多個檔案系統,衆多的節點組成一個檔案系統網絡。

每個節點可以分布在不同的地點,通過網絡進行節點間的通信和資料傳輸。

人們在使用分布式檔案系統時,無需關心資料是存儲在哪個節點上、或者是從哪個節點擷取的,隻需要像使用本地檔案系統一樣管理和存儲檔案系統中的資料。

常見的分布式檔案系統
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
HDFS叢集系統的檔案系統

總體的檔案是通過某一種機制分布在各個計算機上:節點。這些節點分為兩類:一類叫“主節點”(Master Node)或者也被稱為“名稱節點”(NameNode),另一類叫“從節點”(Slave Node)或者也被稱為“資料節點”(DataNode)

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

2.HDFS簡介

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

總體而言,HDFS要實作以下目标:

  相容廉價的硬體裝置

  流資料讀寫

  大資料集

  簡單的檔案模型

  強大的跨平台相容性

HDFS特殊的設計,在實作上述優良特性的同時,也使得自身具有一些應用局限性,主要包括以下幾個方面:

  不适合低延遲資料通路

  無法高效率存儲大量小檔案

  不支援多使用者寫入及任意修改檔案

3.HDFS的相關概念

(1)塊

HDFS預設一個塊 64MB/128M,一個檔案被分成多個塊,以塊作為存儲機關

塊的大小遠遠大于普通檔案系統,可以最小化尋址開銷

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

HDFS采用抽象的塊概念可以帶來以下幾個明顯的好處:

1)支援大規模檔案存儲:檔案以塊為機關進行存儲,一個大規模檔案可以被分拆成若幹個檔案塊,不同的檔案塊可以被分發到不同的節點上,是以,一個檔案的大小不會受到單個節點的存儲容量的限制,可以遠遠大于網絡中任意節點的存儲容量。

2)簡化系統設計:首先,大大簡化了存儲管理,因為檔案塊大小是固定的,這樣就可以很容易計算出一個節點可以存儲多少檔案塊;其次,友善了中繼資料的管理,中繼資料不需要和檔案塊一起存儲,可以由其他系統負責管理中繼資料。

3)适合資料備份:每個檔案塊都可以備援存儲到多個節點上,大大提高了系統的容錯性和可用性。

(2)名稱節點和資料節點

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
HDFS主要元件的功能
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
名稱節點的資料結構

在HDFS中,名稱節點(NameNode)負責管理分布式檔案系統的命名空間(Namespace),儲存了兩個核心的資料結構,即 FsImage 和 EditLog

  FsImage 用于維護檔案系統樹以及檔案樹中所有的檔案和檔案夾的中繼資料

  記錄檔檔案 EditLog 中記錄了所有針對檔案的建立、删除、重命名等操作

名稱節點記錄了每個檔案中各個塊所在的資料節點的位置資訊

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

FsImage檔案

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

FsImage 檔案包含檔案系統中所有目錄和檔案 inode 的序列化形式。每個 inode 是一個檔案或目錄的中繼資料的内部形式,并包含此類資訊:檔案的複制等級、修改和通路時間、通路權限、塊大小以及組成檔案的塊。對于目錄,則存儲修改時間、權限和配額中繼資料。

FsImage 檔案沒有記錄檔案包含哪些塊以及每個塊存儲在哪個資料節點。而是由名稱節點把這些映射資訊保留在記憶體中,當資料節點加入 HDFS 叢集時,資料節點會把自己所包含的塊清單告知給名稱節點,此後會定期執行這種告知操作,以確定名稱節點的塊映射是最新的。

名稱節點的啟動

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

在名稱節點啟動的時候,它會将 FsImage 檔案中的内容加載到記憶體中,之後再執行 EditLog 檔案中的各項操作,使得記憶體中的中繼資料和實際的同步,存在記憶體中的中繼資料支援用戶端的讀操作。

一旦在記憶體中成功建立檔案系統中繼資料的映射,則建立一個新的 FsImage 檔案和一個空的 EditLog 檔案

名稱節點起來之後,HDFS 中的更新操作會重新寫到 EditLog 檔案中,因為 FsImage 檔案一般都很大(GB 級别的很常見),如果所有的更新操作都往 FsImage 檔案中添加,這樣會導緻系統運作的十分緩慢,但是,如果往 EditLog 檔案裡面寫就不會這樣,因為 EditLog 要小很多。每次執行操作之後,且在向用戶端發送成功代碼之前,edits 檔案都需要同步更新。

名稱節點運作期間 EditLog 不斷變大的問題

在名稱節點運作期間,HDFS 的所有更新操作都是直接寫到 EditLog 中,久而久之,EditLog 檔案将會變得很大

雖然這對名稱節點運作時候是沒有什麼明顯影響的,但是,當名稱節點重新開機的時候,名稱節點需要先将 FsImage 裡面的所有内容映像到記憶體中,然後再一條一條地執行 EditLog 中的記錄,當 EditLog 檔案非常大的時候,會導緻名稱節點啟動操作非常慢,而在這段時間内 HDFS 系統處于安全模式,一直無法對外提供寫操作,影響了使用者的使用

如何解決?

答案是:SecondaryNameNode 第二名稱節點

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

第二名稱節點 是 HDFS 架構中的一個組成部分,它是用來儲存名稱節點中對 HDFS 中繼資料資訊的備份,并減少名稱節點重新開機的時間。SecondaryNameNode 一般是單獨運作在一台機器上

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
資料節點(DataNode)

資料節點是分布式檔案系統 HDFS 的工作節點,負責資料的存儲和讀取,會根據用戶端或者是名稱節點的排程來進行資料的存儲和檢索,并且向名稱節點定期發送自己所存儲的塊的清單。

每個資料節點中的資料會被儲存在各自節點的本地 Linux 檔案系統中。

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

4.HDFS 體系結構

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(1)HDFS 體系結構概述

HDFS 采用了主從(Master/Slave)結構模型,一個 HDFS 叢集包括一個名稱節點(NameNode)和若幹個資料節點(DataNode)。名稱節點作為中心伺服器,負責管理檔案系統的命名空間及用戶端對檔案的通路。叢集中的資料節點一般是一個節點運作一個資料節點程序,負責處理檔案系統用戶端的讀/寫請求,在名稱節點的統一排程下進行資料庫塊的建立、删除和複制等操作。每個資料節點的資料實際上是儲存在本地 Linux 檔案系統中的。

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(2)HDFS 命名空間管理

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

HDFS 的命名空間包含 目錄、檔案和塊

在 HDFS1.0體系結構中,在整個 HDFS 叢集中隻有一個命名空間,并且隻有唯一一個名稱節點,該節點負責對這個命名空間進行管理

HDFS 使用的是傳統的 分級檔案體系,是以,使用者可以 像使用普通檔案系統一樣,建立、删除目錄和檔案,在目錄間轉移檔案,重命名檔案等。

(3)通信協定

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

HDFS 是一個部署在叢集上的分布式檔案系統,是以,很多資料需要通過網絡進行傳輸

所有的 HDFS 通信協定都是建構在 TCP/IP 協定基礎之上的

用戶端通過一個可配置的端口向名稱節點主動發起 TCP 連接配接,并使用用戶端協定與名稱節點進行互動

名稱節點和資料節點之間則使用資料節點協定進行互動

用戶端與資料節點的互動是通過 RPC(Remote Procedure Call)來實作的。在設計上,名稱節點不會主動發起 RPC,而是響應來自用戶端和資料節點的 RPC 請求。

(4)用戶端

用戶端是使用者操作 HDFS 最常用的方式,HDFS 在部署時都提供了用戶端

HDFS用戶端是一個庫,暴露了 HDFS 檔案系統接口,這些接口隐藏了 HDFS 實作中的大部分複雜性

嚴格來說,用戶端并不算是 HDFS 的一部分

用戶端可以支援打開、讀取、寫入等常見的操作,并且提供了類似 Shell 的指令行方式來通路 HDFS 中的資料

此外,HDFS 也提供了 Java API,作為應用程式通路檔案系統的用戶端程式設計接口

(5)HDFS 體系結構的局限性

HDFS 隻設定唯一一個名稱節點,這樣做雖然大大簡化了系統設計,但也帶來了一些明顯的局限性,具體如下:

1)**命名空間的限制:**名稱節點是儲存在記憶體中的,是以,名稱節點能夠容納的對象(檔案、塊)的個數會受到記憶體空間大小的限制。

2)**性能的瓶頸:**整個分布式檔案系統的吞吐量,受限于單個名稱節點的吞吐量。

3)**隔離問題:**由于叢集中隻有一個名稱節點,隻有一個命名空間,是以,無法對不同應用程式進行隔離。

4)**叢集的可用性:**一旦這個唯一的名稱節點發生故障,會導緻整個叢集變得不可用。

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

5.HDFS 存儲原理

(1)備援資料儲存

作為一個分布式檔案系統,為了保證系統的容錯性和可用性,HDFS 采用了多副本方式對資料進行備援存儲,通常一個資料塊的多個副本會被分布到不同的資料節點上,如圖所示,資料塊 1 被分别存放到資料節點 A 和 C 上,資料塊 2 被存放在資料節點 A 和 B 上。這種多副本方式具有以下幾個優點:

1)加快資料傳輸速度

2)容易檢查資料錯誤

3)保證資料可靠性

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(2)資料存儲政策

資料存放

第一個副本,放置在上傳檔案的資料節點;如果是叢集外送出,則随機挑選一台磁盤不太滿、CPU不太忙的節點

第二個副本:放置在與第一個副本不同的機架的節點上

第三個副本:與第一個副本相同機架的其他節點上

更多副本:随機節點

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
資料讀取

HDFS 提供了一個 API 可以确定一個資料節點所屬的機架 ID,用戶端也可以調用 API 擷取自己所屬的機架 ID

當用戶端讀取資料時,從名稱節點獲得資料塊不同副本的存放位置清單,清單中包含了副本所在的資料節點,可以調用 API 來确定用戶端和這些資料節點所屬的機架 ID,當發現某個資料塊副本對應的機架 ID 和用戶端對應的機架 ID 相同時,就優先選擇該副本讀取資料,如果沒有發現,就随機選擇一個副本讀取資料

(3)資料錯誤與恢複

HDFS 具有較高的容錯性,可以相容廉價的硬體,它把硬體出錯看作一種常态,而不是異常,并設計了相應的機制檢測資料錯誤和進行自動恢複,主要包括了一下幾種情形:名稱節點出錯、資料節點出錯和資料出錯。

名稱節點出錯
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

名稱節點儲存了所有的中繼資料資訊,其中,最核心的兩大資料結構是 FsImage 和 Editlog,如果這兩個檔案發生損壞,那麼整個 HDFS 執行個體将失效。是以,HDFS 設定了備份機制,把這些核心檔案同步複制到備份伺服器 SecondaryNameNode 上。當名稱節點出錯時,就可以根據備份伺服器 SecondaryNameNode 中的 FsImage 和 Editlog 資料進行恢複。

資料節點出錯
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

每個資料節點會定期向名稱節點發送“心跳”資訊,向名稱節點報告自己的狀态

當資料節點發生故障,或者網絡發生斷網時,名稱節點就無法收到來自一些資料節點的心跳資訊,這時,這些資料節點就會被标記為“當機”,節點上面的所有資料都會被标記為“不可讀”,名稱節點不會再給它們發送任何 I/O 請求

這時,有可能出現一種情況,即由于一些資料節點的不可用,會導緻一些資料塊的副本數量小于備援因子

名稱節點會定期檢查這種情況,一旦發現某個資料塊的副本數量小于備援因子,就會啟動資料備援複制,為它生成新的副本

HDFS 和其他分布式檔案系統的最大差別就是可以調整備援資料的位置

資料出錯
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

網絡傳輸和磁盤錯誤等因素,都會造成資料錯誤

用戶端在讀取到資料後,會采用 md5 和 sha1 對資料塊進行校驗,以确定讀取到正确的資料

在檔案被建立時,用戶端就會對每一個檔案塊進行資訊摘錄,并把這些資訊寫入到同一個路徑的隐藏檔案裡面

當用戶端讀取檔案的時候,會先讀取該資訊檔案,然後,利用該資訊檔案對每個讀取的資料塊進行校驗,如果校驗出錯,用戶端就會請求到另外一個資料節點讀取該檔案塊,并且向名稱節點報告這個檔案塊有錯誤,名稱節點會定期檢查并且重新複制這個塊

6.HDFS 資料讀寫過程

讀取檔案
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
寫入檔案
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

FileSystem 是一個通用檔案系統的抽象基類,可以被分布式檔案系統繼承,所有可能使用 Hadoop 檔案系統的代碼,都要使用這個類

Hadoop 為 FileSystem 這個抽象類提供了多種具體實作

DistributedFileSystem 就是 FileSystem 在 HDFS 檔案系統中的具體實作

FileSystem 的 open() 方法傳回的是一個輸入流 FSDataInputStream 對象,在 HDFS 檔案系統中,具體的輸入流就是 DFSInputStream;FileSystem 中的 create() 方法傳回的是一個輸出流 FSDataOutputStream 對象,在 HDFS 檔案系統中,具體的輸出流就是 DFSOutputStream。

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(1)讀資料的過程

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(2)寫資料的過程

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

7.HDFS 程式設計實踐

Hadoop 提供了關于 HDFS 在 Linux 作業系統上進行檔案操作的常用 Shell 指令以及 Java API 。同時還可以利用 Web 界面檢視和管理 Hadoop 檔案系統

備注:Hadoop 安裝成功後,已經包含 HDFS 和 MapReduce,不需要額外安裝。而 HBase 等其他元件,則需要另外下載下傳安裝。

在學習 HDFS 程式設計實踐前,我們需要啟動 Hadoop 。執行如下指令:

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(1)HDFS 常用指令

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理
大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(2)HDFS 的 Web 界面

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

(3)HDFS 常用 Java API 及應用執行個體

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理

本章小結

大資料技術原理與應用——大資料存儲與管理大資料技術原理與應用——大資料存儲與管理