Hypertable和Hbase二者同源,設(shè)計也有諸多相似之處,最主要的區(qū)別當(dāng)然還是編程語言的選擇。Hbase選擇Java主要是因?yàn)锳pache和Hadoop的公共庫、歷史項(xiàng)目基本都采用該語言,并且Java項(xiàng)目在設(shè)計模式和文檔上一般都比C++項(xiàng)目好,非常適合開源項(xiàng)目。C++的優(yōu)勢當(dāng)然還是在性能和內(nèi)存使用上。Yahoo曾經(jīng)給出了一個很好的Terasort結(jié)果(perspectives.mvdirona.com/2008/07/08/HadoopWinsTeraSort.aspx),它們認(rèn)為對于大多數(shù)Mapreduce任務(wù),比如分布式排序,性能瓶頸在于IO和網(wǎng)絡(luò),Java和C++在性能上基本沒有區(qū)別。不過,使用Java的Mapreduce在每臺服務(wù)器上明顯使用了更多的CPU和內(nèi)存,如果用于分布式排序的服務(wù)器還需要部署其它的CPU/內(nèi)存密集型應(yīng)用,Java的性能劣勢將顯現(xiàn)。對于Hypertable/HBase這樣的表格系統(tǒng),Java的選擇將帶來如下問題:
1. Hyertable/Hbase是內(nèi)存和CPU密集型的。Hypertable/Hbase采用Log-Structured Merge Tree設(shè)計,系統(tǒng)可以使用的內(nèi)存直接決定了系統(tǒng)性能。內(nèi)存中的memtable和表格系統(tǒng)內(nèi)部的緩存都大量使用內(nèi)存,可使用的內(nèi)存減少將導(dǎo)致merge-dump頻率加大,直接加重底層HDFS的壓力。另外,讀取和dump操作大量的歸并操作也可能使CPU成為一個瓶頸,再加上對數(shù)據(jù)的壓縮/解壓縮,特別是Bigtable中最經(jīng)常使用的BM-diff算法在壓縮/解壓縮過程完全跑滿一個CPU核,很難想象Java實(shí)現(xiàn)的Hbase能夠與C++實(shí)現(xiàn)的Hypertable在性能上抗衡。
2. Java垃圾回收。目前Java虛擬機(jī)垃圾回收時將停止服務(wù)一段時間,這對Hypertable/HBase中大量使用的Lease機(jī)制是一個很大的考驗(yàn)。雖然Java垃圾回收可以改進(jìn),但是企圖以通用的方式完全解決內(nèi)存管理問題是不現(xiàn)實(shí)的。內(nèi)存管理沒有通用做法,需要根據(jù)應(yīng)用的訪問模式采取選擇不同的策略。
當(dāng)然,Hadoop由于采用了Java設(shè)計,導(dǎo)致開源合作變得更加容易,三大核心系統(tǒng)之上開發(fā)的輔助系統(tǒng),如Hadoop的監(jiān)控,Pig等都相當(dāng)成功。所以,我的觀點(diǎn)依然是:對于三駕馬車的核心系統(tǒng),采用C++相對合理;對于輔助模塊,Java是一個不錯的選擇。 閱讀全文
類別:默認(rèn)分類 查看評論
文章來源:http://hi.baidu.com/knuthocean/blog/item/ef201038f5d866f8b311c746.html