十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
众多基于Bigtable技术的开源项目正在通过不同的方式实现高扩展性、高灵活性、分布式及宽列数据存储等功能,Cassandra和HBase就是其中的代表。
创新互联是一家专注于成都网站建设、成都网站制作与策划设计,驻马店网站建设哪家好?创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:驻马店等地区。驻马店做网站价格咨询:028-86922220
在大数据这一全新的领域里,Bigtable数据库技术非常值得我们关注,因为这一技术是由谷歌的工程发明的,而谷歌是一家公认的非常擅长管理海量数据的
公司。如果你对此非常了解,那么你一家知道也熟悉Cassandra和HBase这两个Apache数据库项目。
谷歌在2006年的一份研究报告中首次对Bigtable进行了阐述。有意思的是,这份报告当时并没有将Bigtable作为数据库技术,而是将其作为一
种“稀疏的分布式多维度”映射技术以存储拍字节级数据,并在商用硬件上运行它们。行先是以一种非常独特的方式被索引,随后Bigtable利用行键对数据
进行分割,将它们分布到集群中。列可以被迅速地定义在行中,让Bigtable适用于大多数的非模式环境。
Cassandra和HBase都在很大程度上借鉴了早期Bigtable的定义。实际上,Cassandra起源于Bigtable和亚马逊的
Dynamo技术,HBase将自身定位为“开源Bigtable工具”。就其本身而论,这两个项目既有许多相同的特点,同时又有许多重大区别。
同为大数据而生
Cassandra与HBase都是NoSQL数据库。总体上看,这意味着用户无法使用SQL数据库。不过,Cassandra使用的是CQL(Cassandra 查询语言),其语法有明显模仿SQL的痕迹。
两者都被设计用于管理非常大的数据集。HBase文件声称一个HBase数据库可以拥有数亿个,甚至是数十亿个行。此外,用户还被建议继续使用关系型数据库。
两者都是分布式数据库,不仅仅是在数据的存储方式上,在数据访问方式上亦是如此。客户端可以与集群中的任意节点相连,并访问任意的数据。
两者都宣称拥有近似于线型的扩展能力。想要管理两倍规模的数据吗?用户只需将集群中的节点扩展两倍即可。
两者都是通过复制来防止集群节点故障而导致出现数据损失。被写入数据库的行主要由单个集群节点负责(行至节点映射取决于用户所使用的分区模式)。数据会被
镜像到称之为冗余节点的其他集群成员当中(用户可配置的复制因子会显示数量)。如果主要节点出现了故障,那么数据仍然可以从另外的冗余节点中被读取。
两者都被称之为列式数据库。由于它们的名字听起来像是关系型数据库,因此用户在接触中需要在思想上进行调整,这导致用户对它们的认知会出现混淆。最容易出
现混淆的地方是,数据在表面上最初是由行进行排列的,表的主要键是行键。但是与关系型数据库不同,在列式数据库中,没两个行需要相同的列。正如上面所说的
那样,在表被创建后,用户能够快速在行中加入列。实际上,你能够向一行中增加许多列。虽然最高上限值难以被准确地计算出来,但是用户几乎不可能达到这样的
上限,即便他们加入大量列的情况下也是如此。
除了这些源于Bigtable定义的特点外,Cassandra和HBase还有一些其他的相似之处。
首先,两者都使用相似的写入路径,即首先将写入操作记录在日志文件中以确保持久性。即便出现写入失败的提示,保存在日志当中的操作记录可以被重新开始。随
后,数据被写入内存缓存中。最后,数据被通过大量的一系列写入操作写入到磁盘中(实际上是将内存缓存的副本拷贝至磁盘中)。Cassandra和
HBase所使用的内存和磁盘数据结构在某种程度上都是日志结构的合并树。Cassandra的磁盘组件是SSTable,HBase中磁盘组件的是
HFile。
两者提供JRuby语言的命令行外壳。两者都通过Java语言被大量写入,这是访问它们的主要编程语言,尽管在许多其他的编程语言中都有适合两者的客户端包。
当然,Cassandra 和 HBase都是Apache软件基金会管理的开源项目,两者都可以通过Apache License version 2.0许可证免费获取。
相似与差别
尽管两者有着众多相似之处,但是它们之间还是存在着许多重大的区别。
尽管Cassandra和HBase中的节点都是对称的,这意味着客户端能够与集群中的任意节点相连,但是这种对称是不完全的。Cassandra需要用
户将一些节点作为种子节点,让它们在集群间通信中扮演集流点的角色。在HBase中,用户必须让一些节点充当主节点,它们的功能是监控和协调地区服务器的
行动。为了确保高可用性,Cassandra采取方式是允许在集群中设置多个种子节点;HBase则是利用备用主节点,如果当前的主节点发生故障,那么备
份主节点将成为新的主节点。
Cassandra在节点间通信中使用的是Gossip协议。目前Gossip服务已经与Cassandra软件整合到了一起。HBase则依托完全独立
的分布式应用Zookeeper来处理相应的任务。尽管HBase与Zookeeper一同出货,但是用户常常会使用预置在HBase数据库中的
Zookeeper。
虽然Cassandra和HBase都不支持实时交易控制,但是两者都提供了一定程度的一致性控制。HBase向用户提供记录级(也就是行级)的一致性。
实际上,HBase在每行都支持ACID级语义。用户可以在HBase中锁定一行,但是这种行为并不被鼓励,因为这不仅影响到并发性,同时行锁定还会导致
无法进行区域分割操作。此外,HBase还可以执行“检查与写入”操作,该操作在单个数据元上提供了“读取-修改-写入”的语义。
Cassandra免费的DataStax社区版包含有一个DataStax 操作中心。该中心提供了集群监控与管理功能,它可以检测数据库模式,提示键空间是否能够被编辑,以及是否可以增加或删除列族。
尽管Cassandra被描述为拥有“终极”一致性,但是读取和写入一致性可以在级别和区间方面进行调整。也就是说,你不仅可以配置必须成功完成操作的冗余节点数量,还可以设置参与的冗余节点是否跨数据中心。
此外,Cassandra还在其计算机指令系统中增加了一些轻量级的交易。Cassandra的轻量级交易采用的是“比较与集合”机制,相当于HBase
的“检查与写入”功能。不过,对于HBase的“读取-修改-写入”操作功能,Cassandra则缺乏相对应的功能。最终,Cassandra的2.0
版本增加了单独的行级写入功能。如果一个客户端在一行中更新了多个列,那么其他的客户端将会看到所有未更新的部分,或所有更新的部分。
在Cassandra和HBase当中,主索引是行键,但是数据被存储在磁盘中,这导致列族成员相互间非常接近。因此仔细规划列族组织非常重要。为了保持
高查询性能,有着相同访问模式的列应该被放在在相同的列族当中。Cassandra允许用户创建关于列值的额外次索引。这一举措提升了对那些值具有高重复
性的列(例如存储客户电子邮件地址中国家地区的列)的数据访问。HBase虽然缺乏对次索引的内置支持,但是它们有一些能够提供次索引功能的机制。这些都
在HBase的在线参考指南和HBase社区博客中被提及。
如前所述,两个数据库都有发布数据操作命令的命令行外壳。由于HBase和Cassandra的壳都是以JRuby壳为基础,因此用户可以编写一些脚本,
让这些脚本能够调用JRuby壳的所有资源与数据库所提供的特定API进行交互。此外,Cassandra还定义了模仿自SQL的CQL。与HBase所
使用的查询语言相比,CQL的功能更加丰富,并且可以在Cassandra的壳内直接执行。
尽管Cassandra仍然支持Thrift
API,但实际上Cassandra一直在推动让CQL成为数据库的主要编辑接口。Cassandra的文档列入了一些针对Java、C#和Python
等使用CQL version
3的驱动。最终,Cassandra将可获得一个JDBC驱动。该驱动用CQL替代了SQL,将CQL作为数据定义与数据管理语言。
HBase也支持Thrift接口和RESTful Web服务接口,不过HBase原生的Java
API向编程人员提供了丰富的功能。虽然HBase的数据操作命令没有CQL丰富,但是HBase拥有一个“筛选”功能,该功能可以在会话的服务器端执
行,大幅提升了扫描(搜索)的吞吐量。
HBase还引入了“协处理器”(coprocessors)这一概念,允许在HBase进程中执行用户代码。这基本上与关系型数据库中的触发和预存进程相同。目前,Cassandra还没有类似HBase协处理器的功能。
Cassandra的文档较HBase的更加醒目,并且拥有更加扁平化的学习曲线。设置一个开发用的Cassandra集群比设置HBase集群要更加简单。当然,这仅对于开发与测试目的来说非常重要。
棘手之处
在必须为特定应用调整集群时,用户需要做一些工作。在指定数据集大小、创建与管理多节点集群(通常会跨多个数据中心)的复杂度后,调整工作将变得非常棘手。用户需要深刻理解集群的内存缓存、磁盘存储和节点间通信之间相互影响,仔细监控集群的活动。
HBase对Zookeeper的依赖会带来一些额外的故障点。虽然Cassandra避开了这一问题,但这并不意味着Cassandra集群的调整难度会大幅下降。我们对两个数据库的集群调整难点进行了对比(如附表所示)。
需要说明的是,这里并没有确定谁是胜出者,谁是失败者。每个数据库的支持者都会找到一些证据来证明他们的系统优于对方。通常用户需要对两个数据库进行测试,然后才能确定它们执行目标应用的情况。
数据库(Database)是按照数据结构来组织,储存和管理数据的仓库。 数据库通常分为层次式数据库,网络式数据库和关系型数据库三种。而不同的数据结构是按照不同的数据结构来联系和组织的。如今常见的数据库模型分为关系型数据库(SQL)和非关系型数据库(NoSQL)两种
关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系就是二维表,并且有如下性质:
常见的关系型数据库:
关系型数据库的优缺点:
关系型数据库最大特点就是事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有所要求的系统中。
优点:容易理解,使用方便,易于维护
缺点:
1-数据读写必须经过sql解析,大量数据,并发下读写性能不足。硬盘I/O是一个很大的瓶颈
2-具有固定的表结构,因此扩展困难。
3-多表的关联查询导致性能欠佳。
NoSQL数据储存不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势
1-搜索键值存取数据库(key-value):可以通过key来添加,查询或者删除数据库,因为使用了key主键访问,所以获得很高的性能及扩展性。对于IT系统来说优势在于简单,易部署,高并发。
2-列存储数据库:将数据储存在列族中,一个列族储存经常被一起查询的相关数据,比如我们经常查询人类的名字和年龄,而非薪资,这种情况下年龄和姓名放在一个列族中,薪资会放到另外一个列族中。
3-面向文档数据库:可以看做键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。面向文档数据库会将数据以文档形式存储。
HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
1. 简介
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
2. HBase的表结构
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。
Row Key column-family1 column-family2 column-family3
column1 column2 column1 column2 column3 column1
key1
key2
key3
如上图所示,key1,key2,key3是三条记录的唯一的row key值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由row key1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不一样,分别是t1,t2, hbase会返回最新时间的值给请求者。
这些名词的具体含义如下:
(1) Row Key
与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:
(1.1) 通过单个row key访问
(1.2) 通过row key的range
(1.3) 全表扫描
Row key行键 (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作左填充。
行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
(2) 列族 column family
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
(3) 单元 Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。由{row key, column( =family + label), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
(4) 时间戳 timestamp
每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
3. HBase shell的基本用法
hbase提供了一个shell的终端给用户交互。使用命令hbase shell进入命令界面。通过执行 help可以看到命令的帮助信息。
以网上的一个学生成绩表的例子来演示hbase的用法。
name grad course
math art
Tom 5 97 87
Jim 4 89 80
这里grad对于表来说是一个只有它自己的列族,course对于表来说是一个有两个列的列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。