天天看點

下一代大資料存儲Ozone,是否可以替代hdfs?

作者:大資料推薦雜談

HDFS是業界預設的大資料存儲系統,在業界的大資料叢集中有非常廣泛的使用。HDFS叢集有着很高的穩定性且易擴充得益于它較簡單的架構,但包含幾千個節點,儲存上百比特(PB)資料的叢集也不鮮見。我們簡單來回顧一下HDFS的架構,如圖1所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖1 HDFS架構

HDFS通過把檔案系統中繼資料全部加載到資料節點Namenode記憶體中,給用戶端提供了低延遲的中繼資料通路。由于中繼資料需要全部加載到記憶體,是以一個HDFS叢集能支援的最大檔案數,受Java堆記憶體的限制,上限大概是4億~5億個檔案。是以HDFS适合大量大檔案[幾百兆位元組(MB)以上]的叢集,如果叢集中有非常多的小檔案,HDFS的中繼資料通路性能會受到影響。雖然可以通過各種Federation技術來擴充叢集的節點規模,但單個HDFS叢集仍然沒法很好地解決小檔案的限制。

基于這些背景,Hadoop社群推出了新的分布式存儲系統Ozone。Ozone能夠輕松管理小檔案和大檔案,是一個分布式Key-Value對象存儲系統。

01基本概念

對象存儲是一種資料存儲,每個資料單元存儲為離散單元(稱為對象)。對象可以是任何類型、任何大小的資料。語義上,對象存儲中的所有對象都存儲在單個平面位址空間中,沒有檔案系統的層次結構。實作中,為了支援多使用者及使用者隔離,更好地管理和使用對象,通常對象存儲也會在平面的位址空間中劃分出幾個層次。這些層次是由對象存儲的實作确定的,每個層次都有特定的語義,使用者不能更改。

Ozone的對象層次分三個層次,從上到下依次是Volume(卷),Bucket(存儲桶)和Object(對象),如圖2所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖2 Ozone的對象層次

1、Volume(卷)

Volume類似Amazon S3中使用者賬戶的概念,是使用者的Home目錄。Volume隻有系統管理者才可以建立,是存儲管理的機關,比如配額管理。Ozone建議系統管理者為每個使用者都單獨建立獨立的Volume。Volume用來存儲Bucket,目前一個Volume下面可以包含任意多個Bucket。

2、Bucket(存儲桶)

存儲桶是對象的容器,概念類似于S3的Bucket,或者Azure中的Container。存儲桶建立于Volume下,隻能屬于一個Volume,建立後歸屬關系不可更改,也不支援更改存儲桶的名字。Amazon S3的存儲桶名稱是全局唯一的,并且命名空間由所有AWS賬戶共享。這意味着,在建立存儲桶之後,任何AWS區域中的其他AWS賬戶均不能使用該存儲桶的名稱,直至删除該存儲桶。在Ozone中,存儲桶名稱隻需要確定在本Volume内部是唯一的。不同的Volume可以建立名稱相同的存儲桶。

3、Object(對象)

對象存儲在存儲桶中,是鍵+值的存儲。鍵是對象的名稱,值是對象的内容。對象的名稱在所屬存儲桶中必須是唯一的。對象有自己的中繼資料,包括值的大小、建立時間、最後一次修改時間、備份數、通路控制清單ACL等。對象的大小沒有限制。

Ozone支援URL以虛拟主機方式的通路Ozone的對象。它采用如下格式:

[scheme][bucket.volume.server:port]/key

其中,scheme可以選:1)o3fs,通過RPC協定通路Ozone。2)HTTP/HTTPS,通過HTTP協定通路Ozone REST API。當scheme省略時,預設使用RPC協定。server:port是Ozone Manager的位址。如果沒有指定,則使用叢集的配置檔案ozone-site.xml中“ozone.om.address”值。如果配置檔案中也沒有定義,則預設使用“localhost:9862”。

02技術架構

Ozone技術構架分為三個部分:Ozone Manager,統一的中繼資料管理;Storage Container Manager,資料塊配置設定和資料節點管理;Datanode,資料節點,資料的最終存放處,如圖3所示。類比HDFS的架構,可以看到原來的Namenode的功能,現在由Ozone Manager和Storage Container Manage分别進行管理。對象中繼資料空間和資料分布分開管理,有利于兩者的獨立按需擴充,避免之前Namenode單節點的壓力。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖3 Ozone技術構架

Ozone主要子產品和功能如下。

1、Ozone Manager(OM)

Ozone Manager是管理Ozone的命名空間,提供所有的Volume(卷)、Bucket(存儲桶)和Key(鍵)的建立、更新和删除操作。它存儲了Ozone的中繼資料資訊,這些中繼資料資訊包括Volumes、Buckets和Keys,底層通過RATIS(實作了RAFT協定)擴充中繼資料的副本數來實作中繼資料的HA。Ozone Manager隻和Ozone Client和Storage Container Manager通信,并不直接和Datanode通信。Ozone Manager将命名空間的中繼資料存儲在RocksDB中,避免了HDFS中需要将所有中繼資料都保留在記憶體,進而經常會受到小檔案問題的困擾。RocksDB是Facebook基于LevelDB開發的一個本地Key-Value存儲引擎,尤其對于SSD有很多的優化和改進,提供高吞吐量的讀寫操作。

2、Storage Container Manager(SCM)

SCM類似HDFS中的Block Manager,管理Container,寫Pipelines和Datanode,為Ozone Manager提供Block和Container的操作和資訊。SCM也監聽Datanode發來的心跳資訊,作為Datanode Manager的角色,保證和維護叢集所需的資料備援級别。SCM和Ozone Client之間沒有通信。

3、Block、Container和Pipeline

Block是資料塊對象,真實存儲使用者的資料。Container中的一條記錄是一個Block的資訊,每個Block在Container裡面有且僅有一條記錄,如圖4所示,在Ozone中,資料是以Container為粒度進行副本複制的。SCM中目前支援2種Pipeline方式,由單Datanode節點組成的Standalone讀Pipeline,和由三個Datanode節點組成的Apache RATIS寫Pipeline。Container有2種狀态,OPEN和CLOSED。當一個Container是OPEN狀态時,可以往裡面寫入新的Block。當一個Container達到它預定的大小時(預設5GB),它從OPEN狀态轉換成CLOSED狀态。一個Closed Container是不可修改的。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖4 Datanode Container内部結構

由三個Datanode節點組成的Apache RATIS寫Pipeline,保證資料一旦落盤,後續總能讀到最新的資料,資料是強一緻的,并且每份資料有3個備份,不用擔心由于單個磁盤故障導緻的資料丢失,如圖5所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖5 RATIS寫Pipeline

4、Datanode

Datanode是Ozone的資料節點,以Container為基本存儲單元維護每個Container内部的資料映射關系,并定時向SCM發送心跳節點、彙報節點的資訊、管理Container的資訊和Pipeline的資訊。當一個Container大小超過預定大小的90%時或者寫操作失敗時,Datanode會發送Container Close指令給SCM,把Container的狀态從OPEN轉變成CLOSED。或者當Pipeline出錯時,發送Pipeline Close指令給SCM,把Pipeline從OPEN狀态轉為CLOSED狀态。

5、分層管理

Ozone分層結構使得Ozone Manager、Storage Container Manager和Datanode可按需獨立擴充。對于Ozone提供的語義,也是分層管理的,如圖6所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖6 Ozone語義與對應的管理子產品

6、對象建立

當Ozone Client(用戶端)需要建立并且寫入一個新對象時,用戶端需要和Ozone Manager和Datanode直接打交道,具體過程如圖7所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖7 建立Ozone新對象

1)Ozone用戶端連結Ozone Manager,提供需要建立的對象資訊,包括對象的名稱、資料的大小、備份數和其他使用者自定義的對象屬性。

2)Ozone Manager收到Ozone用戶端的請求後,和SCM通信,請求SCM尋找能夠容納資料的處于OPEN狀态的Container,然後在找到的Container中配置設定足夠數量的Block。

3)SCM将新對象資料将要寫入的Container、Block和Container所在的Pipeline的三個Datanode的資訊清單傳回給Ozone Manager。

4)Ozone Manager将收到SCM傳回的資訊,傳回給用戶端。

5)用戶端得到Datanode清單資訊之後,和第一個Datanode(Raft Pipeline Leader)建立通信,将資料寫入Datanode的Container。

6)用戶端完成資料寫入後,連接配接Ozone Manager,确認資料已經更新完成,Ozone Manager更新對象的中繼資料,記錄對象資料所在的Container和Block的資訊。

至此,新的對象建立完成。之後,其他的用戶端就可以通路這個對象了。

7、對象讀取

對象讀取的過程相對簡單,類似于HDFS的檔案讀,如圖8所示。

下一代大資料存儲Ozone,是否可以替代hdfs?

▲圖8 讀取Ozone對象

1)Ozone Client(用戶端)和Ozone Manager通信,制定要讀取的對象Key (/volume/bucket/key)。

2)Ozone Manager在中繼資料庫中查找對應的對象,傳回對象資料所在的Container和Block資訊,包括Container所在的Datanode清單資訊給Ozone Client(用戶端)。

3)Ozone支援Data locality。如果Ozone Client(用戶端)運作在叢集中的某個節點上,Ozone Manager會傳回按照網絡拓撲距離排序的Datanode清單。Ozone Client(用戶端)可以選擇第一個Datanode節點(本地節點),也是離Client(用戶端)最近的節點來讀取資料,節省資料讀取的網絡傳輸時間。