一、引言:
在一次和同事的討論中遇到一個這樣的問題:有一個hadoop集群,在hbase的put數據出現瓶頸,他們想要把datanode上的磁盤做成RAID 0(比如10塊磁盤做成一個RAID 0),我當時就說這樣的做法不太好,但是沒有給出充足的理由不好反駁,只是說官方建議每塊磁盤做成單獨的RAID 0.今天有機會看到《Hadoop 指南》上正好有一塊寫到hadoop使用RAID的問題。
二、為何不使用RAID?
盡管建議采用RAID(Redundant Array of Independent Disk,即磁盤陣列)作為namenode的存儲器以保護元數據,但是若將RAID作為datanode的存儲設備則不會給HDFS帶來益處。HDFS所提供的節點間數據復制技術已可滿足數據備份需求,無需使用RAID的冗余機制。
此外,盡管RAID條帶化技術(RAID 0)被廣泛用戶提升性能,但是其速度仍然比用在HDFS里的JBOD(Just a Bunch Of Disks)配置慢。JBOD在所有磁盤之間循環調度HDFS塊。RAID 0的讀寫操作受限於磁盤陣列中最慢盤片的速度,而JBOD的磁盤操作均獨立,因而平均讀寫速度高於最慢盤片的讀寫速度。需要強調的是,各個磁盤的性能在實際使用中總存在相當大的差異,即使對於相同型號的磁盤。針對某一雅虎集群的評測報告(http://markmail.org/message/xmzc45zi25htr7ry)表明,在一個測試(Gridmix)中,JBOD比RAID 0 快10%;在另一測試(HDFS寫吞吐量)中,JBOD比RAID 0 快30%。
最后,若JBOD配置的某一磁盤出現故障,HDFS可以忽略該磁盤,繼續工作。而RAID的某一盤片故障會導致整個磁盤陣列不可用,進而使相應節點失效。
