干貨:如何將Hadoop存儲容量提升4倍?
在Hadoop 1.0中,HDFS的單NameNode設(shè)計帶來諸多問題,包括單點故障、內(nèi)存受限制約集群擴展性和缺乏隔離機制(不同業(yè)務(wù)使用同一個NameNode導(dǎo)致業(yè)務(wù)相互影響)等。為了解決這些問題,Hadoop 2.0就引入了基于共享存儲的HA解決方案和HDFS Federation,HDFS Federation是指HDFS集群可同時存在多個NameNode,這些NameNode分別管理一部分?jǐn)?shù)據(jù),且共享所有DataNode存儲資源。
Apache Hadoop分布式文件系統(tǒng)(HDFS)具有高度可擴展性,可支持PB級群集。但是,整個命名空間(文件系統(tǒng)元數(shù)據(jù))存儲在內(nèi)存中。因此,即使存儲可以水平擴展,命名空間也只能垂直擴展,它受限于單個NameNode進程可存儲的文件、塊和目錄的數(shù)量。
本文主要介紹如何通過Federation使用多個獨立的Namenodes/Namespaces水平擴展命名空間。Namenodes彼此獨立,互不通信,可以共享相同的Datanode存儲。Federation和Namespaces可以為整個集群提供可伸縮性,F(xiàn)ederation增加了對Namespace水平擴展的支持;添加更多的NameNode,增加集群的聚合讀/寫能力和吞吐量;用戶和應(yīng)用程序可以通過Namenodes隔離。
1、示例
Federation在可伸縮性、性能和隔離方面的優(yōu)勢為它創(chuàng)建了許多用例,本文僅列舉一些簡單示例。
1.1 HIVE ON FEDERATION
Hive將表數(shù)據(jù)組織到分區(qū)中以提高查詢性能,它將分區(qū)存儲在不同的位置,這為在不同命名空間中存儲、管理和配置hive數(shù)據(jù)提供了機會。使用federated集群,我們可以將不同的表存儲在不同的命名空間,或者將同一個表的不同分區(qū)存儲在不同的命名空間。
例如,我們可以將不經(jīng)常訪問的數(shù)據(jù)歸檔存儲到單獨的命名空間,并將當(dāng)前頻繁使用的數(shù)據(jù)保存在單獨的命名空間,這將提高服務(wù)于當(dāng)前數(shù)據(jù)命名空間的性能效率,并減少負(fù)載。
假設(shè)我們一年有一個分區(qū)hive表,我們希望將2000年以后的所有數(shù)據(jù)存儲在一個命名空間中,將其余數(shù)據(jù)存儲在一個命名空間中,這就可以通過federation實現(xiàn)。
下圖顯示了 NSI中Students 表year=‘2018’分區(qū)下的數(shù)據(jù)。

如果想在NS2中存儲1990年的記錄,我們必須改變表格以將其位置設(shè)置為NS2。
- hive> ALTER TABLE Students SET LOCATION ‘hdfs://ns2/user/hive/warehouse/student’;
將表的位置更改為新命名空間NS2之后,我們可以將數(shù)據(jù)插入到所需的分區(qū)中,現(xiàn)在將在NS2中創(chuàng)建分區(qū)。

我們可以在同一個查詢中執(zhí)行跨越不同命名空間的多個分區(qū)操作。例如,表上的“SELECT *”將從不同命名空間的分區(qū)返回記錄。

下圖顯示了在nameservice NS1(在node-1上運行的namenode)中存儲的2007和2018年的hive分區(qū)數(shù)據(jù)。

1990年的歸檔數(shù)據(jù)存儲在NS2中(namenode在node-3上運行),如下所示:

1.2 應(yīng)用程序隔離
假設(shè)我們需要運行一個較龐大的應(yīng)用程序,它可能會占用Namenode上的大量資源,這很可能導(dǎo)致其他應(yīng)用程序延遲。通過federation,我們可以將這些應(yīng)用程序移動到不同的命名空間。
2. AMBARI概述
Ambari中的federated集群視圖如下所示,這兩個服務(wù)將各自具有相應(yīng)的組件和度量信息。其他組件(如Datanodes和Journalnodes)將由這兩個服務(wù)共享。 如下所述,啟用federated所需的所有配置更改都由Ambari自動完成。

3.配置更改
要啟用federated并在集群中具有多個命名空間,需要在hdfs-site.xml中進行一些配置更改。 如果使用Ambari安裝federated集群,則會自動設(shè)置以下配置。但是,學(xué)會如何通過頁面配置federated是有幫助的,以下是具有兩個Nameservices集群的示例- NS1和NS2。
3.1 NAMESERVICEIDS
使用逗號分隔的NameserviceID列表將此配置添加到hdfs-site.xml。
- <property>
- <name>dfs.nameservices</name>
- <value>ns1,ns2</value>
- </property>
3.2 NAMENODEIDS
對于具有HA設(shè)置的Nameservice,我們需要為屬于該Nameservice的Namenode指定NamenodeID。這是通過將NamenodeID列表添加到與名稱服務(wù)ID一起使用的密鑰dfs.ha.namenodessuffixed中來完成的。
- <property>
- <name>dfs.ha.namenodes.ns1</name>
- <value>nn1,nn2</value></property>
- <property>
- <name>dfs.ha.namenodes.ns2</name>
- <value>nn3,nn4</value>
- </property>
3.3 RPC ADDRESSES
應(yīng)使用配置密鑰為集群中的每個Namenode配置RPC和Service-RPC地址 - dfs.namenode.rpc-address和dfs.namenode.servicerpc-address(可選)。這是通過使用NameserviceID和NamenodeID為config鍵添加后綴來完成的。
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn1</name>
- <value>node-1.example.com:8020</value>
- </property>
- <property>
- <name>dfs.namenode.servicerpc-address.ns1.nn1</name>
- <value>node-1.example.com:8040</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.ns1.nn2</name>
- <value>node-2.example.com:8020</value>
- </property>
- <property>
- <name>dfs.namenode.servicerpc-address.ns1.nn2</name>
- <value>node-2.example.com:8040</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.ns2.nn3</name>
- <value>node-3.example.com:8020</value>
- </property>
- <property>
- <name>dfs.namenode.servicerpc-address.ns2.nn3</name>
- <value>node-3.example.com:8040</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.ns2.nn4</name>
- <value>node-4.example.com:8020</value>
- </property>
- <property>
- <name>dfs.namenode.servicerpc-address.ns2.nn4</name>
- <value>node-4.example.com:8040</value>
- </property>
3.4 HTTP地址
HTTP和HTTPS地址(dfs.namenode.http-address和dfs.namenode.https-address)是可選參數(shù),可以配置為類似于RPC地址。
- <property>
- <name>dfs.namenode.http-address.ns1.nn1</name>
- <value>node-1.example.com:50070</value>
- </property>
- <property>
- <name>dfs.namenode.https-address.ns1.nn1</name>
- <value>node-1.example.com:50072</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.ns1.nn2</name>
- <value>node-2.example.com:50070</value>
- </property>
- <property>
- <name>dfs.namenode.https-address.ns1.nn2</name>
- <value>node-2.example.com:50072</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.ns2.nn3</name>
- <value>node-3.example.com:50070</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.ns2.nn4</name>
- <value>node-4.example.com:50070</value>
- </property>
3.5 其他NAMESERVICE特定密鑰
通過使用NameserviceID后綴鍵名,可以為每個名稱服務(wù)配置以下鍵:
- dfs.namenode.keytab.file
- dfs.namenode.name.dir
- dfs.namenode.edits.dir
- dfs.namenode.checkpoint.dir
- dfs.namenode.checkpoint.edits.dir
- dfs.secondary.namenode.keytab.file
- dfs.namenode.backup.address
4.集群設(shè)置
federated集群中的所有Namenode應(yīng)具有相同的clusterID,應(yīng)使用以下命令格式化一個namenode,選擇唯一的clusterID,使其不與環(huán)境中的其他集群沖突。如果未提供clusterID,則會自動生成唯一ID。
- [hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId ]
集群中的所有其他名稱節(jié)點必須使用與第一個namenode相同的clusterID進行格式化。
- [hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId
如果向現(xiàn)有集群添加新名稱服務(wù),則應(yīng)使用與現(xiàn)有名稱節(jié)點相同的clusterID格式化新名稱節(jié)點,可以從Namenode中的VERSION文件檢索clusterID。