HBase和MongoDB的区别和联系

小组轮到我做技术分享,由于最近MongoDB用的比较多,就想着和之前用到的HBase做下对比,以此加深理解,恰好网上对于HBase和MongoDB做对比的资料比较少,便结合我的使用情况整理出了这篇博客和技术分享的PPT

我进行对比的这些维度,实际上每一种都值得写一篇博客来详细说明的,篇幅所限,仅从比较粗的粒度进行比较

 

技术分享的PPT已经上传到了百度网盘, 有兴趣的话可以自己去下载

技术分享PPT

提取码 : fqpa

链接永久有效!

本篇博客主要内容如下:

一. HBase和MongoDB的联系

二. HBase和MongoDB的区别

一. HBase和MongoDB的联系

1.1 为何要选用非关系型数据库

传统的关系数据库,使用的时候有如下痛点:

1. 难以应付高并发数据写入

2. 海量数据的查询,效率低

3. 数据量达到一定规模后,会遇到瓶颈,难以扩展

4. 表结构修改困难, 难以适应经常变更的业务需求

5. 许可费用,扩展费用高昂

1.2 非关系型数据库分类

1. 键值型数据库

代表 : Redis, Flare

特点 : 键值数据库将数据存储为键值对集合,其中键作为唯一标识符。键和值都可以是从简单对象到复杂复合对象的任何内容。键值数据库是高度可分区的,并且允许以其他类型的数据库无法实现的规模进行水平扩展。

 

2. 文档型数据库

代表 : MongoDB,CouchDB

特点 : 在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。

 

3. 列存储数据库

代表 : HBase,Cassandra

特点 : 以列相关存储架构进行数据存储的数据库, 适合大批量数据的处理

 

4. 图数据库

代表 : InfoGrid, Neo4j

特点 : 最近越来越火的非关系型数据库,应用图形理论存储实体之间的关系信息。

1.3 CAP原则

非关系型数据库是通过分布式系统来提供服务的,提到分布式,就绕不开CAP原则

 

从图片中可以看到 : HBase和MongoDB 都满足

一致性(Consistency)和分区容忍性(Partition tolerance)两个条件。

 

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)。

CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

 

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

    

可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

 

分区容忍性(P):分区容错性,是指由于节点之间的网络问题,即使一些消息延迟,整个系统能继续提供服务(提供一致性或者可用性)。

为什么这三个条件不能同时满足?

首先,针对非关系型数据库来说,由于是单一的数据中心,不涉及到分区, 所以满足CA即可

 

对于分布式系统,在分区存在的时间内,如果想要保证一致性(C), 那么必然会出现在某一段时间内,系统是不可用的,即不满足A

如果想要保证即使在分区时间内,系统可用,那么久不等保证分布式系统所有数据备份,同一时刻的值相同, 即不满足C

误区: CAP理论并不是说简单的三者选择两者。

首先,虽然只要是分布式系统,就可能存在分区,但分区出现的概率是很小的(否则就需要去优化网络或者硬件),CAP在大多数时候允许完美的C和A;只有在分区存在的时间段内,才需要在C与A之间权衡。

其次,一致性和可用性都是一个度的问题,不是0或者1的问题,可用性可以在0%到100%之间连续变化,一致性分为很多级别(比如在casandra,可以设置consistency level)。因此,当代CAP实践的目标应该是针对具体的应用,在合理范围内最大化数据一致性和可用性的效力。

二. HBase和MongoDB的区别

2.1 数据模型区别

HBase数据模型术语

表(Table)

HBase 会将数据组织进一张张的表里面,一个 HBase 表由多行组成。

 

行(Row)

HBase 中的一行包含一个行键和一个或多个与其相关的值的列。在存储行时,行按字母顺序排序。出于这个原因,行键的设计非常重要。目标是以相关行相互靠近的方式存储数据。常用的行键模式是网站域。如果你的行键是域名,则你可能应该将它们存储在相反的位置(org.apache.www,org.apache.mail,org.apache.jira)。这样,表中的所有 Apache 域都彼此靠近,而不是根据子域的第一个字母分布。

 

列(Column)

HBase 中的列由一个列族和一个列限定符组成,它们由:(冒号)字符分隔。

 

列族(Column Family)

出于性能原因,列族在物理上共同存在一组列和它们的值。在 HBase 中每个列族都有一组存储属性,例如其值是否应缓存在内存中,数据如何压缩或其行编码是如何编码的等等。表中的每一行都有相同的列族,但给定的行可能不会在给定的列族中存储任何内容。

 

列族一旦确定后,就不能轻易修改,因为它会影响到 HBase 真实的物理存储结构,但是列族中的列标识(Column Qualifier)以及其对应的值可以动态增删。

列限定符(Column Qualifier)

列限定符被添加到列族中,以提供给定数据段的索引。鉴于列族的content,列限定符可能是content:html,而另一个可能是content:pdf。虽然列族在创建表时是固定的,但列限定符是可变的,并且在行之间可能差别很大。

 

单元格(Cell)

单元格是行、列族和列限定符的组合,并且包含值和时间戳,它表示值的版本。

 

时间戳(Timestamp)

时间戳与每个值一起编写,并且是给定版本的值的标识符。默认情况下,时间戳表示写入数据时 RegionServer 上的时间,但可以在将数据放入单元格时指定不同的时间戳值。

 

HBase存储结构 :

NameSpace-->HTable-->Row-->Column

数据以字节码形式存储,空值不占用存储空间

下图是HBase的Row组成:


从图中可以看到HBase的行键,由主键,时间戳,列簇及列簇里的列和值组成

 

MongoDB存储结构 :

Database-->Collection-->Document-->Field

BSON是一种类json的一种二进制存储格式

 

2.2 系统架构区别

HBase系统架构:

 

 

关于HBase的系统架构,值得单独写一篇博客好好讲述,这里不做为本篇博客重点.

感兴趣的可以去阅读下这篇博客,写的很好 :

深入理解HBase的系统架构

MongoDB系统架构:

 

MongoDB的架构的一些知识,可以参考下面这篇博客 :

MongoDB架构学习笔记

2.3 实际操作区别

2.3.1 环境搭建区别

HBase分布式集群搭建

搭建一个分布式的HBase集群,至少需要做如下工作 :

  1. 安装Java

  2. 配置SSH免密登录

  3. 配置NTP时钟同步

  4. 安装匹配版本的Hadoop

  5. 安装匹配版本的Zookeeper

  6. 安装HBase

Mongo分布式集群搭建:

对安装包进行解压,并进行一些必要配置即可!

 

这种环境搭建区别,可以说是简单难度和炼狱难度的对比了,尤其是对于大数据新手来说,一个Hadoop安装就足够让人崩溃了
HBase的入门,还是有一点门槛的

2.3.2 可视化工具区别

为什么要把这个单独作为一个维度,因为优秀的可视化工具可以减少一款技术的学习成本,很大程度的提供使用人员的工作效率

 

HBase的可视化工具:

Hbase目前没有很成熟的可视化工具, 目前受到广泛认可的是squirrel, 通过大数据组件Phoenix,对HBase表格进行映射,将Hbase复杂的shell语法转换成类似sql的语句,以减少使用者的学习成本

 

但该工具配置相对复杂,并且对HBase的操作有很多限制, 使用体验一般

关于该工具的使用,我之前有专门的一篇博客介绍过,博客链接:

使用phoenix和SQuirrel操作hbase

MongoDB可视化工具:

比较流行的无论是开源的Robomongo, 还是收费的Studio 3T都是很成熟的可视化工具,无论是界面,流畅度,还是软件能够实现的功能,都很不错,使用体验很棒

 

之前我写过的介绍MongoDB的博客,都是基于这两种工具进行操作的,博客链接如下:

MongoDB基本操作总结

这一轮的对比,又是MongoDB完胜!

2.3.3 使用语法区别

我分别使用HBase和MongoDB实现最简单的建表和插入数据的语句

实现功能 : 创建表 : t
向t中插入数据 : 主键值为rold, 列名为 f的值为 ‘v’
MongoDB版本:

HBase版本:

 

MongoDB的版本,相信很容易就能够理解,但是HBase的版本,如果没有提前对HBase语法有一定了解的话,恐怕会看的一脸蒙蔽~
HBase的很多语法都比较抽象

不过,HBase语法比较灵活的地方时它可以在脚本里直接使用部分java api来进行操作

比如在HBase里面,可以直接执行以下语法:

// 获得任意时间的毫秒值

java.text.SimpleDateFormat.new("yyyy/MM/dd HH:mm:ss").parse(\"2018/05/27 17:50:00").getTime()

更多有趣的语法,可以参考我之前写过的博客 :

HBase的高阶shell操作

总结 : 虽然HBase提供了对于java部分api的直接操作,但它的语法实在是过于抽象,没有Mongo那么人性化,因此,这一轮对比, 还是认为MongoDB略胜一筹!

 

2.4 性能对比

2.4.1 写入性能区别

根据我的使用情况,通过几种常用的方式来对比:
对比前提 : HBase在预分区比较合理的情况下

1. 单条写入

MongoDB按照主键(HBase是行键) : 小数据量性能HBase和MongoDB无明显区别,大数据量HBase更优

MongoDB不按照主键

HBase更优

 

2. 批量写入

 MongoDB按照主键(HBase是行键) : 小数据量性能HBase和MongoDB无明显区别,大数据量HBase更优

MongoDB不按照主键

HBase更优

3. MapReduce写入

MongoDB不做分片时,相当于单线程, HBase肯定更优

MongoDB做分片时, 对于MR的支持也不如原生的HBase友好,

效率依旧不如HBase

4. bulkload写入

HBase一旦开启了这种写入模式,MongoDB的写入性能会被秒成渣渣

关于HBase各种方式写入的API和性能,在我之前写过的一篇博客里面有所介绍,感兴趣的可以去看下:

HBase批量入库遇到的坑

2.4.2 查询性能区别

根据主键(行键查询):

数据量小时, 都很快

数据量大时, HBase会更快

 

但倘若根据其它条件查询, HBase就会受到很大限制
而MongoDB可以通过创建灵活的创建索引来提高查询效率
关于HBase除主键之外的其它查询方式,我在之前写过的一篇博客总结过,博客链接如下 :


hbase shell及 java api的过滤器操作

从查询的灵活度和各种条件的查询效率而言,MongoDB略胜一筹

2.5 应用场景区别

HBase应用场景:

 

 

总结 :HBase八大应用场景

对象存储:我们知道不少的头条类、新闻类的的新闻、网页、图片存储在HBase之中,一些病毒公司的病毒库也是存储在HBase之中

时序数据:HBase之上有OpenTSDB模块,可以满足时序类场景的需求

推荐画像:特别是用户的画像,是一个比较大的稀疏矩阵,蚂蚁的风控就是构建在HBase之上

时空数据:主要是轨迹、气象网格之类,滴滴打车的轨迹数据主要存在HBase之中,另外在技术所有大一点的数据量的车联网企业,数据都是存在HBase之中

CubeDB OLAP:Kylin一个cube分析工具,底层的数据就是存储在HBase之中,不少客户自己基于离线计算构建cube存储在hbase之中,满足在线报表查询的需求

消息/订单:在电信领域、银行领域,不少的订单查询底层的存储,另外不少通信、消息同步的应用构建在HBase之上

Feeds流:典型的应用就是xx朋友圈类似的应用

NewSQL:之上有Phoenix的插件,可以满足二级索引、SQL的需求,对接传统数据需要SQL非事务的需求

 

MongoDB应用场景:

 

总结:

从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。

游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新

物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能

物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析

视频直播,使用 MongoDB 存储用户信息、礼物信息等

 

参考链接:

CAP理论与MongoDB一致性、可用性的一些思考

ppt模板网站

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐