Cloudera Hadoop Hbase原理与应用

来源:互联网 发布:托福app软件推荐 编辑:程序博客网 时间:2024/05/20 02:26
1、Hbase基础

Hbase是一个在HDFS上开发的面相列得分布式数据库,如果需要实施地随机访问超大规模数据集,就可以使用Hbase这一Hadoop应用。

虽然数据库存储和检索的实现可以选择很多不同的策略,但是绝大多数解决办法都是关系型数据库技术的变种---不是为了大规模可伸缩的分布式处理设计的。许多厂家提供了复制和分区的解决方案,让数据库可以从单节点上扩展出去,但是难以维护。而Hbase从另一个方向解决了可伸缩的问题。它自低而上进行构建,能够简单地通过增加节点的方式来达到线性扩展。Hbase并不是关系型数据库,它不支持SQL。但是在特定的问题空间里,他能够做到RDBMS不能做到的事情,在廉价硬件上够贱的集群管理超大规模的稀疏表。

Hbase是面向列的开源数据库,该技术来源于Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另外,HBase基于列的而不是基于行的模式。

Hadoop是一个高容错、高延时的分布式文件系统和高并发的批处理系统,不适用于提供实时计算;HBase是可以提供实时计算的分布式数据库,数据被保存在HDFS分布式文件系统上,由HDFS保证期高容错性,但是再生产环境中,HBase是如何基于hadoop提供实时性呢? HBase上的数据是以StoreFile(HFile)二进制流的形式存储在HDFS上block块儿中;但是HDFS并不知道的hbase存的是什么,它只把存储文件是为二进制文件,也就是说,hbase的存储数据对于HDFS文件系统是透明的。下面是HBase文件在HDFS上的存储示意图。





总的来说,HBase特点可以总结如下几点:

1)、大:一个表可以有上亿行,上百万列。
2)、面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
3)、稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4)、无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
5)、数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
6)、数据类型单一:HBase中的数据都是字符串,没有类型。



2、Hbase架构





如上图所示,HBase架构中只有一个Master节点,称HMaster,还有多台RegionServer成为HRegionServer,每个RegionServer包含多个Region。


HBase访问接口:Java,REST,Thrift等


Master:集群的管理服务器,为RegionServer分配Region,负责RegionServer的负载均衡,处理schema更新请求


RegionServer:管理HBase的数据存储,维护Region,处理IO请求。


Zookeeper:保证集群的高可用性、存储Region的寻址入口,并实时监控RegionServer的状态,存储HBase的Schema。


可以看到,client访问hbase上数据的过程并不需要Master参与(寻址访问Zookeeper和RegionServer,数据读写访问RegionServer),Master仅仅维护Table和Region的元数据信息,负载很低。




3、Hbase数据模型

HBase的三维有序存储中的三维是指:rowkey(行主键),column key(columnFamily+< label>),timestamp(时间戳或者版本号)三部分组成的三维有序存储。

行健(Row Key):表的主键,表中的记录默认按照行健升序排序。rowkey是行的主键,它是以字典顺序排序的。所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。我们在根据rowkey范围查询的时候,我们一般是知道startRowkey,如果我们通过scan只传startRowKey : d开头的,那么查询的是所有比d大的都查了,而我们只需要d开头的数据,那就要通过endRowKey来限制。我们可以通过设定endRowKey为:d 开头,后面的根据你的rowkey组合来设定,一般是加比startKey大一位。

列族(Column Family):表在水平方向有一个或者多个列族组成,一个列族中可以由任意多个列组成,列族支持动态扩展,无需预先定义列的数量以及类型,所有列均以二进制格式存储,用户自行进行类型转换。所有的列族成员的前缀是相同的,如“abc:a1”和“abc:a2”两个列都属于abc这个列族。column key是第二维,数据按rowkey字典排序后,如果rowkey相同,则是根据column key来排序的,也是按字典排序。 们在设计table的时候要学会利用这一点。比如我们的收件箱。我们有时候需要按主题排序,那我们就可以把主题这设置为我们的column key,即设计为columnFamily+主题.,这样的设计。

时间戳(Timestamp):每次数据操作对应的时间戳,可以看作是数据的版本号。是第三维,这是个按降序排序的,即最新的数据排在最前面。这个就没有什么说的了。网上其他的博客也提到比较多。

表和区域(Table&Region):当表随着记录数不断增加而变大后,会逐渐分裂成多份,成为区域,一个区域是对表的水平划分,不同的区域会被Master分配给相应的RegionServer进行管理

单元格(Cell):表存储数据的单元。由{行健,列(列族:标签),时间戳}唯一确定,其中的数据是没有类型的,以二进制的形式存储。


4、Hbase shell

进入Hbase命令行:
[root@Test ~]$ hbase shell
17/10/12 09:32:20 INFO Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.7.2, rUnknown, Fri Jul 22 12:20:40 PDT 2016

列出数据表:
hbase(main):001:0> list

使用create命令来创建一个新的表。在创建的时候,必须指定表名和列族名:
hbase(main):001:0>create ‘test’,‘cf’

获得表描述:
hbase(main):001:0>describe ‘test’

Hbase中有两个用于查看数据的命令:get和scan,前者查看某一个单元格数据,后者用于查看某个表的全部数据。

获得第一行数据:
hbase(main):001:0>get ‘test’,‘1’

一次性扫描全表数据:
hbase(main):001:0>scan ‘test’

删除第一行某个单元格数据:
hbase(main):001:0>delete ‘test’,‘1’,‘name’

删除第一行全部数据:
hbase(main):001:0>deleteall ‘test’,‘1’

删除一张表:
hbase(main):001:0>drop ‘test’

退出Hbase:
hbase(main):001:0>exit



5、Hbase调优