[转] HBase的特征和优点

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:60010

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

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进行脱机/批处理。

时间: 2024-10-07 05:52:05

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

hbase.client.RetriesExhaustedException: Can&#39;t get the locations hive关联Hbase查询报错

特征1: hbase.client.RetriesExhaustedException: Can't get the locations 特征2: hbase日志报错如下:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/hbaseid 特征3: unexpected error, closing socket connection a

Bigtable:A Distributed Storage System for Strctured Data

2006 年10 月Google 发布三架马车之一的<Bigtable:A Distributed Storage System for Strctured Data>论文之后,Powerset 公司就宣布 HBase 在 Hadoop 项目中成立,作为子项目存在.后来,在2010 年左右逐渐成为 Apache 旗下的一个顶级项目.可能是实际应用中包装得太好,很多人对于 HBase 的认识止步于 NoSQL .今天,蚂蚁金服的南俊从基础开始讲起,希望有助于增强大家在实际业务中对 HBase 的

在 Web 项目中应用 Apache Shiro

Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证.授权.加密.会话管理等功能.认证和授权为权限控制的核心,简单来说,"认证"就是证明你是谁? Web 应用程序一般做法通过表单提交用户名及密码达到认证目的."授权"即是否允许已认证用户访问受保护资源.关于 Shiro 的一系列特征及优点,很多文章已有列举,这里不再逐一赘述,本文重点介绍 Shiro 在 Web Application 中如何实现验证码认证以及如何实现单点登录. 用户权限模型

序列化之protobuf与avro对比(Java)

最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了protobuf的一些弊端,比如需要生成相应的文件类,和业务绑定太紧密,所以在看了AVRO之后发现它完美解决了这个问题. 下面记录下对这两种序列化工具的入门与测评. 一.protobuf基本操作 protobuf简介: Protocol Buffers (a.k.a., protobuf) are Goo

《机器学习实战》——决策树

原理(ID3): 依次选定每个特征,计算信息增益(基本信息熵-当前信息熵),选择信息增益最大的一个作为最佳特征: 以该特征作为树的根节点,以该最佳特征的每一个值作为分支,建立子树: 重复上述过程,直到:1) 所有类别一致 2) 特征用尽 优点: 简单容易理解: 可处理有缺失值的特征.非数值型数据: 与训练数据拟合很好,复杂度小 缺点: 选择特征时候需要多次扫描与排序,适合常驻内存的小数据集: 容易过拟合: 改进: ID3算法偏向取值较多的特征(宽且浅的树),适合离散型数据,难处理连续型数据.香农

深究angularJS系列 - 初识

AngularJS是什么?概念?特征?优点?缺点?那都不是事,话不多说,直接搞起O(∩_∩)O~~ 安装 1.官网http://angularjs.org/下载安装 2.开源库http://www.bootcdn.cn/下载安装 3.bower(一种包管理器)下载安装 bower install angular MVC MVC即"模型 - 视图 - 控制器"的简称,一种设计模式,MVC的从逻辑上将代码清晰地分割为三层,这样可以对每个部分进行独立开发.测试和维护. 模型/Model -

How great leaders inspire action

sinmon sinek How do you explain when things don't go as we assume? Or better, how do you explain when others are able to achieve things that seem to defy all of the assumptions? For example: Why is Apple so innovative? Year after year, after year, th

视频数据的预处理

视频数据的预处理 视频数据的预处理主要可分为视频镜头分割.关键帧提取.特征提取三个步骤. 1.视频镜头分割(镜头边界检测) 镜头分割是视频处理的第一步,是后续视频处理分析的基础.同一镜头内视频特征的变化主要由两个因素造成:对象/摄像机的运动和光线的变化.镜头之间的转换方式主要有两类,即突变(CutTransition)和渐变(Gradual Transition). (1)像素差异法 首先定义一个像素差异测度,然后计算连续两帧图像的帧间差异并用其与一个预先设定的阈值作比较,大于该阈值,则认为场景

工作岗位分析纯干货

第一个问题,让小伙伴们了解工作分析中的术语 工作要素:工作中不能再继续分解的最小动作单位. 任务:为达到某一明确目的所从事的一系列活动. 职责:组织要求的在特定岗位上需要完成的任务. 职权:依法赋予的完成特定任务所需要的权力. 职位:即岗位.是组织要求个体完成的一项或多项责任以及为此赋予个体的权力的总和. 职务:即工作.是按规定担任的工作或为实现某一目的而从事的明确的工作行为,由一组主要职责相似的职位所组成. 工作族(职系):由两个或两个以上有相似特点的工作组成. 职业:由不同时间内不同组织中的