乾貨:如何通過Federation將Hadoop儲存容量提升4倍?

趙鈺瑩發表於2018-07-27

在Hadoop 1.0中,HDFS的單NameNode設計帶來諸多問題,包括單點故障、記憶體受限制約叢集擴充套件性和缺乏隔離機制(不同業務使用同一個NameNode導致業務相互影響)等。為了解決這些問題,Hadoop 2.0就引入了基於共享儲存的HA解決方案和HDFS Federation,HDFS Federation是指HDFS叢集可同時存在多個NameNode,這些NameNode分別管理一部分資料,且共享所有DataNode儲存資源。

Apache Hadoop分散式檔案系統(HDFS)具有高度可擴充套件性,可支援PB級群集。但是,整個名稱空間(檔案系統後設資料)儲存在記憶體中。因此,即使儲存可以水平擴充套件,名稱空間也只能垂直擴充套件,它受限於單個NameNode程式可儲存的檔案、塊和目錄的數量。

本文主要介紹如何通過Federation使用多個獨立的Namenodes/Namespaces水平擴充套件名稱空間。Namenodes彼此獨立,互不通訊,可以共享相同的Datanode儲存。Federation和Namespaces可以為整個叢集提供可伸縮性,Federation增加了對Namespace水平擴充套件的支援;新增更多的NameNode,增加叢集的聚合讀/寫能力和吞吐量;使用者和應用程式可以通過Namenodes隔離。

1、示例

Federation在可伸縮性、效能和隔離方面的優勢為它建立了許多用例,本文僅列舉一些簡單示例。

1.1 HIVE ON FEDERATION

Hive將表資料組織到分割槽中以提高查詢效能,它將分割槽儲存在不同的位置,這為在不同名稱空間中儲存、管理和配置hive資料提供了機會。使用federated叢集,我們可以將不同的表儲存在不同的名稱空間,或者將同一個表的不同分割槽儲存在不同的名稱空間。

例如,我們可以將不經常訪問的資料歸檔儲存到單獨的名稱空間,並將當前頻繁使用的資料儲存在單獨的名稱空間,這將提高服務於當前資料名稱空間的效能效率,並減少負載。

假設我們一年有一個分割槽hive表,我們希望將2000年以後的所有資料儲存在一個名稱空間中,將其餘資料儲存在一個名稱空間中,這就可以通過federation實現。

下圖顯示了 NSI中Students 表year=‘2018’分割槽下的資料。 

如果想在NS2中儲存1990年的記錄,我們必須改變表格以將其位置設定為NS2。 

hive> ALTER TABLE Students SET LOCATION ‘hdfs://ns2/user/hive/warehouse/student’;

將表的位置更改為新名稱空間NS2之後,我們可以將資料插入到所需的分割槽中,現在將在NS2中建立分割槽。 

我們可以在同一個查詢中執行跨越不同名稱空間的多個分割槽操作。例如,表上的“SELECT *”將從不同名稱空間的分割槽返回記錄。 

下圖顯示了在nameservice NS1(在node-1上執行的namenode)中儲存的2007和2018年的hive分割槽資料。 

1990年的歸檔資料儲存在NS2中(namenode在node-3上執行),如下所示:

1.2 應用程式隔離

假設我們需要執行一個較龐大的應用程式,它可能會佔用Namenode上的大量資源,這很可能導致其他應用程式延遲。通過federation,我們可以將這些應用程式移動到不同的名稱空間。

2. AMBARI概述

Ambari中的federated叢集檢視如下所示,這兩個服務將各自具有相應的元件和度量資訊。其他元件(如Datanodes和Journalnodes)將由這兩個服務共享。 如下所述,啟用federated所需的所有配置更改都由Ambari自動完成。 

3.配置更改

要啟用federated並在叢集中具有多個名稱空間,需要在hdfs-site.xml中進行一些配置更改。 如果使用Ambari安裝federated叢集,則會自動設定以下配置。但是,學會如何通過頁面配置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設定的Nameservice,我們需要為屬於該Nameservice的Namenode指定NamenodeID。這是通過將NamenodeID列表新增到與名稱服務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

應使用配置金鑰為叢集中的每個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)是可選引數,可以配置為類似於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字尾鍵名,可以為每個名稱服務配置以下鍵:

·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.叢集設定

federated叢集中的所有Namenode應具有相同的clusterID,應使用以下命令格式化一個namenode,選擇唯一的clusterID,使其不與環境中的其他叢集衝突。如果未提供clusterID,則會自動生成唯一ID。

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <clusterID>]

叢集中的所有其他名稱節點必須使用與第一個namenode相同的clusterID進行格式化。

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <clusterID>

如果向現有叢集新增新名稱服務,則應使用與現有名稱節點相同的clusterID格式化新名稱節點,可以從Namenode中的VERSION檔案檢索clusterID。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2168504/,如需轉載,請註明出處,否則將追究法律責任。

相關文章