HBase和MongoDB的区别和联系
HBase和MongoDB的区别和联系小组轮到我做技术分享,由于最近MongoDB用的比较多,就想着和之前用到的HBase做下对比,以此加深理解,恰好网上对于HBase和MongoDB做对比的资料比较少,便结合我的使用情况整理出了这篇博客和技术分享的PPT我进行对比的这些维度,实际上每一种都值得写一篇博客来详细说明的,篇幅所限,仅从比较粗的粒度进行比较技术分享的PPT已经上传到了百度网盘, 有兴趣
HBase和MongoDB的区别和联系
小组轮到我做技术分享,由于最近MongoDB用的比较多,就想着和之前用到的HBase做下对比,以此加深理解,恰好网上对于HBase和MongoDB做对比的资料比较少,便结合我的使用情况整理出了这篇博客和技术分享的PPT
我进行对比的这些维度,实际上每一种都值得写一篇博客来详细说明的,篇幅所限,仅从比较粗的粒度进行比较
技术分享的PPT已经上传到了百度网盘, 有兴趣的话可以自己去下载
提取码 : fqpa
链接永久有效!
本篇博客主要内容如下:
一. 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的系统架构,值得单独写一篇博客好好讲述,这里不做为本篇博客重点.
感兴趣的可以去阅读下这篇博客,写的很好 :
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的操作有很多限制, 使用体验一般
关于该工具的使用,我之前有专门的一篇博客介绍过,博客链接:
MongoDB可视化工具:
比较流行的无论是开源的Robomongo, 还是收费的Studio 3T都是很成熟的可视化工具,无论是界面,流畅度,还是软件能够实现的功能,都很不错,使用体验很棒
之前我写过的介绍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提供了对于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和性能,在我之前写过的一篇博客里面有所介绍,感兴趣的可以去看下:
2.4.2 查询性能区别
根据主键(行键查询):
数据量小时, 都很快
数据量大时, HBase会更快
但倘若根据其它条件查询, HBase就会受到很大限制
而MongoDB可以通过创建灵活的创建索引来提高查询效率
关于HBase除主键之外的其它查询方式,我在之前写过的一篇博客总结过,博客链接如下 :
从查询的灵活度和各种条件的查询效率而言,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 存储用户信息、礼物信息等
参考链接:
更多推荐
所有评论(0)