1.1 HDFS存儲機制
HDFS是Hadoop分佈式計算中的數據存儲系統。在HDFS中,文件的讀寫過程就是client和NameNode以及DataNode一起交互的過程。NameNode管理着文件系統的元數據,DataNode存儲的是實際的數據,那麼client就會聯繫NameNode以獲取文件的元數據,而真正的文件讀取操作是直接和DataNode進行交互的。所以存儲過程大致如下:
Client要向集羣中寫入數據,首先詢問NameNode,NameNode告知客戶端向哪DataNode寫入數據,在往DataNode寫入數據的同時,DataNode與NameNode保持心跳,如果DataNode在執行任務失敗,NameNode會通過心跳機制得知DataNode死掉,將重新分配新的任務到其他的DataNode,架構圖如下圖所示。
HDFS的副本放置車策略遵循以下幾點(最優副本數爲3):
1) 第一副本:放置在上傳文件DataNode,如果是集羣外提交,由NameNode選擇一臺磁盤不太滿,cpu不太忙的節點。
2) 第二副本:放置在於第一副本不同的機架的節點上。
3)第三副本:與第二個副本相同集羣的節點。
4)其他副本則隨機選取節點。
1.2 測試數據
測試環境:linux 3.10.0-229.el7.x86_64
網絡帶寬:實測35MB/S-40MB/S
機器內存:32GB
硬盤空間:1T
硬盤IO:實測300MB/S
HADOOP版本:2.6
JDK版本:1.8
以下所有測試客戶端和集羣節點都不在同一臺機器上,單個測試文件大小爲100M。
僞分佈式測試結果:
集羣節點數(個) |
副本數(個) |
客戶端數量(個) |
平均速度(MB/S) |
吞吐量(MB/S) |
1 |
1 |
1 |
31 |
31 |
1 |
1 |
2 |
18 |
36 |
1 |
1 |
3 |
13 |
39 |
1 |
3 |
1 |
31 |
31 |
1 |
3 |
2 |
18 |
36 |
初步分析結論:上傳速度受客戶端數量影響,不受副本數影響,並行客戶端越多,單個寫入速度越慢,集羣吞吐量有小幅度提升,不超過網絡帶寬。
五節點集羣(1個NameNode,4個DataNode):
集羣節點數(個) |
副本數(個) |
客戶端數量(個) |
平均速度(MB/S) |
吞吐量(MB/S) |
5 |
1 |
1 |
31 |
31 |
5 |
1 |
2 |
30 |
60 |
5 |
1 |
3 |
30 |
90 |
5 |
1 |
4 |
30 |
120 |
5 |
1 |
5 |
22 |
110 |
5 |
3 |
1 |
31 |
31 |
5 |
3 |
2 |
17 |
34 |
5 |
3 |
3 |
12 |
36 |
5 |
3 |
4 |
10 |
40 |
初步分析結論:上傳速度受副本數和客戶端數量影響。在副本數爲1的情況下,客戶端數量越多,吞吐量越高,當客戶端數量達到DataNode節點數量的時候吞吐量幾乎不變;在副本數爲3的時候,客戶端數量越高,平均速度越低,但是集羣吞吐量有小幅度提升,但不超過帶寬。
1.3測試總結
在16節點的hadoop集羣環境下,網絡爲萬兆網,假設1個NameNode節點,15個DataNode,那麼理論上集羣的總吞吐量爲15GB/S(即吞吐量可隨節點數增加而線性增長),但是由於IO性能的限制,每臺機器(按照固態硬盤)的最大吞吐量也就250MB/S左右,那麼集羣最大吞吐量爲3.5GB/S左右(不跑任何hadoop以外的程序)。
在極限情況下,單個客戶端最大IO速度爲250MB/S,如果副本數爲3的話,一秒內的總流量爲750MB,萬兆網是完全可以支撐的。如果多個客戶端的話,由於受集羣吞吐量的影響會有所下降,大致滿足以下公式關係(客戶端數量爲N,數據節點數量爲M,網絡帶寬爲B,副本數位P):
1)如果P * N < M,那麼每臺客戶機的速度都可以達到IO極限。
2)如果P * N > M,那麼平均速度爲R= M * B/(P * N * 8)
上面算出來的速度並不是絕對的,因爲不同的客戶端可能會同時路由block到同一個DataNode,不過在海量數據的情況下,大致可以達到負載均衡。