第29講:大數據平台的硬件規划、網絡調優、架構設計、節點規划
高俊峰(南非螞蟻)
這一課時,我將向你介紹 Hadoop 大數據平台的硬件選型、網絡方面的架構設計和存儲規划等內容。
大數據平台硬件選型
要對 Hadoop 大數據平台進行硬件選型,首先需要了解 Hadoop 的運行架構以及每個角色的功能。在一個典型的 Hadoop 架構中,通常有 5 個角色,分別是 NameNode、Standby NameNode、ResourceManager、NodeManager、DataNode 以及外圍機。
其中 NameNode 負責協調集群上的數據存儲,Standby NameNode 屬於 NameNode 的熱備份,ResourceManager 負責協調計算分析,這三者屬於管理角色,一般部署在獨立的服務器上。
而 NodeManager 和 DataNode 角色主要用於計算和存儲,為了獲得更好的性能,通常將 NodeManager 和 DataNode 部署在一起。
1.對 NameNode、ResourceManager 及其 Standby NameNode 節點硬件配置
由於角色的不同,以及部署位置的差別,對硬件的需求也不相同,推薦對 NameNode、ResourceManager 及其 Standby NameNode 節點選擇統一的硬件配置,基礎配置推薦如下表所示:
|
硬件
|
配置
|
|
CPU
|
推薦 2 路 8 核、2 路 10 核或 2 路 12 核等,主頻至少 2~2.5GHz
|
|
內存
|
推薦 64~256GB
|
|
磁盤
|
分為 2 組,即系統盤和數據盤,系統盤 2T*2,做 raid1;數據盤 2-4T 左右,數據盤的數量取決於你想冗余備份元數據的份數
|
|
網卡
|
萬兆網卡(光纖卡)
|
|
電源
|
均配置冗余電源
|
對於 CPU,可根據資金預算,選擇 8 核、10 核或者 12 核。
對於內存,常用的計算公式是集群中 100 萬個塊(HDFS blocks)對應 NameNode 需要 1GB 內存,如果你的集群規模在 100 台以內,NameNode 服務器的內存配置一般選擇 128GB 即可。
由於 NameNode 以及 Standby NameNode 兩個節點需要存儲 HDFS 的元數據,所以需要配置數據盤,數據盤建議至少配置 4 塊,每兩塊做 raid1,做兩組 raid1;然后將元數據分別鏡像存儲到這兩個 raid1 磁盤組中。而對於 ResourceManager,由於不需要存儲重要數據,因而,數據盤可不配置。
網絡方面,為了不讓網絡傳輸成為瓶頸,建議配備光纖接口網卡,節點之間帶寬要保證在 10GB左右。
最后,主機電源推薦都是用雙電源,雖然有一些費電,但可保證這些重要節點的穩定性,不至於出現電源故障直接宕機的情況。
2.對 NodeManager、DataNode 節點服務器硬件配置
下面再說下企業通用和主流的 NodeManager、DataNode 節點服務器硬件配置,如下表所示:
|
硬件
|
配置
|
|
CPU
|
推薦 2 路 10 核、2 路 12 核或 2 路 14 核等,主頻至少 2~2.5GHz
|
|
內存
|
推薦 64~512GB
|
|
磁盤
|
分為 2 組,系統盤和數據盤,系統盤 2T*2,做 raid1;數據盤 4~8T 左右,數據盤單盤使用,無須做 raid
|
|
網卡
|
萬兆網卡(光纖卡),存儲越多,網絡吞吐就要求越高
|
|
電源
|
最好配置冗余電源,如預算不足,也可使用單電源
|
由於 NodeManager、DataNode 主要用於計算和存儲,所以對 CPU 性能要求會比較高,推薦 2 路 14 核。
內存方面,如果分布式計算中涉及 Spark、HBase 組件,那么建議配置大內存,每個節點 256GB 內存是個不錯的配置。
磁盤方面,DataNode 節點主要用來存儲數據,所以需要配置大量磁盤,磁盤單盤使用,無須做 raid,磁盤大小推薦每塊 8T。不建議使用更大的單盤,當然如果有條件,也可采購 SSD 磁盤,但是 SSD 磁盤成本太高,需要根據預算來定。
每個 DataNode 建議配置 8 ~ 10 塊硬盤,具體數量,需要根據總共需要的存儲空間而定。例如,假設總共需要存儲 800TB 的數據,HDFS 的塊副本數為 3,如果每個 DataNode 配置 10 塊 8T 的硬盤,那么,采購 30 台 DataNode 服務器即可。NodeManager 節點也會存儲一些分析任務的中間結果以及日志等臨時數據,建議這些數據的存儲路徑和 HDFS 的數據存儲路徑分開,單獨規划 3~5 塊 4~8T 磁盤來存儲這些臨時數據即可,同理,這些磁盤也無須做 raid,單盤使用即可。
在網絡方面,也建議 NodeManager 和 DataNode 采購光纖接口網卡,所有 NodeManager、DataNode 節點連接到光纖交換機,保證節點之間 10GB 高速網絡傳輸。
最后,在電源方面,可根據預算,決定是否采購雙電源,在集群模式下,NodeManager 或 DataNode 某個節點故障對 Hadoop 影響不大,所以使用單電源也是可行的。
大數據平台網絡架構設計
1.Hadoop 基礎網絡架構
普通的 Hadoop 網絡一般由兩層結構組成:接入交換機和匯聚交換機(或者核心交換機),在具體布線上采用 TOR 方式,在一個 42U 的標准服務器機櫃的最上面安裝接入交換機,每個服務器的光纖網口都接入到機櫃上部的光交換機上,這個接入交換機再通過光纖,接入到網絡機櫃的匯聚或核心交換機上。
基本架構如下圖所示:

在上圖中,列出了三個機櫃,在每個機櫃上有兩個 10GE 的 TOR 交換機,這兩個交換機為主、備模式,然后這些主、被交換機在通過光纖接入到上層的 100GE 匯聚交換機上。這種部署默認可以最大限度地保證網絡的傳輸質量和穩定性。
在每個機櫃中都可部署相應的 Hadoop 服務,可以看出,機櫃 1 和 2 分別部署了 NameNode 的主、被節點,這兩個主、備節點分開部署到不同的機櫃,可以最大限度保證 NameNode 的可靠性,不建議將主、備節點部署到同一個機櫃中,因為如果某個機櫃發生故障(電源故障、網絡故障),那么主、備將失去存在的意義。
同理,ResourceManager 節點也部署了主、備的 HA 功能,這兩個節點也不能在一個機櫃中,這是一個基本常識。此外,在每個機櫃中,都分布着 NodeManager 和 DataNode 節點,並且這兩個服務是部署在一起的。
此外,在三個機櫃中,還有 Hadoop gateway 節點,這些節點相當於用戶與 Hadoop 的交互接口,通過這些節點提交任務到 Hadoop 集群中,通常這些節點也可以有多個,建議分布在多個機櫃中。
2.Hadoop 機架感知機制
所謂機架感知就是自動了解 Hadoop 集群中每個機器節點所屬的機架,某個 Datanode 節點是屬於哪個機櫃並非智能感知的,而是需要 Hadoop 的管理者人為地告知 Hadoop 哪台機器屬於哪個機櫃。
這樣在 Hadoop 的 Namenode 啟動初始化時,會將這些機器與機櫃的對應信息保存在內存中,用來作為 HDFS 寫數據塊操作分配 Datanode 列表時(比如 3 個 block 對應三台 Datanode)選擇 DataNode 的策略。
比如,要寫三個數據塊到對應的三台 Datanode,那么通過機架感知策略,可以盡量將三個副本分布到不同的機櫃上。
默認情況下,Hadoop 的機架感知功能沒有啟用。所以,通常情況下,Hadoop 集群的 HDFS 在選機器時,是隨機選擇的,這在某些情況下會影響 HDFS 讀寫性能,進而影響作業的性能以至於整個集群的服務。
而在開啟了機架感知后,不同節點之間的通信能夠盡量發生在同一個機架之內,而不是跨機架,同時,為了提高容錯能力,Namenode 節點會盡可能把數據塊的副本放到多個機架上,進而提升數據的安全性。
要查看當前集群機架配置情況,可執行如下命令:
[hadoop@namenodemaster conf]$ hdfs dfsadmin -printTopology
Rack: /default-rack
172.16.213.103:9866 (slave002)
172.16.213.169:9866 (slave003)
172.16.213.70:9866 (slave001)
可以看到默認所有節點都是一個機架 default-rack,此時沒有配置機架感知。要配置機架感知,首先需要自定義機器機架位置,編寫機架配置文件 rack.data,內容如下:
172.16.213.103 slave002 /switch1/rack2
172.16.213.70 slave001 /switch1/rack1
172.16.213.169 slave003 /switch1/rack3
這里將三個節點分別放到三個不同的機櫃中。
然后還需要配置一個機架感知腳本,假定腳本名稱為 rack.sh,內容如下:
#!/bin/bash
HADOOP_CONF=/etc/hadoop/conf/
while [ $# -gt 0 ] ;
do
nodeArg=$1
exec<${HADOOP_CONF}/rack.data
result=""
while read line
do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]
then
result="${ar[2]}"
fi
done
shift
if [ -z "$result" ]
then
echo -n "/default-rack"
else
echo -n "$result"
fi
done
將此腳本放大 Hadoop 配置文件目錄下即可,並授予可執行權限。
最后一步,還需要修改 core-site.xml 文件,添加機架感知腳本,添加如下內容:
<property>
<name>net.topology.script.file.name</name>
<value>/etc/hadoop/conf/rack.sh</value>
</property>
配置完成后,需要重啟 NameNode 服務,配置才能生效。
重啟服務后,要驗證機架感知配置是否生效,可執行如下命令:
[hadoop@namenodemaster conf]$ hdfs dfsadmin -printTopology
Rack: /switch1/rack1
172.16.213.70:9866 (slave001)
Rack: /switch1/rack2
172.16.213.103:9866 (slave002)
Rack: /switch1/rack3
172.16.213.169:9866 (slave003)
可以看出,HDFS 的機架感知配置已經成功。
3.大數據平台架構設計要點
在構建大數據平台之前,首先要考慮需要的存儲容量、計算能力、是否有實時分析的需求、數據的存儲周期等因素,然后再根據這些需求進行平台的架構設計。
同時,還要考慮平台的健壯性,例如,任意一個節點宕機都不會影響平台的正常使用,任何一個磁盤的損壞都不會導致數據丟失等。
針對 Hadoop 大數據平台的基礎架構,最基本的要求是保證 NameNode、ResourceManager 這些管理節點的高可用性,因此這些節點必須要做 HA。
此外,為了保障 HDFS 數據的安全性,對 Hadoop 塊存儲一定要設置合適的副本數。例如,設置 3 個副本,那么集群中任意 2 個 datanode 節點故障宕機,都不會丟失數據。
在網絡方面,建議每個節點的服務器采用雙網卡綁定,網絡設置為冗余模式,並和交換機做冗余綁定,做到單個網卡故障或者單個交換機故障,都能保證此節點網絡正常運行。
下面是一個典型的 Hadoop 大數據平台部署拓撲,如下圖所示:

從圖中可以看出,NameNode、ResourceManager 節點都部署了高可用功能,任何一個節點故障都不會影響集群的存儲和計算。此外,DataNode 節點可根據存儲周期、存儲容量、計算任務數進行擴容和縮容,並且擴容、縮容可在線直接進行,不影響集群運行。
此外,在 Hadoop 集群之外,還要跟 Hadoop 配合的一些外圍應用,例如 ambari,用來自動化運維、監控 Hadoop 集群,Hadoop gateway 用於和 Hadoop 集群的交互接口,而 DNS server 和 NTP server 主要用於 Hadoop 集群內部的主機名解析與時間同步。Zookeeper Server 用於 Hadoop 集群中的仲裁和協調調度。
大數據平台存儲、計算節點規划
對大數據平台存儲和計算資源的規划,需要根據實際應用需求判斷,例如,現有的和日增長的數據量、數據的存儲周期、每天計算任務的中間結果數據量,以及數據冗余空間,比如保持幾個副本等實際應用需求。
我以一個實際案例舉例說明:目前有數據量 500TB,每天數據量增長 2T 左右,數據塊副本為 3,所有數據存儲周期為 2 年,根據這個需求,就可以算出需要的存儲節點數。
-
2 年數據量需要的存儲空間:(2*3)*(365*2)=4380TB
-
總共需要的存儲空間:4380TB+(500*3)TB=5880TB
如果以一個存儲節點 12 塊 4T 硬盤來計算,則需要約(5880TB/48TB=147)123 個存儲節點;而如果采用一個存儲節點 10 塊 8T 硬盤來計算,需要約(5880TB/80TB=147)74 個存儲節點即可。
那么此時如何選擇每個節點硬盤的大小呢?這就要看大數據平台需要的計算資源有多少了,很顯然,按照 4T 硬盤 12 塊來規划的話,可獲得更多的計算資源(CPU、內存),但此方案需要采購 123 台服務器,成本較高;反之,如果采用 10塊 8T 硬盤來規划的話,那么只需要 74 台服務器即可,此時可計算 74 台服務器是否能滿足計算資源的要求,如果能滿足,那么這個磁盤規划就是最合適的。
對於計算資源規划,要看都運行哪些應用,如果是 Spark、HBase、ElasticSearch 這類吃內存的大數據組件,那么建議計算節點所選的服務器的內存一定要大,最好 64GB 起,能有 128GB 更好。由於前期對計算資源需求很難評估,所以可根據上面這個原則去配置 CPU 和內存即可,如果遇到計算性能瓶頸,可以在后期進行水平擴展,非常方便。
大數據平台對硬件的規划原則: 如果能夠確切地知道存儲和計算的資源需要,那么就按照這個需求來配置即可;但如果無法准確地評估出存儲和計算資源需求量,那么一定要留下可擴展的余地,比如留下足夠的機櫃位置、網絡接口、磁盤接口等。在實際應用中,存儲容量一般很好預估,但計算資源很難預估,因此留下足夠的擴展接口,是必須要考慮的一個問題。
總結
本課時主要介紹了 Hadoop 大數據平台的硬件選項、網絡方面的架構設計和存儲規划等內容。其中如何對大數據平台做好存儲、計算等資源的規划,至關重要,它也是運維大數據平台的第一步,如果前期規划不當,到后期發現架構不合理,那么需要修改或者擴展將非常困難,所以這部分內容需要你反復練習揣摩。
