《Hadoop生态》——第二章 数据库与数据管理——HBase

HBase


这里写图片描述

许可证: Apache License, Version 2.0
活跃度:
目的: 可随机访问的NoSQL数据库
官方地址: https://hbase.apache.org
Hadoop集成: 完全集成

很多情况下你拥有的数据可能是稀疏的。也就是说数据由许多属性,但是每个观察则只有这些属性的少数一部分。例如,你可能想在一个帮助服务台的应用中要一个有各种标签的表格。与网络问题或者是密码丢失,或者是系统备份问题相比,电子邮件的标签可能有不同的信息(属性或者是列)。也有其他的情景,在你的数据中,数据的列或者属性有非常大的数值,比如“country”或者“state”。这些例子都可能让你回考虑使用HBase。

HBase是一个NoSQL数据库系统,它已经包含在标准的Hadoop分布式系统中了。逻辑上讲,它是key-value存储的。这就意味着用key和与它们相关的数字箱(或者是列)定义行,相关的值在数字箱中保存。唯一的数据类型是字节串。从物理角度讲,一些相似的列可以一起存储在列族(column families)中。大部分情况下,访问HBase都是用Java的,但是也有用Pig,Thrift,Jython(基于Python)及其它语言的API访问HBase。HBase一般不用MapReduce的方式访问。它又一个shell接口做交互使用。

HBase经常用于有许多稀疏行的应用。也就是说每一行值用了少数几个定义的列。通过主键或者定义的key值访问元素是相当快(正如Hadoop的做法)的。它具有很高的伸缩性并且相当快。不像传统的HDFS应用一样,它允许随机访问行,而不是连续查询。

虽然要比MapReduce快,但是你不应该将HBase用在任何的交易需求,或者是相关性分析上。
它不支持二级索引,所以要找到带有已知值的已知列的所有行是相当繁琐的,而且必须在应用层解决这个问题。HBase没有Join操作;这就使得必须用其他的应用。在应用层你必须提供安全性;可以搭建像Accumulo这的工具。

虽然在今天Cassandra和MongoDB可能依然处于NoSQL数据库的主导地位,但是HBase正在越来越流行并且在不久的将来很可能成为潮流。

教程链接

在 Coreservlets.com的人们已经把很多Hadoop的教程包括一些关于HBase系列都整理出来了。在网上也有很多视频教程,我们认为是非常有用的。

示例代码

在本例中,你的目的是找出电影Dune的平均评论。每个电影评论都有三个元素:评论者的名字,电影名,打分(0-10的整数)。用HBase Shell做一下这个例子:

hbase(main):008:0> create 'reviews', 'cf1'
0 row(s) in 1.0710 seconds
hbase(main):013:0> put 'reviews', 'dune-marshall', \
hbase(main):014:0> 'cf1:score', 1
0 row(s) in 0.0370 seconds
hbase(main):015:0> put 'reviews', 'dune-kevin', \
hbase(main):016:0> 'cf1:score', 10
0 row(s) in 0.0090 seconds
hbase(main):017:0> put 'reviews', 'casablanca-kevin', \
hbase(main):018:0> 'cf1:score', 5
0 row(s) in 0.0130 seconds
hbase(main):019:0> put 'reviews', 'blazingsaddles-b0b', \
hbase(main):008:0> create 'reviews', 'cf1'
0 row(s) in 1.0710 seconds
hbase(main):013:0> put 'reviews', 'dune-marshall', \
hbase(main):014:0> 'cf1:score', 1
0 row(s) in 0.0370 seconds
hbase(main):015:0> put 'reviews', 'dune-kevin', \
hbase(main):016:0> 'cf1:score', 10
0 row(s) in 0.0090 seconds
hbase(main):017:0> put 'reviews', 'casablanca-kevin', \
hbase(main):018:0> 'cf1:score', 5
0 row(s) in 0.0130 seconds
hbase(main):019:0> put 'reviews', 'blazingsaddles-b0b', \

现在你已经用一个高效的范围扫描检索出两行,但是如何才能得到平均值呢?在HBase Shell中,这是做不到的,你可以利用HBase Java API抽取值,但是它又没有内置的聚合函数来计算平均或者和,所以你需要用你自己写的Java代码搞定这件事情。

HBase中的行key的选择是十分关键的。如果你想找出Kevin评论过的所有电影的平均打分,那么你需要对表做一个全扫描,对于非常大的数据库来讲可能是一个十分耗时的任务。你可能想要两个版本的表格,一个有reviewer-film给定的行key,另一个有film-reviewer。然后你得确保同步的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值