谁能告诉我mangodb和hbase的区别?

1.Mongodb bson文档数据库,整个数据存储在磁盘中,hbase是列数据库,集群部署时每个familycolumn都保存在单独的hdfs文件中。

2.2的主键。Mongodb是“_id”,不能在上面建立索引。插入记录的顺序与存储记录的顺序相同。hbase的主键是row key,可以是任意字符串(最大长度为64KB,实际应用中的长度一般为10-100bytes)。在hbase中,行键存储为字节数组。存储时,按照行键的字节顺序对数据进行排序和存储。在设计键的时候,要充分的排序存储这个特性,把经常一起读的行存储在一起。

按字典顺序对int排序的结果是1,10,100,11,12,13,14,15,65438。为了保持形状的自然顺序,行键必须用0填充。

3.Mongodb支持二级索引,而hbase本身不支持二级索引。

4.Mongodb支持集合搜索、常规搜索、范围搜索、跳过和限制等。它是最像mysql的nosql数据库,而hbase只支持三种搜索:通过单行键访问、通过行键范围和全表扫描。

5.5.mongodb的更新是update-in-place,即原地更新,除非更新后的数据记录无法容纳在原来的地方。hbase的修改和添加是同一个命令:put。如果put传入的行键已经存在,原始记录将被更新。其实并不是hbase内部的更新。它只是保存了该数据的不同版本。hbase保存版本的默认历史数量为3。

6.mongodb的delete会将这一行的数据标记为已删除,因为在删除一条记录时,MongoDB并没有真正从内存或文件中删除该记录,而是将已删除的记录数据留空(写0或一个特殊数字来标识),并将该记录的地址放在一个列表“release list”中。这样做的好处是,如果用户想插入一条记录,Mongodb会先从“释放列表”中获取大小合适的“已删除记录”地址,这样会提高性能(避免malloc内存操作)。同时,mongodb还使用bucket size数组定义了多个大小不同的列表,用来把要删除的记录按照大小放入合适的“释放列表”中。Hbase的删除是先创建一个tombstone标记,然后在读取的时候和tombstonemarkers合并,发生重大压缩的时候删除的数据记录就会被删除。

7.mongodb和hbase都支持mapreduce,但是mongodb的mapreduce支持不够强。如果不使用MongoDB碎片,mapreduce实际上并不是并行执行的。

8.mongodb支持分片,hbase根据行键自动均衡负载。这里分片键和行键尽量选择非增量字段,尽量使用分布均衡的字段,因为分片是根据范围来选择对应的访问服务器的。如果使用增量字段,很容易生成热点服务器。因为分片是根据键的范围自动进行的,如果键分布不均匀,有些键根本无法分区,导致负载不均衡。

9.mongodb的阅读效率高于写作,hbase默认适合多写少读。可以通过hfile.block.cache.size进行配置,该配置的读缓存占用堆的大小百分比,0.2表示20%。该值直接影响数据读取的性能。如果写的比读的少很多,开到0.4-0.5也没问题。如果读写平衡的话,大概是0.3。如果你写的比读的多,果断默认为0.2。设置该值时,还应参考hbase。region server . global . memstore . upper limit,这是memstore在堆中的最大百分比。一个参数影响阅读,另一个影响写作。如果两个值加起来超过80-90%,就会有OOM的风险,所以要慎重设置。

10.HBase采用的LSM思想(Log-Structured Merge-Tree)是将对数据的更改保存在内存中,然后在达到指定的threadhold后将批量更改合并到磁盘,这样就把单次写入变成了批量写入,大大提高了写入速度,但这样的话,读取会比较困难,明显减少了读取。Mongodb采用了mapfile+Journal的思想。如果记录不在内存中,应该先加载到内存中,然后在内存中更改记录日志,再每隔一段时间批量写入数据文件。这需要很高的内存,至少需要容纳热数据和索引。