Hypertable hbase hdfs kfs java与c++的较量

曾经做过一个测试,用hdfs和 kfs分别作hadoop的底层,发现还是hdfs快,可能hdfs更符合hadoop的生态系统,但是一个很明显的现象就是用hdfs的时候,系统的内存缓存量很大几乎等于全部内存,iowait 也很高,kfs则没那么严重,这也是kfs慢的原因吧,因此如果在一个繁忙的集群上测试,哪个效果好,还是难以下定论,c++比java省内存和cpu,好多人都这么说,具体原因,我还不清楚,需要进一步学习。下面引用了另一位高人的随笔:

  Hypertable C++ vs Hbase Java 

Hypertable 和Hbase二者同源,设计也有诸多相似之处,最主要的区别当然还是编程语言的选择。Hbase选择Java主要是因为Apache和Hadoop的公共 库、历史项目基本都采用该语言,并且Java项目在设计模式和文档上一般都比C++项目好,非常适合开源项目。C++的优势当然还是在性能和内存使用上。 Yahoo曾经给出了一个很好的Terasort结果( perspectives.mvdirona.com/2008/07/08/HadoopWinsTeraSort.aspx), 它们认为对于大多数Mapreduce任务,比如分布式排序,性能瓶颈在于IO和网络,Java和C++在性能上基本没有区别。不过,使用Java的 Mapreduce在每台服务器上明显使用了更多的CPU和内存,如果用于分布式排序的服务器还需要部署其它的CPU/内存密集型应用,Java的性能劣 势将显现。对于Hypertable/HBase这样的表格系统,Java的选择将带来如下问题: 1.  Hyertable/Hbase是内存和CPU密集型的。Hypertable/Hbase采用Log-Structured Merge Tree设计,系统可以使用的内存直接决定了系统性能。内存中的memtable和表格系统内部的缓存都大量使用内存,可使用的内存减少将导致 merge-dump频率加大,直接加重底层HDFS的压力。另外,读取和dump操作大量的归并操作也可能使CPU成为一个瓶颈,再加上对数据的压缩/ 解压缩,特别是Bigtable中最经常使用的BM-diff算法在压缩/解压缩过程完全跑满一个CPU核,很难想象Java实现的Hbase能够与 C++实现的Hypertable在性能上抗衡。 2. Java垃圾回收。目前Java虚拟机垃圾回收时将停止服务一段时间,这对Hypertable/HBase中大量使用的Lease机制是一个很大的考 验。虽然Java垃圾回收可以改进,但是企图以通用的方式完全解决内存管理问题是不现实的。内存管理没有通用做法,需要根据应用的访问模式采取选择不同的 策略。 当然,Hadoop由于采用了Java设计,导致开源合作变得更加容易,三大核心系统之上开发的辅助系统,如Hadoop的监控,Pig等都相当成功。所 以,我的观点依然是:对于三驾马车的核心系统,采用C++相对合理;对于辅助模块,Java是一个不错的选择。

你可能感兴趣的:(hbase)