Apache Ozone0.4.0調研

爲什麼有Ozone

對象存儲比標準文件系統更容易構建和使用。 縮放對象庫也更容易。 大多數大數據應用程序和框架(如Apache Spark,YARN和Hive)都可以在雲端和本地運行,這使得在本地存儲對象存儲非常具有吸引力。衆所周知,HDFS是大數據存儲系統,並在業界得到了廣泛的使用。但是無論大集羣還是小集羣其擴展性都受NN的限制,雖然HDFS可以通過Federation進行擴展,但是依然深受小文件和4億個文件的困擾

於是分佈式key-value存儲系統Ozone誕生了,Ozone能夠輕鬆管理小文件和大文件。

Ozone

Ozone是專爲大數據應用程序設計的對象庫。大數據工作負載往往與標準工作負載非常不同,Ozone源自在數千個集羣中運行Hadoop的經驗教訓。Hadoop生態中的其它組件如Spark、Hive和Yarn可以直接運行在Ozone之上。Ozone的使用方式也較爲豐富,可以通過命令行直接使用也有java客戶端接口,而且接口支持RPC和REST。

Ozone由volumes、buckets和Keys組成,其中

     Volumes只有管理員能夠創建和刪除,類似賬號的概念,管理員一般都是給某個團隊或者組織創建一個Volume。

     Buckets有點像目錄,不過這個只能有一層,因爲Buckets中不能包含其它Buckets。Buckets是在Volume下,一個Volume可以包含n個Buckets,但是Buckets下面只能是Keys。

     Keys就是具體的對象,在Buckets中是唯一的,其名字可以是任意字符串,其值就是需要存儲的數據,也就是具體的文件。目前ozone對key的大小沒有限制,bucket可以包含n個keys。

Ozone設計特點:

   SCALABLE(可擴展性):Ozone可擴展到數百億個文件和塊,並在未來甚至更多。

   CONSISTENT(一致性):Ozone是一個非常一致的對象存儲。 通過使用諸如RAFT之類的協議來實現這種一致性。

   SECURE(安全):Ozone與kerberos基礎設施集成,用於訪問控制,並支持TDE和線上加密。

   MULTI-PROTOCOL SUPPORT(多協議支持):Ozone支持不同的協議,如S3和Hadoop文件系統API

   HIGHLY AVAILABLE(高可用性):Ozone是一個完全複製的系統,旨在經受多次故障。

   Interoperability with Hadoop Ecosystem:Ozone的設計適用於YARN和Kubernetes等集裝箱化環境;Ozone可以被現存的Hadoop生態和相關的應用(如 apache hive、apache spark 和傳統的 mapreduce)使用,因此Ozone支持: Hadoop Compatible FileSystem API(也叫OzoneFS) – hive、spark等可以使用OzoneFS API Ozone作爲存儲層,而不需要做任務修改。

Ozone對Apach Spark支持:

如果你有一個基於Spark的應用程序,並且您希望它與Ozone一起使用。如果您當前的存儲系統是HDFS,那麼您將使用以hdfs://開頭的URL將數據位置傳遞給您的應用程序。如果用03fs代替hdfs://://應用程序將開始使用臭氧桶中的數據。

Ozone對S3應用程序的支持:

zone支持S3協議作爲一流的接口。因此,你可以使用現有的基於S3的應用程序並更改S3服務器地址。但如果你的S3服務器是安全的,同時你有一個安全的Ozone集羣請通過運行“kinit”登錄,並通過運行“ozone s3 getsecret”請求臭氧aws憑證。此命令將向Ozone管理器顯示您的Kerberos憑據,Ozone管理器將返回您可以放入.aws文件的訪問密鑰ID和祕密訪問密鑰。如果未打開安全性,則可以在這些字段中放置任何內容,因爲不會在服務器端強制執行安全性。

架構:

下面是Ozone在發行第一個版本時的架構圖:

在架構上Ozone由三部分組成,分別爲Ozone ManagerStorage Container ManagerDatanodes。架構圖如下:

Ozone Manager(OM):

OzoneManager是一個server服務,主要負責Ozone的namespace,記錄所有的volume, bucket和key操作。有點類似HDFS的namenode ,Ozone由volumes、buckets和Keys組成,其中每個volume是一個namespace的根節點(與HDFS不同,HDFS只提供了一個根節點),所以整個Ozone namespace是一個volumes的集合或者是一個由類似HDFS那樣的樹節點組成的森林。OM中也存儲了Ozone的一些元數據信息,這些元數據信息包括volumes、buckets和keys,底層通過Ratis擴展元數據的副本數來實現HA。

Storage Container Manager(SCM):

類似HDFS中的block manager,是Ozone中一個非常重要的組件,用來管理container的,爲OM提供基於block和container的服務。container是由一些block組成的集合,這些block相互之間沒有關係。SCM和數據節點協同工作以維護羣集所需的複製級別

關於SCM的作用通過一個使用實例來說明下 – 由客戶端調用putKey(keyName, data, pipeline type, replication count)發起一個putKey操作,

參數說明keyName是指文件的名字。data是指要寫入的數據。pipeline type指block的副本策略,Ozone目前支持Stand Alone和Ratis兩種策略。replication count是指block有多少個副本一般情況下pipeline type和replication count不用指定,直接使用默認的就行。

整個流程爲:OM收到putKey請求,向SCM發送一個請求,請求一個包含特定屬性的pipeline實例。例如客戶端要求Ratis存儲策略並且副本數是3,則OM請求SCM返回一個滿足此特性的datanode set。如果SCM能夠實例化這樣一個pipeline(也就是一個datanode set),則將這些dn返回給OM。OM則存儲這些信息並將此信息包裝成一個元組{BlockID, ContainerName, and Pipeline}。**這裏也有點類似HDFS寫流程。如果SCM並沒有找到一組datanode set來滿足clinet的要求則SCM創建一個邏輯管道,然後返回它**

從上面的調用過程中可以看出OM與SCM的關係,SCM作爲block manager。當client向OM請求datanode set寫數據數據時,OM需要向SCM請求block。block從SCM以pipeline的形式返回,此時pipeline是由參與block副本的一組datanode。

SCM主要用來管理blocks、containers和pipelines,爲了返回正常可用的pipelines,SCM必須找到node的健康狀態,所以SCM也會監聽datanode發來的心態,扮演着datanode manager的角色。

  SCM內部結構爲:

   

lock:block數據塊對象,真實存儲數據的對象,可以擁有多個副本塊。

Container:在邏輯上存儲的是Block塊對象集合。

Pipeline:SCM允許2種Pipeline方式實現多副本:單副本的Standaline模式和多副本的Ratis方式。

Pool:一組特定的數據節點稱爲一個pool。將節點按pool分組是爲了方便日常的維護升級操作,也是爲了擴展性的考慮。

Node:物理存儲數據的地方。

Datanodes:

如果是基於HDFS部署的Ozone也就是Ozone數據節點功能以插件的功能運行在HDFS的datanode中,則就指HDFS的datanode。Ozone也可以單獨部署,此時指運行Ozone數據節點的守護進程。DataNode中以Container基本存儲單元。

Ozone Client:

Ozone client在Ozone內部是一個對外開放使用的模塊,比如說Ozone相關的shell命令會觸發到ozone client,這就是圖中顯示的Ozone Cli。

Rest Handler:

Rest Handle是一個鉤子,能夠做到RPC和Restful通信方式的一鍵切換。Ozone client能夠支持2種方式的通信:RPC方式和Restful接口的方式。

Freon:

Freon是Ozone內部的性能測試工具。

OzoneFileSysyem:

Ozone爲了兼容其它框架體系,根據自身獨特的數據特點,實現了文件系統接口,稱爲OzoneFileSystem。這樣的話,用戶可以以通用的方式來使用Ozone內部的文件對象。在程序上無需做兼容性的改動。

Hadoop Distributed Data Store:

上面的架構圖中只剩下Hadoop Distributed Data Store沒有介紹了,其實Hadoop Distributed Data Store(HDDS)是由Containers、Ratis和SCM組成的,是一個沒有全局命名空間的分佈式塊存儲層。

 

Ozone部署(這裏描述均是單節點部署,如果是集羣部署只需要吧節點名稱添加到$OZONE_HOME/etc/hadoop/worker並複製該節點配置到其他節點,同時保證集羣節點間均已配置ssh免祕鑰登錄):

1,從官網下載Ozone0.4.0並解壓到相關安裝目錄(/home/hadoop/app/);http://mirror.bit.edu.cn/apache/hadoop/ozone/ozone-0.4.0-alpha/hadoop-ozone-0.4.0-alpha.tar.gz 

爲了方便將解壓出來的目錄ozone-0.4.0-alpha重命名爲ozone;即Ozone的家目錄爲:/home/hadoop/app/ozone

2,利用Ozone的命令生成conf文件,ozone genconf ./etc/hadoop,此命令會生成ozone-site.xml文件,修改配置之後link到Hadoop3.1配置文件目錄的$HADOOP_HOME/etc/hadoop/目錄中。

配置文件內容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
 <property>
 <name>ozone.enabled</name>
 <value>true</value>
 <tag>OZONE, REQUIRED</tag>
 <description>
 Status of the Ozone Object Storage service is enabled.
 Set to true to enable Ozone.
 Set to false to disable Ozone.
 Unless this value is set to true, Ozone services will not be started in
 the cluster.

 Please note: By default ozone is disabled on a hadoop cluster.
 </description>
 </property>
 <property>
 <name>ozone.om.address</name>
 <value>localhost:5678</value>
 <tag>OM, REQUIRED</tag>
 <description>
 The address of the Ozone OM service. This allows clients to discover
 the address of the OM.
 </description>
 </property>
 <property>
 <name>ozone.metadata.dirs</name>
 <value>/opt/hadoop/ozone</value>
 <tag>OZONE, OM, SCM, CONTAINER, REQUIRED, STORAGE</tag>
 <description>
 Ozone metadata is shared among OM, which acts as the namespace
 manager for ozone, SCM which acts as the block manager and data nodes
 which maintain the name of the key(Key Name and BlockIDs). This
 replicated and distributed metadata store is maintained under the
 directory pointed by this key. Since metadata can be I/O intensive, at
 least on OM and SCM we recommend having SSDs. If you have the luxury
 of mapping this path to SSDs on all machines in the cluster, that will
 be excellent.

 If Ratis metadata directories are not specified, Ratis server will emit a
 warning and use this path for storing its metadata too.
 </description>
 </property>
 <property>
 <name>ozone.scm.client.address</name>
 <value>localhost</value>
 <tag>OZONE, SCM, REQUIRED</tag>
 <description>
 The address of the Ozone SCM client service. This is a required setting.

 It is a string in the host:port format. The port number is optional
 and defaults to 9860.
 </description>
 </property>
 <property>
 <name>ozone.scm.names</name>
 <value>localhost</value>
 <tag>OZONE, REQUIRED</tag>
 <description>
 The value of this property is a set of DNS | DNS:PORT | IP
 Address | IP:PORT. Written as a comma separated string. e.g. scm1,
 scm2:8020, 7.7.7.7:7777.
 This property allows datanodes to discover where SCM is, so that
 datanodes can send heartbeat to SCM.
 </description>
 </property>
 <property>
 <name>ozone.replication</name>
 <value>1</value>
 </property>

</configuration>

3,此時就可以啓動相關的服務了,要先啓動scm再啓動om,而且在第一次啓動的時候要先初始化,命令如下:

cd /home/hadoop/app/ozone

bin/ozone scm --init
bin/ozone --daemon start scm
bin/ozone om --init
bin/ozone --daemon start om

如果已經初始化完成,以後啓動可以執行啓動腳本:

sbin/start-ozone.sh

一切正常就可以在OM的UI上查看信息,OM默認端口上9874,地址爲http://omserver:9874/

Hadoop支持o3fs文件系統:

1,先安裝hadoop,hadoop的安裝部署這裏不做說明

2,先按Ozone部署方式部署好Ozone(不啓動);

3,將Ozone的ozone-site.xml配置文件link到$HADOOP_HOME/etc/hadoop/。命令如下:

ln -s  /home/hadoop/app/ozone/etc/hadoop/ozone-site.xml /home/hadoop/app/hadoop/etc/hadoop/

4,在$HADOOP_HOME/etc/hadoop/core-site.xml中添加如下內容:

<property>
  <name>fs.o3fs.impl</name>
  <value>org.apache.hadoop.fs.ozone.OzoneFileSystem</value>
</property>

5,在$HADOOP_HOME/etc/hadoop/hadoop-env.sh中添加對應的classpath:

export HADOOP_CLASSPATH=/home/hadoop/app/ozone/share/ozone/lib/hadoop-ozone-filesystem-lib-current-0.4.0-alpha.jar:$HADOOP_CLASSPATH

6,重啓hadoop

7,啓動Ozone相關服務;

8,驗證:

創建一個Volume:

 

ozone sh volume create /volume

在Volume下創建一個Buket:

ozone sh bucket create /volume/bucket

此時可以就可以通過hadoop相關命令使用o3fs協議查看到Ozone對應/volume/bucket下的keyle:

hdfs dfs -ls o3fs://bucket.volume.om-host.example.com:5678/

或者

hdfs dfs -ls o3fs://bucket.volume/

注意:

ozone/lib/下有兩個hadoop-ozone-filesystem-lib包,其中hadoop-ozone-filesystem-lib-current-0.4.0-alpha.jar是對應3.0以上的高版本hadoop, hadoop-ozone-filesystem-lib-legacy-0.4.0-alpha.jar對應3.0以下hadoop版本。

針對hadoop3.x 需要使用hadoop-ozone-filesystem-lib-current-0.4.0-alpha.jar,對應類名:org.apache.hadoop.fs.ozone.OzoneFileSystem

針對hadoop2.x 需要使用hadoop, hadoop-ozone-filesystem-lib-legacy-0.4.0-alpha.jar,對應類名:org.apache.hadoop.fs.ozone.BasicOzoneFileSystem

Hadoop Version

Required jar

OzoneFileSystem implementation

3.2 filesystem-lib-current org.apache.hadoop.fs.ozone.OzoneFileSystem
3.1 filesystem-lib-legacy org.apache.hadoop.fs.ozone.OzoneFileSystem
2.9 filesystem-lib-legacy org.apache.hadoop.fs.ozone.BasicOzoneFileSystem
2.7 filesystem-lib-legacy org.apache.hadoop.fs.ozone.BasicOzoneFileSystem

 

Ozone結合Hadoop3.x 安裝部署:

Ozone與HDFS結合的話需要基於Hadoop3.0以上,所以需要先部署Hadoop3.x,具體部署細節在此略去不做說明。

1,先按 “Hadoop支持o3fs文件系統” 方式部署好Ozone;

2,將Ozone的相關內容link到Hadoop的home目錄。命令如下:

 

ln -s /home/hadoop/app/ozone/libexec/ozone-config.sh /home/hadoop/app/hadoop/libexec/
ln -s /home/hadoop/app/ozone/share/ozone /home/hadoop/app/hadoop/share/
ln -s /home/hadoop/app/ozone/share/hadoop/ozoneplugin /home/hadoop/app/hadoop/share/hadoop/

3,在 /home/hadoop/app/ozone/etc/hadoop/hadoop-env.sh聲明環境變量:

export HADOOP_HOME=/home/hadoop/app/hadoop

4,在hadoop的配置文件hdfs-site.xml中添加如下內容:

 

<property>
 <name>dfs.datanode.plugins</name>
 <value>org.apache.hadoop.ozone.HddsDatanodeService</value>
</property>

5,此時就可以啓動相關的服務了,首先啓動namenode和datanode,命令爲$HADOOP_HOME/sbin/start-dfs.sh

其次啓動scm和om,要先啓動scm再啓動om,而且在第一次啓動的時候要先初始化,命令如下:

cd /home/hadoop/app/ozone

bin/ozone scm --init
bin/ozone --daemon start scm
bin/ozone om --init
bin/ozone --daemon start om

如果已經初始化完成,以後啓動可以執行啓動腳本:

sbin/start-ozone.sh

6,驗證

使用hadoop fs -ls 命令和使用 ozone fs -ls 命令查看到的結果一樣,即表示ozone已經成功運行在hadoop之上了。

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