用户名*
邮箱*
密码*
确认密码*
验证码* 点击图片更换验证码
找回密码
忘记密码了?输入你的注册邮箱,并点击重置,稍后,你将会收到一封密码重置邮件。
我觉得@向磊 的回答已经指出了重点。我补充一下。
HBase是根据谷歌的BigTable设计的。典型的应用场景就是不断插入新的信息(谷歌的情况下就是互联网上新生成的网页),而不怎么修改。比如现在Facebook的messenger就是用HBase实现的。
这里要提到HBase是按行存储的,所以特点就是插入(ingest)快。但是做分析的时候经常是要按列扫描(scan)的。比如算一个公司员工的平均工资。
Cloudera在推出新的列存储引擎Kudu的时候讨论过HDFS,HBase,和Kudu的应用场景。
纠正一个理解错误,hbase不是oltp,作为一个NoSQL,他顶多是olp, 没有transaction。而且仅在rowkey上支持索引。在性能上不如memcached和redis,但是持久化存储方面比内存NoSQL强啊。作为文档型NoSQL在分布式存储上比mongo做sharding和MapReduce分析方便多了啊。
当然最重要的原因是这样,设想你要存储用户的地址和喜好,这当然可以做成结构化SQL。但是用户把家搬到上海了,那么以前在北京的地址要update覆盖掉吗,我们要计算分析用户的整个人生周期的活动记录和喜好,来推测他的行为,收入,知识层次,信用,道德水准之类的,当然他的相关历史行为是不能被丢弃的。所以hbase可以很好的适应这样的场景。
这只是简单的举个例子,mongo在小规模下也可以适应这种场景,不过随着数据增长,会涉及到sharding和gridfs让人痛苦的要命。当然以上场景也可以用其他工具,比如Cassandra,但是hbase和accumulo是跟hdfs以及mapreduce,Spark等结合的最好的,不但可以方便地存,更可以方便地算,这才是用hbase重要的原因吧。当然hbase不是银弹,不能解决所有问题,所以才会有那么多其他的NoSQL和SQL。
———
补充你的补充提问的补充回答
1.当然会有数据分析的需求,放了N多数据,如果只是为了存着,成本太高了。hbase依赖于hdfs存储,就我目前的认知范围,还不知道怎么在没有hadoop的情况下安装hbase。
2.用户生命周期数据为何要存成日志,难道不需要获取了吗,每次网页申请获取一个用户数据都要跑一遍MR计算吗?另外,hbase是可以update的。只不过机制跟sql完全不同。
3.事实上,hbase适合大数据量的查询,但并不适合大范围的查询,他就是put,get kv对,海量数据下跑类似select一样的检索scan一遍全表?呵呵,you gonna die.
HBase是一种NoSQL,通常被称为Hadoop Database,它是开源并基于Google Big Table白皮书,HBase运行在HDFS之上,因此使它具有高度可扩展性,并支持Hadoop map-reduce程序设计模型。HBase有两种访问方式:通过行键进行随机访问;通过map-reduce脱机或批访问。
谷歌曾经面对过一个挑战的问题:如何能在整个互联网上提供实时的搜索结果?答案是它本质上需要将互联网缓存,并重新定义在这样庞大的缓存上快速查找的新方法。为了达到这个目的,定义如下技术:
谷歌文件系统GFS:可扩展分布式文件系统,用于大型的、分布式的、数据密集型的应用程序。
BigTable:分布式存储系统,用于管理被设计成规模很大的结构化数据:来自数以千计商用服务器的PB级别的数据。
MapReduce:一个程序模型,用于处理和生成大数据集的相关实现。
在谷歌发布这些技术的文档之后, 不久以后我们就看到了它们的开源实现版本 ,就在2007年,Mike Cafarella发布了BigTable开源实现的代码,他称其为HBase,自此,HBase成为Apache的顶级项目,并运行在Facebook,Twitter,Adobe……仅举几个例子。
HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:
行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。
列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。
列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。
版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。
HBase Four-Dimensional Data Model
如图1中所示,通过行键获取一个指定的行,它由一个或多个列簇构成,每个列簇有一个或多个列修饰符(图1中称为列),每列又可以有一个或多个版本。为了获取指定数据,你需要知道它的行键、列簇、列修饰符以及版本。当设计HBase数据模型时,对考虑数据是如何被获取是十分有帮助的。你可以通过以下两种方式获得HBase数据:
通过他们的行键,或者一系列行键的表扫描。
使用map-reduce进行批操作
这种双重获取数据的方法使得HBase变得十分强大,典型地,在Hadoop中存储数据意味着它对离线或批处理方式分析是有益的(尤其是批处理分析),但是,对实时获取是不必要的。HBase通过key/value存储来支持实时分析,以及通过map-reduce支持批处理分析。让我们首先来看实时数据获取,作为key/value存储,key是行键,value是列簇的集合,如图2所示。
HBase as a Key/Value Store
如你在图2中看到的,key是我们所提到过的行键,value是列簇的集合。你可以通过key检索到value,或者换句话说,你可以通过行键“得到”行,或者你能通过给定起始和终止行键检索一系列行,这就是前面提到的表扫描。你不能实时的查询一个列的值,这就引出了一个重要的话题:行键的设计。
有两个原因令行键的设计十分重要:
表扫描是对行键的操作,所以,行键的设计控制着你能够通过HBase执行的实时/直接获取量。
当在生产环境中运行HBase时,它在HDFS上部运行,数据基于行键通过HDFS,如果你所有的行键都是以user-开头,那么很有可能你大部分数据都被分配一个节点上(违背了分布式数据的初衷),因此,你的行键应该是有足够的差异性以便分布式地通过整个部署。
你定义行键的方式取决于你想怎样存取那些行。如果你想以用户为基础存储数据,那么一个策略是利用字节队列在HBase中存储行键,所以我们可以创建一个用户ID的哈希(例如MD5或SHA-1),然后在哈希后面附上时间(long类型)。使用哈希有两个重点:(1)是它能够将value分散开,数据能够分布式地通过簇,(2)是它确保key的长度是一致的,以更加容易在表扫描中使用。
讲了足够多的理论,下面部分向你展示如何搭建HBase环境,并如何通过命令行使用。
你可以从Apache网站下载HBase,HBase团队推荐你在UNIX/Linux环境下安装HBase,如果你想在Windows下运行,你需要先安装Cygwin,并在这上运行HBase。当你下载完这些文件,解压到硬盘上。此外,你还需要安装Java环境,如果你还没有,从Oracle网站下载Java环境。在环境配置中添加名为HBASE_HOME的变量,值为你解压HBase文件的根目录,随后,执行bin文件夹下的start-hbase.sh脚本,它会在下面目录输出日志文件:
$HBASE_HOME/logs/
你可以在浏览器中输入下面URL测试是否安装正确:
HBase Management Screen
让我们开始用命令行操作HBase,在HBase bin目录下执行下面命令:
./hbase shell
你应该看到如下类似的输出:
1
2
3
4
5
6
7
HBase Shell; enter ‘help<RETURN>’ for list of supported commands.
Type “exit<RETURN>” to leave the HBase Shell
Version 0.98.5-hadoop2, rUnknown, Mon Aug 4 23:58:06 PDT 2014
hbase(main):001:0>
创建一个名为PageViews的表,并具有名为info的列簇:
hbase(main):002:0> create ‘PageViews’, ‘info’
0 row(s) in 5.3160 seconds
=> Hbase::Table – PageViews
每张表至少要有一个列簇,因此我们创建了info,现在,看看我们的表,执行下面list命令:
8
9
hbase(main):002:0> list
TABLE
PageViews
1 row(s) in 0.0350 seconds
=> [“PageViews”]
如你所见,list命令返回一个名为PageViews的表,我们可以通过describe命令得到表的更多信息:
10
11
12
13
hbase(main):003:0> describe ‘PageViews’
DESCRIPTION ENABLED
‘PageViews’, {NAME => ‘info’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’,
REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE true
‘, MIN_VERSIONS => ‘0’, TTL => ‘FOREVER’, KEEP_DELETED_CELLS => ‘false’,
BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
1 row(s) in 0.0480 seconds
Describe命令返回表的详细信息,包括列簇的列表,这里我们创建的仅有一个:info,现在为表添加以下数据,下面命令是在info中添加新的行:
hbase(main):004:0> put 'PageViews', 'rowkey1', 'info:page', '/mypage'
0 row(s) in 0.0850 seconds
Put命令插入一条行键为rowkey1的新纪录,指定在info下的page列,插入值为/mypage的记录,我们随后可以通过get命令通过行键rowkey1查询到这条记录:
hbase(main):005:0> get ‘PageViews’, ‘rowkey1’
COLUMN CELL
info:page timestamp=1410374788088, value=/mypage
1 row(s) in 0.0250 seconds
你可以看到列info:page,或者更多具体的列,其值为/mypage,并带有时间戳表明该条记录是什么时候插入的。让我们在做表扫描之前再添加一行:
hbase(main):006:0> put ‘PageViews’, ‘rowkey2’, ‘info:page’, ‘/myotherpage’
0 row(s) in 0.0050 seconds
现在我们有两行记录了,让我们查询出PageViews表的所有记录:
hbase(main):007:0> scan ‘PageViews’
ROW COLUMN+CELL
rowkey1 column=info:page, timestamp=1410374788088, value=/mypage
rowkey2 column=info:page, timestamp=1410374823590, value=/myotherpage
2 row(s) in 0.0350 seconds
如前面所提到的,我们不能查询本身,但是我们可以对表进行scan操作,如果你执行scan table命令,它会返回表中所有行,这很有可能不是你想要做的。你可以给出行的范围来限制返回的结果,让我们插入一带有s开头行键的新记录:
hbase(main):012:0> put ‘PageViews’, ‘srowkey2’, ‘info:page’, ‘/myotherpage’
现在,如果我增加点限制,想查询行键在r和s之间的记录,可以使用如下结构:
hbase(main):014:0> scan ‘PageViews’, { STARTROW => ‘r’, ENDROW => ‘s’ }
2 row(s) in 0.0080 seconds
这个scan返回了仅有s开头的记录,这个类比是基于全行键上的,所以rowkey1比r大,所有它被返回了。另外,scan的结果包含了所指范围的STARTROW,但不包含ENDROW,注意,ENDROW不是必须指定的,如果我们执行相同查询只给出了STARTROW,那么我们会得到行键比r大的所有记录。
hbase(main):013:0> scan ‘PageViews’, { STARTROW => ‘r’ }
srowkey2 column=info:page, timestamp=1410375975965, value=/myotherpage
3 row(s) in 0.0120 seconds
HBase
HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可以在廉价PC上搭建起大规模结构化存储集群。
HBase是Google Bigtable的开源实现,类似于Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapRecue来处理Bigtable中的海量数据,HBase同样利用Hadoop MapRecue来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
特性:
强一致性读写:HBase不是“Eventual Consistentcy(最终一致性)”数据存储,这让它很适合高速计数聚合类任务;
自动分片(Automatic sharding):HBase表通过region分布在集群中,数据增长时,region会自动分割并重新分布;
RegionServer自动故障转移
Hadoop/HDFS集成:HBase支持开箱即用HDFS作为它的分布式文件系统;
MapRecue:HBase通过MapRecue支持大并发处理;
Java客户端API:HBase支持易于使用的Java API进行编程访问;
Thrift/REST API:HBase也支持Thrift和Rest作为非Java前端访问;
Block Cache和Bloom Filter:对于大容量查询优化,HBase支持Block Cache和Bloom Filter;
运维管理:HBase支持JMX提供内置网页用于运维。
HBase应用场景
HBase不适合所有场景。
首先,确信有足够多数据,如果有上亿或上千亿行数据,HBase是很好的备选。如果只有上千或上百万行,则用传统的RDBMS可能是更好的选择。因为所有数据如果只需要在一两个节点进行存储,会导致集群其他节点闲置。
其次,确信可以不依赖于RDBMS的额外特性。例如,列数据类型、第二索引、事务、高级查询语言等
最后,确保有足够的硬件。因为HDFS在小于5个数据节点时,基本上体现不出来它的优势。
虽然HBase能在单独的笔记本上运行良好,但这应仅当成是开发阶段的配置 。
HBase的优点
列可以动态增加,并且列为空就不存储数据,节省存储空间;
HBase可以自动切分数据,使得数据存储自动具有水平扩展功能;
HBase可以提供高并发读写操作的支持;
与Hadoop MapRecue相结合有利于数据分析;
容错性;
版权免费;
非常灵活的模式设计(或者说没有固定模式的限制);
可以跟Hive集成,使用类SQL查询;
自动故障转移;
客户端接口易于使用;
行级别原子性,即PUT操作一定是完全成功或者完全失败。
HBase的缺点
不能支持条件查询,只支持按照row key来查询;
容易产生单点故障(在只使用一个HMaster的时候);
不支持事务;
JOIN不是数据库层支持的,而需要用MapRecue;
只能在主键上索引和排序;
没有内置的身份和权限认证;
HBase与Hadoop/HDFS的差异
HDFS是分布式文件系统,适合保存大文件。官方宣称它并非普通用途的文件系统,不提供文件的个别记录的快速查询。另一方面,HBase基于HDFS,并能够提供大表的记录快速查询和更新。HBase内部将数据放到索引好的“StoreFiles”存储文件中,以便提供高速查询,而存储文件位于HDFS中。
HBase作为默认的大数据时代的存储,基本解决以下三大类的场景:
1、平台类:存放是平台的产品,就是其它软件的存储,比如目前很就行的Kylin,阿里内部的日志同步工具TT,图组件Titan等。此类存放的往往平台的数据,有时候往往是无业务含义的。作为平台的底层存储使用。
2、用户行为类:此类主要是面向各个业务系统。这里的用户不仅仅指的人,也包括物,比如物联网。在阿里主要还是人产生的数据,比如:淘宝收藏夹、交易数据、旺旺聊天记录等等。这里使用比较直接,就直接存放HBase,再读取。难度就是需要支持千万级别的并发写访问及读取,需要解决服务质量的问题。
3:报表类的需求:比如报表、大屏等,如阿里巴巴的天猫双十一大屏。
这里有详细介绍,可以进一步了解:
昵称*
E-Mail*
回复内容*
回复 ( 5 )
我觉得@向磊 的回答已经指出了重点。我补充一下。
HBase是根据谷歌的BigTable设计的。典型的应用场景就是不断插入新的信息(谷歌的情况下就是互联网上新生成的网页),而不怎么修改。比如现在Facebook的messenger就是用HBase实现的。
这里要提到HBase是按行存储的,所以特点就是插入(ingest)快。但是做分析的时候经常是要按列扫描(scan)的。比如算一个公司员工的平均工资。
Cloudera在推出新的列存储引擎Kudu的时候讨论过HDFS,HBase,和Kudu的应用场景。
纠正一个理解错误,hbase不是oltp,作为一个NoSQL,他顶多是olp, 没有transaction。而且仅在rowkey上支持索引。在性能上不如memcached和redis,但是持久化存储方面比内存NoSQL强啊。作为文档型NoSQL在分布式存储上比mongo做sharding和MapReduce分析方便多了啊。
当然最重要的原因是这样,设想你要存储用户的地址和喜好,这当然可以做成结构化SQL。但是用户把家搬到上海了,那么以前在北京的地址要update覆盖掉吗,我们要计算分析用户的整个人生周期的活动记录和喜好,来推测他的行为,收入,知识层次,信用,道德水准之类的,当然他的相关历史行为是不能被丢弃的。所以hbase可以很好的适应这样的场景。
这只是简单的举个例子,mongo在小规模下也可以适应这种场景,不过随着数据增长,会涉及到sharding和gridfs让人痛苦的要命。当然以上场景也可以用其他工具,比如Cassandra,但是hbase和accumulo是跟hdfs以及mapreduce,Spark等结合的最好的,不但可以方便地存,更可以方便地算,这才是用hbase重要的原因吧。当然hbase不是银弹,不能解决所有问题,所以才会有那么多其他的NoSQL和SQL。
———
补充你的补充提问的补充回答
1.当然会有数据分析的需求,放了N多数据,如果只是为了存着,成本太高了。hbase依赖于hdfs存储,就我目前的认知范围,还不知道怎么在没有hadoop的情况下安装hbase。
2.用户生命周期数据为何要存成日志,难道不需要获取了吗,每次网页申请获取一个用户数据都要跑一遍MR计算吗?另外,hbase是可以update的。只不过机制跟sql完全不同。
3.事实上,hbase适合大数据量的查询,但并不适合大范围的查询,他就是put,get kv对,海量数据下跑类似select一样的检索scan一遍全表?呵呵,you gonna die.
HBase是一种NoSQL,通常被称为Hadoop Database,它是开源并基于Google Big Table白皮书,HBase运行在HDFS之上,因此使它具有高度可扩展性,并支持Hadoop map-reduce程序设计模型。HBase有两种访问方式:通过行键进行随机访问;通过map-reduce脱机或批访问。
谷歌曾经面对过一个挑战的问题:如何能在整个互联网上提供实时的搜索结果?答案是它本质上需要将互联网缓存,并重新定义在这样庞大的缓存上快速查找的新方法。为了达到这个目的,定义如下技术:
谷歌文件系统GFS:可扩展分布式文件系统,用于大型的、分布式的、数据密集型的应用程序。
BigTable:分布式存储系统,用于管理被设计成规模很大的结构化数据:来自数以千计商用服务器的PB级别的数据。
MapReduce:一个程序模型,用于处理和生成大数据集的相关实现。
在谷歌发布这些技术的文档之后, 不久以后我们就看到了它们的开源实现版本 ,就在2007年,Mike Cafarella发布了BigTable开源实现的代码,他称其为HBase,自此,HBase成为Apache的顶级项目,并运行在Facebook,Twitter,Adobe……仅举几个例子。
HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:
行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。
列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。
列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。
版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。
HBase Four-Dimensional Data Model
如图1中所示,通过行键获取一个指定的行,它由一个或多个列簇构成,每个列簇有一个或多个列修饰符(图1中称为列),每列又可以有一个或多个版本。为了获取指定数据,你需要知道它的行键、列簇、列修饰符以及版本。当设计HBase数据模型时,对考虑数据是如何被获取是十分有帮助的。你可以通过以下两种方式获得HBase数据:
通过他们的行键,或者一系列行键的表扫描。
使用map-reduce进行批操作
这种双重获取数据的方法使得HBase变得十分强大,典型地,在Hadoop中存储数据意味着它对离线或批处理方式分析是有益的(尤其是批处理分析),但是,对实时获取是不必要的。HBase通过key/value存储来支持实时分析,以及通过map-reduce支持批处理分析。让我们首先来看实时数据获取,作为key/value存储,key是行键,value是列簇的集合,如图2所示。
HBase as a Key/Value Store
如你在图2中看到的,key是我们所提到过的行键,value是列簇的集合。你可以通过key检索到value,或者换句话说,你可以通过行键“得到”行,或者你能通过给定起始和终止行键检索一系列行,这就是前面提到的表扫描。你不能实时的查询一个列的值,这就引出了一个重要的话题:行键的设计。
有两个原因令行键的设计十分重要:
表扫描是对行键的操作,所以,行键的设计控制着你能够通过HBase执行的实时/直接获取量。
当在生产环境中运行HBase时,它在HDFS上部运行,数据基于行键通过HDFS,如果你所有的行键都是以user-开头,那么很有可能你大部分数据都被分配一个节点上(违背了分布式数据的初衷),因此,你的行键应该是有足够的差异性以便分布式地通过整个部署。
你定义行键的方式取决于你想怎样存取那些行。如果你想以用户为基础存储数据,那么一个策略是利用字节队列在HBase中存储行键,所以我们可以创建一个用户ID的哈希(例如MD5或SHA-1),然后在哈希后面附上时间(long类型)。使用哈希有两个重点:(1)是它能够将value分散开,数据能够分布式地通过簇,(2)是它确保key的长度是一致的,以更加容易在表扫描中使用。
讲了足够多的理论,下面部分向你展示如何搭建HBase环境,并如何通过命令行使用。
你可以从Apache网站下载HBase,HBase团队推荐你在UNIX/Linux环境下安装HBase,如果你想在Windows下运行,你需要先安装Cygwin,并在这上运行HBase。当你下载完这些文件,解压到硬盘上。此外,你还需要安装Java环境,如果你还没有,从Oracle网站下载Java环境。在环境配置中添加名为HBASE_HOME的变量,值为你解压HBase文件的根目录,随后,执行bin文件夹下的start-hbase.sh脚本,它会在下面目录输出日志文件:
$HBASE_HOME/logs/
你可以在浏览器中输入下面URL测试是否安装正确:
HBase Management Screen
让我们开始用命令行操作HBase,在HBase bin目录下执行下面命令:
./hbase shell
你应该看到如下类似的输出:
1
2
3
4
5
6
7
HBase Shell; enter ‘help<RETURN>’ for list of supported commands.
Type “exit<RETURN>” to leave the HBase Shell
Version 0.98.5-hadoop2, rUnknown, Mon Aug 4 23:58:06 PDT 2014
hbase(main):001:0>
创建一个名为PageViews的表,并具有名为info的列簇:
1
2
3
4
5
hbase(main):002:0> create ‘PageViews’, ‘info’
0 row(s) in 5.3160 seconds
=> Hbase::Table – PageViews
每张表至少要有一个列簇,因此我们创建了info,现在,看看我们的表,执行下面list命令:
1
2
3
4
5
6
7
8
9
hbase(main):002:0> list
TABLE
PageViews
1 row(s) in 0.0350 seconds
=> [“PageViews”]
如你所见,list命令返回一个名为PageViews的表,我们可以通过describe命令得到表的更多信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
hbase(main):003:0> describe ‘PageViews’
DESCRIPTION ENABLED
‘PageViews’, {NAME => ‘info’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’,
REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE true
‘, MIN_VERSIONS => ‘0’, TTL => ‘FOREVER’, KEEP_DELETED_CELLS => ‘false’,
BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
1 row(s) in 0.0480 seconds
Describe命令返回表的详细信息,包括列簇的列表,这里我们创建的仅有一个:info,现在为表添加以下数据,下面命令是在info中添加新的行:
1
2
3
hbase(main):004:0> put 'PageViews', 'rowkey1', 'info:page', '/mypage'
0 row(s) in 0.0850 seconds
Put命令插入一条行键为rowkey1的新纪录,指定在info下的page列,插入值为/mypage的记录,我们随后可以通过get命令通过行键rowkey1查询到这条记录:
1
2
3
4
5
6
7
hbase(main):005:0> get ‘PageViews’, ‘rowkey1’
COLUMN CELL
info:page timestamp=1410374788088, value=/mypage
1 row(s) in 0.0250 seconds
你可以看到列info:page,或者更多具体的列,其值为/mypage,并带有时间戳表明该条记录是什么时候插入的。让我们在做表扫描之前再添加一行:
1
2
3
hbase(main):006:0> put ‘PageViews’, ‘rowkey2’, ‘info:page’, ‘/myotherpage’
0 row(s) in 0.0050 seconds
现在我们有两行记录了,让我们查询出PageViews表的所有记录:
1
2
3
4
5
6
7
8
9
hbase(main):007:0> scan ‘PageViews’
ROW COLUMN+CELL
rowkey1 column=info:page, timestamp=1410374788088, value=/mypage
rowkey2 column=info:page, timestamp=1410374823590, value=/myotherpage
2 row(s) in 0.0350 seconds
如前面所提到的,我们不能查询本身,但是我们可以对表进行scan操作,如果你执行scan table命令,它会返回表中所有行,这很有可能不是你想要做的。你可以给出行的范围来限制返回的结果,让我们插入一带有s开头行键的新记录:
1
hbase(main):012:0> put ‘PageViews’, ‘srowkey2’, ‘info:page’, ‘/myotherpage’
现在,如果我增加点限制,想查询行键在r和s之间的记录,可以使用如下结构:
1
2
3
4
5
6
7
8
9
hbase(main):014:0> scan ‘PageViews’, { STARTROW => ‘r’, ENDROW => ‘s’ }
ROW COLUMN+CELL
rowkey1 column=info:page, timestamp=1410374788088, value=/mypage
rowkey2 column=info:page, timestamp=1410374823590, value=/myotherpage
2 row(s) in 0.0080 seconds
这个scan返回了仅有s开头的记录,这个类比是基于全行键上的,所以rowkey1比r大,所有它被返回了。另外,scan的结果包含了所指范围的STARTROW,但不包含ENDROW,注意,ENDROW不是必须指定的,如果我们执行相同查询只给出了STARTROW,那么我们会得到行键比r大的所有记录。
1
2
3
4
5
6
7
8
9
10
11
hbase(main):013:0> scan ‘PageViews’, { STARTROW => ‘r’ }
ROW COLUMN+CELL
rowkey1 column=info:page, timestamp=1410374788088, value=/mypage
rowkey2 column=info:page, timestamp=1410374823590, value=/myotherpage
srowkey2 column=info:page, timestamp=1410375975965, value=/myotherpage
3 row(s) in 0.0120 seconds
HBase
HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可以在廉价PC上搭建起大规模结构化存储集群。
HBase是Google Bigtable的开源实现,类似于Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapRecue来处理Bigtable中的海量数据,HBase同样利用Hadoop MapRecue来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
特性:
强一致性读写:HBase不是“Eventual Consistentcy(最终一致性)”数据存储,这让它很适合高速计数聚合类任务;
自动分片(Automatic sharding):HBase表通过region分布在集群中,数据增长时,region会自动分割并重新分布;
RegionServer自动故障转移
Hadoop/HDFS集成:HBase支持开箱即用HDFS作为它的分布式文件系统;
MapRecue:HBase通过MapRecue支持大并发处理;
Java客户端API:HBase支持易于使用的Java API进行编程访问;
Thrift/REST API:HBase也支持Thrift和Rest作为非Java前端访问;
Block Cache和Bloom Filter:对于大容量查询优化,HBase支持Block Cache和Bloom Filter;
运维管理:HBase支持JMX提供内置网页用于运维。
HBase应用场景
HBase不适合所有场景。
首先,确信有足够多数据,如果有上亿或上千亿行数据,HBase是很好的备选。如果只有上千或上百万行,则用传统的RDBMS可能是更好的选择。因为所有数据如果只需要在一两个节点进行存储,会导致集群其他节点闲置。
其次,确信可以不依赖于RDBMS的额外特性。例如,列数据类型、第二索引、事务、高级查询语言等
最后,确保有足够的硬件。因为HDFS在小于5个数据节点时,基本上体现不出来它的优势。
虽然HBase能在单独的笔记本上运行良好,但这应仅当成是开发阶段的配置 。
HBase的优点
列可以动态增加,并且列为空就不存储数据,节省存储空间;
HBase可以自动切分数据,使得数据存储自动具有水平扩展功能;
HBase可以提供高并发读写操作的支持;
与Hadoop MapRecue相结合有利于数据分析;
容错性;
版权免费;
非常灵活的模式设计(或者说没有固定模式的限制);
可以跟Hive集成,使用类SQL查询;
自动故障转移;
客户端接口易于使用;
行级别原子性,即PUT操作一定是完全成功或者完全失败。
HBase的缺点
不能支持条件查询,只支持按照row key来查询;
容易产生单点故障(在只使用一个HMaster的时候);
不支持事务;
JOIN不是数据库层支持的,而需要用MapRecue;
只能在主键上索引和排序;
没有内置的身份和权限认证;
HBase与Hadoop/HDFS的差异
HDFS是分布式文件系统,适合保存大文件。官方宣称它并非普通用途的文件系统,不提供文件的个别记录的快速查询。另一方面,HBase基于HDFS,并能够提供大表的记录快速查询和更新。HBase内部将数据放到索引好的“StoreFiles”存储文件中,以便提供高速查询,而存储文件位于HDFS中。
HBase作为默认的大数据时代的存储,基本解决以下三大类的场景:
1、平台类:存放是平台的产品,就是其它软件的存储,比如目前很就行的Kylin,阿里内部的日志同步工具TT,图组件Titan等。此类存放的往往平台的数据,有时候往往是无业务含义的。作为平台的底层存储使用。
2、用户行为类:此类主要是面向各个业务系统。这里的用户不仅仅指的人,也包括物,比如物联网。在阿里主要还是人产生的数据,比如:淘宝收藏夹、交易数据、旺旺聊天记录等等。这里使用比较直接,就直接存放HBase,再读取。难度就是需要支持千万级别的并发写访问及读取,需要解决服务质量的问题。
3:报表类的需求:比如报表、大屏等,如阿里巴巴的天猫双十一大屏。
这里有详细介绍,可以进一步了解: