部署Hadoop集羣爲什麼優先選擇硬件方式而不是虛擬化方式?

刀片服務器、SAN、虛擬化技術

“螺旋式前進”這種東西存在於各個領域,在大規模數據存儲與處理上,一樣如此。

曾經,當管理人員購買服務器的時候,如需更高的性能,則會購買更高配置的服務器,這種做法稱之爲 “縱向擴展(Scale up)” ;後來當我們意識到縱向擴展會帶來更高的開銷時,我們開始採用購買更多的服務器來解決問題,而不是購買更高端的服務器,這種做法叫做 “橫向擴展(Scale Out)” 。今天的數據中心就是如此,由於機架空間是很重要的一個因素,因此發展出了現在我們稱爲 “刀片服務器” 的1U、2U 這種概念的服務器,可以使得在一個機架內裝入更多的服務器。再後來,發現其實很多服務器的利用率都不高,於是又發展出了虛擬化技術,以更充分的利用各個服務器資源。

存儲發展也是同樣,先是單機內單塊兒硬盤的存儲追求更高的容量和更高的IO,遇到困難後,在單機內發展多塊硬盤做RAID做小規模橫向擴展,再後來,獨立出SAN和NAS用很多硬盤來做大規模的橫向擴展。

Hadoop 也是基於同樣的橫向擴展理念發展出來的。那麼 Hadoop 在使用現在流行的刀片服務器、SAN和虛擬化技術上,是否和傳統服務一樣會提高性能呢?不盡然。

先說 Hadoop 操作的特點。Hadoop 是對IO性能非常敏感的,操作過程中將會有大量的IO操作。Hadoop 不需要 RAID,相反,使用RAID可能會降低 worker 的性能; Hadoop 希望硬盤使用 JBOD (Just Bunch of Disk 就是簡單的一堆硬盤) 的簡單形式,說白了,磁盤不需要特殊處理,簡單的由操作系統掛載即可。這樣的好處是,每一個磁盤將有獨立的 IO,互相之間不需要協作,誰的數據準備好了,就把誰的數據從緩衝直接送到對應進程。而RAID的麻煩在於磁盤之間有協作,往往最慢的磁盤決定了整個RAID的性能,更嚴重的是,由於所有磁盤都通過一塊RAID控制芯片,往往該芯片成爲了磁盤性能的瓶頸。

對於 SAN 和 NAS 來說,具有和 RAID 同樣的特性,由於大量的磁盤位於1-2個控制芯片之後,他們的IO無法像JBOD那樣充分利用,受限於控制芯片,從而導致當集羣中大量的節點併發訪問的時候,很容易會造成其控制芯片的擁堵。這與傳統意義上的服務器不同,在傳統意義上 SAN 和 NAS 會大幅提高 IO 性能,但是 Hadoop 所需的 IO 要遠遠超過當前 SAN 或 NAS 的能力,至少在性價比上,SAN 和 NAS 並不是很適用於 Hadoop 的操作特性。

那麼,當 Hadoop 遇到虛擬化後,問題同樣就會暴露出來,由於虛擬化的系統無法意識到別的系統的存在,因此在磁盤IO調度上,無法整體的優化調度。我們知道磁盤和Flash不同,其固有的物理特性是順序讀寫速度很快,但是尋道時間則很慢。而 虛擬化技術會使得操作系統無法優化調度尋道操作,導致會產生大量的尋道,從而無法充分利用磁盤順序讀寫的能力 ,而降低了性能(這也是爲什麼Hadoop Block非常大的原因之一,用於將數據順序寫入磁盤,並順序讀出,以大幅增加IO性能)。

刀片服務器的問題是在於內部空間十分有限,前文所知,Hadoop 的需要大量的IO,因此一個節點內,如果有更多的獨立磁盤,其IO性能會更好。這也是爲什麼前文中提議配置時,24 x 1TB 的磁盤比 12 x 3TB 的磁盤要更好的原因。刀片服務器內部的空間限制,往往束縛了增加更多硬盤的可能性。

從這裏,我們就更好的能夠看出 Hadoop 所謂的運行於獨立的商用服務器,以及其特意強調的 Share Nothing 的構架的原因。任務獨立、IO獨立對於Hadoop來說,會產生更好的性能,換句話說,這種 Share Nothing的構架,會更充分的利用硬件資源。

參考1:http://twang2218.github.io/readings/hadoop-operations/hadoop-operations-notes-ch04.html


參考2:http://www.ha97.com/5673.html


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