from: http://blog.jobbole.com/83614/

概念:行键,列簇

Hbase 是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从 Hadoop的MapReduce程序模型中获益。这意味着在一组商业硬件上存储许多具有数十亿行和上百万列的大表。除去Hadoop的优势,HBase 本身就是十分强大的数据库,它能够融合key/value存储模式带来实时查询的能力,以及通过MapReduce进行离线处理或者批处理的能力。总的来 说,Hbase能够让你在大量的数据中查询记录,也可以从中获得综合分析报告。

谷歌曾经面对过一个挑战的问题:如何能在整个互联网上提供实时的搜索结果?答案是它本质上需要将互联网缓存,并重新定义在这样庞大的缓存上快速查找的新方法。为了达到这个目的,定义如下技术:

  • 谷歌文件系统GFS:可扩展分布式文件系统,用于大型的、分布式的、数据密集型的应用程序。
  • BigTable:分布式存储系统,用于管理被设计成规模很大的结构化数据:来自数以千计商用服务器的PB级别的数据。
  • MapReduce:一个程序模型,用于处理和生成大数据集的相关实现。

在谷歌发布这些技术的文档之后, 不久以后我们就看到了它们的开源实现版本 ,就在2007年,Mike Cafarella发布了BigTable开源实现的代码,他称其为HBase,自此,HBase成为Apache的顶级项目,并运行在 Facebook,Twitter,Adobe……仅举几个例子。

HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:

  • 行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。
  • 列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。
  • 列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。
  • 版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。

Figure 1.  HBase Four-Dimensional Data Model

如图1中所示,通过行键获取一个指定的行,它由一个或多个列簇构成,每个列簇有一个或多个列修饰符(图1中称为列),每列又可以有一个或多个版本。 为了获取指定数据,你需要知道它的行键、列簇、列修饰符以及版本。当设计HBase数据模型时,对考虑数据是如何被获取是十分有帮助的。你可以通过以下两 种方式获得HBase数据:

  • 通过他们的行键,或者一系列行键的表扫描。
  • 使用map-reduce进行批操作

这种双重获取数据的方法使得HBase变得十分强大,典型地,在Hadoop中存储数据意味着它对离线或批处理方式分析是有益的(尤其是批处理分 析),但是,对实时获取是不必要的。HBase通过key/value存储来支持实时分析,以及通过map-reduce支持批处理分析。让我们首先来看 实时数据获取,作为key/value存储,key是行键,value是列簇的集合,如图2所示。

Figure 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,在写本文时,最新的版本是0.98.5,HBase团队推荐你在 UNIX/Linux环境下安装HBase,如果你想在Windows下运行,你需要先安装Cygwin,并在这上运行HBase。当你下载完这些文件, 解压到硬盘上。此外,你还需要安装Java环境,如果你还没有,从Oracle网站下载Java环境。在环境配置中添加名为HBASE_HOME的变量, 值为你解压HBase文件的根目录,随后,执行bin文件夹下的start-hbase.sh脚本,它会在下面目录输出日志文件:

$HBASE_HOME/logs/

你可以在浏览器中输入下面URL测试是否安装正确:

http://localhost:16010

如果安装正确,你应该看到下面界面。

Figure 3.  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是一种NoSQL,通常被称为Hadoop Database,它是开源并基于Google Big Table白皮书,HBase运行在HDFS之上,因此使它具有高度可扩展性,并支持Hadoop map-reduce程序设计模型。HBase有两种访问方式:通过行键进行随机访问;通过map-reduce脱机或批访问。

本文讲述了HBase的特征和它的优点,并简要回顾了行键设计的重点之处,它还向你展示了如何在本地配置HBase环境,使用命令创建表、插入数据、检索指定行以及最后如何进行scan操作。

下篇文章,“使用Java开发HBase”将展示HBase的程序接口并举例介绍如何使用Java来操作HBase。在本系列的最后一篇文章“使用MapReduce进行HBase数据分析”中,我们将介绍如何使用map-reduce进行脱机/批处理。

[转] HBase的特征和优点的更多相关文章

  1. HBase在特征工程中的应用

    前言HBase是一款分布式的NoSQL DB,可以轻松扩展存储和读写能力. 主要特性有: 按某精确的key获取对应的value(Get) 通过前缀匹配一段相邻的数据(Scan) 多版本 动态列 服务端 ...

  2. Hbase学习04

    3.2.4 反向时间戳 反向扫描API HBASE-4811(https://issues.apache.org/jira/browse/HBASE-4811)实现了一个API来扫描一个表或范围内的一 ...

  3. Hbase数据IO

    场景及方案分析 场景1:logs --> HBase logs -> flume -> hfile -> import -> HBase (实时) csv导入HBase ...

  4. hbase.client.RetriesExhaustedException: Can't get the locations hive关联Hbase查询报错

    特征1: hbase.client.RetriesExhaustedException: Can't get the locations 特征2: hbase日志报错如下:org.apache.zoo ...

  5. HBase概念入门

    HBase简介 HBase基于Google的BigTable论文而来,是一个分布式海量列式非关系型数据库系统,可以提供大规模数据集的实时随机读写. 下面通过一个小场景认识HBase存储.同样的一个数据 ...

  6. MongoDB、Redis、elasticSearch、hbase的对比

    MongoDB.Redis.elasticSearch.hbase的对比 MongoDB 优点: (1) 最大的特点是表结构灵活可变,字段类型可以随时修改. (2) 插入数据时,不必考虑表结构的限制. ...

  7. Bigtable:A Distributed Storage System for Strctured Data

    2006 年10 月Google 发布三架马车之一的<Bigtable:A Distributed Storage System for Strctured Data>论文之后,Power ...

  8. [转]在 Web 项目中应用 Apache Shiro

    目录[-] 用户权限模型 图 1. 用户权限模型 认证与授权 Shiro 认证与授权处理过程 Shiro Realm 清单 1. 实现自己的 JDBC Realm 为何对 Shiro 情有独钟 与 S ...

  9. 在 Web 项目中应用 Apache Shiro

    Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证.授权.加密.会话管理等功能.认证和授权为权限控制的核心,简单来说,"认证"就是证明你是谁? Web ...

随机推荐

  1. JavaScript多线程初步学习

    一.多线程理解 首先,我们要理解什么是多线程,百度百科上说:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一 ...

  2. 如何参与github上的开源项目

    今晚比较闲,于是乎装修了一下博客,顺便将一块心病(怎么参加github上的开源项目)解决了,最后发个文章总结下 这些是参考的链接 http://blog.csdn.net/five3/article/ ...

  3. mysql命令行导出导入数据库

    一.MYSQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二. ...

  4. SVN 使用的简单整理

    1. 在SVN服务器上创建存储Dir,并和个人主机建立联系.      现在SVN服务器上创建一个存储文件夹svn_storeDir.然后在个人电脑上建立一个本地文件夹local_Dir.    进入 ...

  5. MySql拾遗

    1.“1130-Host is not allowed to connect to this MySQL server” 满世界的人都告诉你,到user表中把root + localhost的“loc ...

  6. ubuntu 设置root启动

    http://www.linuxidc.com/Linux/2012-05/60806.htm sudo -s 输入普通用户的password 回车即可进入root权限 vi /etc/lightdm ...

  7. 以Facebook为案例剖析科技公司应有的工具文化

    http://www.36kr.com/p/146507.html 编者按:本文由 @王淮Harry哥 撰写,摘自他即将出版的新书.王淮是 Facebook 早期员工,中国藉第二位工程师第一位研发经理 ...

  8. JavaScript encodeURI() 函数

    encodeURI() 函数可把字符串作为 URI 进行编码. -------------------------------------------------------------------- ...

  9. 深入浅出 Java Concurrency (3): 原子操作 part 2

    转:http://www.blogjava.net/xylz/archive/2010/07/02/325079.html 在这一部分开始讨论数组原子操作和一些其他的原子操作. AtomicInteg ...

  10. 【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意: 一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边 ...