HBase概述
Hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从Hadoop的MapReduce程序模型中获益。这意味着在一组商业硬件上存储许多具有数十亿行和上百万列的大表。除去Hadoop的优势,HBase本身就是十分强大的数据库,它能够融合key/value存储模式带来实时查询的能力,以及通过MapReduce进行离线处理或者批处理的能力。总的来说,Hbase能够让你在大量的数据中查询记录,也可以从中获得综合分析报告。
HBase不是一个关系型数据库,它需要不同的方法定义你的数据模型,HBase实际上定义了一个四维数据模型,下面就是每一维度的定义:
- 行键:每行都有唯一的行键,行键没有数据类型,它内部被认为是一个字节数组。
- 列簇:数据在行中被组织成列簇,每行有相同的列簇,但是在行之间,相同的列簇不需要有相同的列修饰符。在引擎中,HBase将列簇存储在它自己的数据文件中,所以,它们需要事先被定义,此外,改变列簇并不容易。
- 列修饰符:列簇定义真实的列,被称之为列修饰符,你可以认为列修饰符就是列本身。
- 版本:每列都可以有一个可配置的版本数量,你可以通过列修饰符的制定版本获取数据。
如图,通过行键获取一个指定的行,它由一个或多个列簇构成,每个列簇有一个或多个列修饰符(图中称为列),每列又可以有一个或多个版本。为了获取指定数据,你需要知道它的行键、列簇、列修饰符以及版本。当设计HBase数据模型时,对考虑数据是如何被获取是十分有帮助的。你可以通过以下两种方式获得HBase数据:
- 通过他们的行键,或者一系列行键的表扫描
- 使用map-reduce进行批操作
HBase通过key/value存储来支持实时分析,以及通过map-reduce支持批处理分析。让我们首先来看实时数据获取,作为key/value存储,key是行键,value是列簇的集合。由于HBase是Key/Value存储的,所以行键的设计非常重要。有以下两个原因:
- 表扫描是对行键进行操作的,行键的设计控制着你能够通过HBase执行的实时/直接获取量
- 当在生产环境中运行HBase时,它在HDFS上部运行,数据基于行键通过HDFS,如果你所有的行键都是以user-开头,那么很有可能你大部分数据都被分配一个节点上(违背了分布式数据的初衷),因此,你的行键应该是有足够的差异性以便分布式地通过整个部署。
HBase与关系型数据库比较
比较项 | HBase | 关系型数据库 |
---|---|---|
存储方式 | 列式存储,不同列的文件是分离的 | 行式存储 |
扩展性 | 列不固定,方便扩展 | 固定列 |
数据查询 | 只能通过RowKey查询 | 多种查询 |
数据类型 | 只有字符 | 丰富的类型 |
数据操作 | 表是分离的,表与表没有关系 | 有各种连接操作 |
数据维护 | 更新是插入新的数据 | 修改数据 |
关系型数据库的优势:
- 保持数据的一致性(事务处理)
2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处) - 可以进行Join等复杂查询
其中能够保持数据的一致性是关系型数据库的最大优势。
关系型数据库的不足:
- 大量数据的写入处理
- 为有数据更新的表做索引或表结构(schema)变更
- 字段不固定时应用
- 对简单查询需要快速返回结果的处理
HBase的Shell操作
#创建blog_user表格
create 'blog_user','userInfo'
#往表格写数据
put'blog_user','www.aboutyun.com','userInfo:user_Name','aboutyun'
put'blog_user','www.aboutyun.com','userInfo:user_Password','aboutyun'
#扫描表格数据
scan 'blog_user'
#删除表格列的数据
delete 'blog_user','www.aboutyun.com','userInfo:user_Password'
#删除记录
deleteall 'blog_user','www.aboutyun.com'