1.Mongodb bson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中。
2.Mongodb 主键是“_id”,主键上面可以不建索引,记录插入的顺序和存放的顺序一样,hbase的主键就是row key,可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。
字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
3.Mongodb支持二级索引,而hbase本身不支持二级索引
4.Mongodb支持集合查找,正则查找,范围查找,支持skip和limit等等,是最像mysql的nosql数据库,而hbase只支持三种查找:通过单个row key访问,通过row key的range,全表扫描
5.mongodb的update是update-in-place,也就是原地更新,除非原地容纳不下更新后的数据记录。而hbase的修改和添加都是同一个命令:put,如果put传入的row key已经存在就更新原记录,实际上hbase内部也不是更新,它只是将这一份数据已不同的版本保存下来而已,hbase默认的保存版本的历史数量是3。
6.mongodb的delete会将该行的数据标示为已删除,因为mongodb在删除记录时并不是真把记录从内存或文件中remove,而是将该删除记录数据置空(写0或特殊数字加以标识)同时将该记录所在地址放到一个list列表“释放列表”中,这样做的好就是就是如果有用户要执行插入记录操作时,mongodb会首先从该“释放列表”中获取size合适的“已删除记录”地址返回,这种方法会提升性能(避免了malloc内存操作),同时mongodb也使用了bucket size数组来定义多个大小size不同的列表,用于将要删除的记录根据其size大小放到合适的“释放列表”中。Hbase的delete是先新建一个tombstonemarkers,然后读的时候会和tombstonemarkers做merge,在 发生major compaction时delete的数据记录才会真真删除。
7.mongodb和hbase都支持mapreduce,不过mongodb的mapreduce支持不够强大,如果没有使用mongodb分片,mapreduce实际上不是并行执行的
8.mongodb支持shard分片,hbase根据row key自动负载均衡,这里shard key和row key的选取尽量用非递增的字段,尽量用分布均衡的字段,因为分片都是根据范围来选择对应的存取server的,如果用递增字段很容易热点server的产生,由于是根据key的范围来自动分片的,如果key分布不均衡就会导致有些key根本就没法切分,从而产生负载不均衡。
9.mongodb的读效率比写高,hbase默认适合写多读少的情况,可以通过hfile.block.cache.size配置,该配置storefile的读缓存占用Heap的大小百分比,0.2表示20%。该值直接影响数据读的性能。如果写比读少很多,开到0.4-0.5也没问题。如果读写较均衡,0.3左右。如果写比读多,果断默认0.2吧。设置这个值的时候,你同时要参考hbase.regionserver.global.memstore.upperLimit,该值是memstore占heap的最大百分比,两个参数一个影响读,一个影响写。如果两值加起来超过80-90%,会有OOM的风险,谨慎设置。
10.hbase采用的LSM思想(Log-Structured Merge-Tree),就是将对数据的更改hold在内存中,达到指定的threadhold后将该批更改merge后批量写入到磁盘,这样将单个写变成了批量写,大大提高了写入速度,不过这样的话读的时候就费劲了,需要merge disk上的数据和memory中的修改数据,这显然降低了读的性能。mongodb采用的是mapfile+Journal思想,如果记录不在内存,先加载到内存,然后在内存中更改后记录日志,然后隔一段时间批量的写入data文件,这样对内存的要求较高,至少需要容纳下热点数据和索引。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Facebook:HBase每月存储1350亿条信息
也许你已经在一些地方看到这个消息,Facebook
已经开发一款新的社会化收件箱,集成了电子邮件、即时通讯、短信、文本信息、Facebook站内信息。最重要的是,他们需要每个月存储 1350
亿条信息。他们在哪里存储这些信息?Facebook的Kannan Muthukkaruppan
在《信息背后的技术》一文中给出一个令人惊奇的答案:HBase。HBase
击败了MySQL、Cassandra和其他一些选项,成为了Facebook的选择。
为什么这一选择令人惊奇?Facebook
创建了Cassandra,其目的就是为了建造一个收件箱类型的应用程序,但是最终他们发现,Cassandra的一致性模型并不能很好地适用于 Facebook
新的实时信息系统。另外,Facebook 还有一个扩展的MySQL
架构,不过他们发现,当数据集和索引变大时,性能会变得让人无法忍受。另外,他们原本可以自己开发一套系统,但他们最终还是选择了 HBase。
HBase是一个可以横向扩张的表存储系统,能够为大规模数据提供速度极快的低等级更新。这正是信息系统所需要的功能。另外,HBase是一个基于列的键值存储系统,并且是构建于
BigTabe
模型之上。HBase善于根据键访问行,以及对于一系列的行进行扫描和过滤。同样,这也是信息系统所需要的功能。不过,它并不支持复杂查询。查询通常交给分析工具处理,比如
Hive,Facebook创建了Hive,目的是处理他们容量高达多个拍字节(petabyte)的数据仓库。同时,Hive
是基于Hadoop的文件系统HDFS,而HBase使用的也是这一文件系统。
Facebook
选择了HBase,因为他们对他们的应用进行了监视,并明白他们到底需要什么。他们所需要的是一个可以处理以下两种类型的数据模式:
1. 一小组经常变化的临时数据;
2.
一组不断增加但很少访问的数据。
这很有道理。当前收件箱里的邮件你只会看一次,之后你很少会再去翻看这些电子邮件。这两种类似的数据是如此不同,所以有人也许在想应该使用两种不同的系统。不过,很明显,HBase
能够很好地处理这两种类型的数据。他们如何处理常规的搜索功能,尚不清楚,因为这并非 HBase 的优势所在,不过,HBase
可以集成多个搜索系统。
Facebook
系统的一些关键点:
●
HBase:
○
具有比Cassandra更简洁的一致性模型。
○
对于他们的数据模式具有很好的扩展能力和处理能力。
○
大多数功能能够满足他们的需求:自动加载平衡和故障转移、压缩支持功能、单个服务器的多碎片功能等。
○
HBase 所使用的文件系统HDFS,支持复制、端对端校验和,以及自动再次平衡。
○
Facebook 的运营团队具有丰富的HDFS使用经验,因为Facebook是Hadoop的大用户,而Hadoop使用 HDFS
作为它的分布式文件系统。
●
Haystack 用于存储附件。
●
从无到有,编写可自定义的应用程序服务器,其目的是为了满足多个不同来源流入的大量信息。
●
用户发现服务(user discovery service)构建于 Zookeeper 之上。
●
对于以下功能可访问架构服务:电子邮件账号验证、好友关系、隐私决策以及发送决策(通过聊天工具或短信发送一条消息?)
●
保持小团队做大事情的一贯作风,15 位工程师在一年内发布了 20 项新的架构服务。
●
Facebook将不会对单个数据库平台进行标准化,对于不同的任务他们将使用不同的平台。
Facebook
通过选择HBase将极大地推动该系统的采用,同时Facebook具有丰富的 HDFS/Hadoop/Hive
使用经验。想到这些,就让人兴奋的无法入睡。这是任何一款产品的梦想:成为另一个非常流行的产品的搭档,并期待成为其生态系统的一部分。这正是 HBase
所取得的成功。HBase 已经在许多方面去多了不错的成绩:实时、分布、线性扩展、健壮、BigData、开源、键值、面对列,我们将会看到 HBase
变得更加流行,尤其是它已经获得了 Facebook 的眷顾和青睐。
HBase是一个分布式的、面向列的开源数据库,该技术来源于
Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File
System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的
Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式。HBase使用和Bigtable非常相同的数据模型。用户存储数据行在一个表里。一个数据行拥有一个可选择的键和任意数量的列。表是疏松的存储的,因此用户可以给行定义各种不同的列。HBase主要用于需要随机访问,实时读写你的大数据(Big
Data)。