HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行,另外一方面里用 了BigTable的高效数据组织形式.可以说HBase为海量数据的real-time相应提供了很好的一个开源解决方案.据说在某运营商中使用类似于 BigTable(个人猜测应该就是HBase)的技术可以在两秒时间内从2TB数据中查找到某条话费记录.而这是原来该运营商使用Oracle数据库所 无法解决的问题.
对于HBase使用的类似与BigTable的技术我们这里就不仔细描述,可以参考google的论文以及网上的一些相关资料.另外,HBase的配置在HBase的官方文档中有很详细的描述.可以参见相关文档.
HBase提供了一个类似于mysql等关系型数据库的shell.通过该shell我们可以对HBase的内的相关表以及列族进行控制和处理.HBase shell的help命令比较详细的列出了HBase所支持的命令.具体使用方法可以参见其文档.
这里我们用一个学生成绩表作为例子,对HBase的基本操作和基本概念进行讲解:
下面是学生的成绩表:
name grad course:math course:art
Tom 1 87 97
Jerry 2 100 80
这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族.
有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!
1, 建立一个表格 scores 具有两个列族grad 和courese
hbase(main):002:0> create 'scores', 'grade', 'course'
0 row(s) in 4.1610 seconds
2,查看当先HBase中具有哪些表
hbase(main):003:0> list
scores
1 row(s) in 0.0210 seconds
3,查看表的构造
hbase(main):004:0> describe 'scores'
{NAME => 'scores', IS_ROOT => 'false', IS_META => 'false', FAMILIES => [{NAME => 'course', BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}, {NAME => 'grade', BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}]}
1 row(s) in 0.0130 seconds
4, 加入一行数据,行名称为 Tom 列族grad的列名为”” 值位1
hbase(main):005:0> put 'scores', 'Tom', 'grade:', '1'
0 row(s) in 0.0070 seconds
5,给Tom这一行的数据的列族添加一列 <math,87>
hbase(main):006:0> put 'scores', 'Tom', 'course:math', '87'
0 row(s) in 0.0040 seconds
6,给Tom这一行的数据的列族添加一列 <art,97>
hbase(main):007:0> put 'scores', 'Tom', 'course:art', '97'
0 row(s) in 0.0030 seconds
7, 加入一行数据,行名称为 Jerry 列族grad的列名为”” 值位2
hbase(main):008:0> put 'scores', 'Jerry', 'grade:', '2'
0 row(s) in 0.0040 seconds
8,给Jerry这一行的数据的列族添加一列 <math,100>
hbase(main):009:0> put 'scores', 'Jerry', 'course:math', '100'
0 row(s) in 0.0030 seconds
9,给Jerry这一行的数据的列族添加一列 <art,80>
hbase(main):010:0> put 'scores', 'Jerry', 'course:art', '80'
0 row(s) in 0.0050 seconds
10,查看scores表中Tom的相关数据
hbase(main):011:0> get 'scores', 'Tom'
COLUMN CELL
course:art timestamp=1224726394286, value=97
course:math timestamp=1224726377027, value=87
grade: timestamp=1224726360727, value=1
3 row(s) in 0.0070 seconds
11,查看scores表中所有数据
hbase(main):012:0> scan 'scores'
ROW COLUMN+CELL
Tom column=course:art, timestamp=1224726394286, value=97
Tom column=course:math, timestamp=1224726377027, value=87
Tom column=grade:, timestamp=1224726360727, value=1
Jerry column=course:art, timestamp=1224726424967, value=80
Jerry column=course:math, timestamp=1224726416145, value=100
Jerry column=grade:, timestamp=1224726404965, value=2
6 row(s) in 0.0410 seconds
12,查看scores表中所有数据courses列族的所有数据
hbase(main):013:0> scan 'scores', ['course:']
ROW COLUMN+CELL
Tom column=course:art, timestamp=1224726394286, value=97
Tom column=course:math, timestamp=1224726377027, value=87
Jerry column=course:art, timestamp=1224726424967, value=80
Jerry column=course:math, timestamp=1224726416145, value=100
4 row(s) in 0.0200 seconds
上 面就是HBase的基本shell操作的一个例子,可以看出,hbase的shell还是比较简单易用的,从中也可以看出HBase shell缺少很多传统sql中的一些类似于like等相关操作,当然,HBase作为BigTable的一个开源实现,而BigTable是作为 google业务的支持模型,很多sql语句中的一些东西可能还真的不需要.
当然,通过程序我们也可以对HBase进行相关的操作.下面的程序就完成了上面shell操作的内容:
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.util.Map;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.io.BatchUpdate;
import org.apache.hadoop.hbase.io.RowResult;
import org.apache.hadoop.hbase.io.Cell;
import org.apache.hadoop.hbase.util.Writables;
public class HBaseBasic {
public static void main(String[] args) throws Exception {
HBaseConfiguration config = new HBaseConfiguration();
HBaseAdmin admin = new HBaseAdmin(config);
if (admin.tableExists("scores")) {
System.out.println("drop table");
admin.disableTable("scores");
admin.deleteTable("scores");
}
System.out.println("create table");
HTableDescriptor tableDescripter = new HTableDescriptor("scores".getBytes());
tableDescripter.addFamily(new HColumnDescriptor("grade:"));
tableDescripter.addFamily(new HColumnDescriptor("course:"));
admin.createTable(tableDescripter);
HTable table = new HTable(config, "scores");
System.out.println("add Tom's data");
BatchUpdate tomUpdate = new BatchUpdate("Tom");
tomUpdate.put("grade:", Writables.getBytes(new IntWritable(1)));
tomUpdate.put("course:math", Writables.getBytes(new IntWritable(87)));
tomUpdate.put("course:art", Writables.getBytes(new IntWritable(97)));
table.commit(tomUpdate);
System.out.println("add Jerry's data");
BatchUpdate jerryUpdate = new BatchUpdate("Jerry");
jerryUpdate.put("grade:", Writables.getBytes(new IntWritable(2)));
jerryUpdate.put("course:math", Writables.getBytes(new IntWritable(100)));
jerryUpdate.put("course:art", Writables.getBytes(new IntWritable(80)));
table.commit(jerryUpdate);
for (RowResult row : table.getScanner(new String[] { "course:" })) {
System.out.format("ROW\t%s\n", new String(row.getRow()));
for (Map.Entry<byte[], Cell> entry : row.entrySet()) {
String column = new String(entry.getKey());
Cell cell = entry.getValue();
IntWritable value = new IntWritable();
Writables.copyWritable(cell.getValue(), value);
System.out.format(" COLUMN\t%s\t%d\n", column, value.get());
}
}
}
}
输出如下:
drop table
09/07/11 08:51:59 INFO client.HBaseAdmin: Disabled scores
09/07/11 08:51:59 INFO client.HBaseAdmin: Deleted scores
create table
add Tom's data
add Jerry's data
ROW Tom
COLUMN course:art 97
COLUMN course:math 87
ROW Jerry
COLUMN course:art 80
COLUMN course:math 100
分享到:
相关推荐
HBase入门与使用,可以了解如何使用HBase
hbase入门到精通
第1章 HBase入门_v1.3.docx
一、 HBase技术介绍 HBase简介 HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源...
hbase的使用 相关,包括spark、hadoop在hbase的使用,很好的资源。
本文接着上期介绍的”简单了解Hbase及快速入手之入门教程_01“,着重介绍了hbase的伪分布式部署以及hbase的过滤器。适合刚入门或者刚接触的小伙伴参考。
Hadoop之Hbase从入门到精通
这是一个大牛的学习笔记,讲解详细,思路清晰,按步就班,是学习hadoop hbase的入门资料,值得入门人员拥用!
包含了hbase的基本知识以及官方文档 调优的内容
HBase
进入HBase数据库 hbase shell 注意HBase Shell 中的删除键没用,要用【Ctrl+Backspace】,每个命令之后不需要分号(;)结束。 HBase帮助命令: hbase> help 'create' 命名空间 列出所有命名空间 hbase> list_...
英文书籍 目前还没有中文版 英文名为The hbase definition guide 我看过 很不错 推荐给大家
│ Day15[Hbase 基本使用及存储设计].pdf │ ├─02_视频 │ Day1501_Hbase的介绍及其发展.mp4 │ Day1502_Hbase中的特殊概念.mp4 │ Day1503_Hbase与MYSQL的存储比较.mp4 │ Day1504_Hbase部署环境准备.mp4 │ Day...
第一章 HBase入门 1. 简介 2. 集群搭建 3. HBase数据模型 4. 常用shell操作 5. shell管理操作 6. Hbase Java编程 7. HBase高可用 8. HBase架构 第二章 陌陌海量存储案例 1. 案例介绍 2. 打招呼消息数据集介绍 3. ...
hadoop hbase从入门到精通 这文档不错, 佩服作者的实力!
hbase从入门到编程 - 文档.pdf 。hbase从入门到编程 - 文档.pdf 。hbase从入门到编程 - 文档.pdf 。
个人整理Hbase知识点,外加本人一些理解,整理为xmind形式,供有需要的朋友下载。
在下面的流程图中,我们使用下面这样一个红色小图标来表示该数据所在的位置:数据位置标记HBase中提供了如下几种主要的接口:HBase的基础API,应用最为广泛。基于Shell的命令行操作接口,基于JavaClientAPI实现。...