Hadoop中的Hbase

来源:互联网 发布:U递索引超出了数组界限 编辑:程序博客网 时间:2024/05/21 21:42


一,Hbase的介绍与个人理解

1,Hbase是一个分布式数据库,主要用来做联机的事务处理。它是一个No SQL 数据库。里面存储的数据都是K,V类型的数据,与另一个分布式数据库Redis类似。而不同于Mysql中的数据库表模型(三范式)。

2,Hbase具备实时的增删改查功能,以后我们做实时的数据分析,可以将结果存入Hbase,Redis中。分布式数据库的优点:可以动态扩容,负载能力可以动态扩展。

3,Hbase应用场景,用来查询大数据量的数据,且查询逻辑简单,实时查询。

二,Hbase的角色分配

1,Hbase中分为两大角色Master,Region Server。Master主要作用:负责表region的分配;   负责region server的状态监控;   负责region server的负载均衡。

Region server 负责表数据的增删改查。

Master 与 Region server之间通过zookeeper来协调。

Hbase依赖于HDFS,zookeeper(配置hase-site.xml)

最终结果存储在HDFS上,在Hbase上的配置文件中配置了HDFS,与zookeeper的位置信息。(Hbase的jar包中包含zookeeper。需要在配置文件中(hbase-env.sh)指定为false :(export HBASE_MANAGES_ZK=false)。不要启用Hbase中的zookeeper,因为以后集群中可能有很多的应用程序要依赖zookeeper来管理,如果启动两台,会出现端口冲突的问题。)

客户端查询过程

首先zookeeper中会存储顶级索引表。(顶级索引表记录了哪些表在哪些Region Server上)

1,客户端请求zookeeper查询顶级索引表。

2,从索引表中查询用户表所在位置。

3,查询用户表的数据。

如何理解Region Server

首先理解HBASE就是一个分布式的数据库,里面存储大量的表数据。现在假如有一张表t_order这张表可能特别大,里面科能存储了上百万条表数据,表数据会根据范围划分为不同的region。Region Server就负责管理具体的region。

真正的数据是存储在HDFS上的,假如某一台Region Server宕机了,数据并不会丢失。Master会把管理宕机的那台机器的职责,交给其他的Region Server。而相应的zookeeper中的索引表信息也会发生变化。


问题一:假如Master挂机了,还能继续查询吗?

是可以的。因为Maste并不负责具体的事务。客户端只要请求zookeeper,然后知道索引表信息后,就可以根据索引表信息,去找相应的Region Server进行查询。但是Master宕机时间如果过长,就可能造成某台Region Server负载过大,造成负载不均衡的问题。如果此时又有Region Server宕机了,就不能进行查询了。因为Mater宕机后,就不能均衡负载了,也不能将宕机的资源转移给其他的Region Server了。所以为了高可用可以准备两台master,一个是active状态,一个是standBy状态。


HBASE中的表模型

1,一个表,有表明

2,一个表可以分为多个列族(不同列族的数据会存储在不同的文件中)

3,表中的每一行有一个“行健 rowkey”,而且行健在表中不能重复。

4,表中的每一对kv数据称作是一个cell

5,HBASE可以对数据存储多个历史版本(历史版本数量可以配置)

6,整张表由于数据量过大,会被切分成若干个region(用rowkey范围标识),不同的region的数据也存储在不同的文 件中。



插入到hbase中去的数据,hbase会自动排序存储:

排序规则:  首先看行键,然后看列族名,然后看列(key)名;按字典顺序

 

Hbase的这个特性跟查询效率有极大的关系

比如:一张用来存储用户信息的表,有名字,户籍,年龄,职业....等信息

然后,在业务系统中经常需要:

查询某个省的所有用户

经常需要查询某个省的指定姓的所有用户

 

思路:如果能将相同省的用户在hbase的存储文件中连续存储,并且能将相同省中相同姓的用户连续存储,那么,上述两个查询需求的效率就会提高!!!

 

做法:将查询条件拼到rowkey内


HBASE的表中存储的数据类型

HBASE中只支持byte[]

此处的byte[]包括:rowkey,key,value,列族名,表名



问题一:列族划分多好还是少好?

要牢牢把握住:不同列族中的数据是存储在不同的文件中的。所以可以分为两种情况来说。假如我们要经常查询rowkey的全部内容,就不要划分列族。因为不同列族将来会将数据存储到不同的文件中,如果划分列族过多,就需要查询不同的文件,效率肯定变低。假如我们经常要做的查询,只是行健中的某些内容。就可以将经常进行查询的内容放在一个列族中,不经常用的内容放在另一个列族中,这样进行查询的时候就可以不查那些内容了。总结来说都是为了执行效率更快。





三,Hbase部署时注意点

因为以后Hbase中的数据要存储在HDFS中,region server最好的部署方案是部署在datanode所在的物理机集群上,因为以后region server 负责读取表数据,而数据就存储在datanode的block中,如果所要读取的数据恰好在本机所在的datanode上,就避免了网络传输,使查询速度更快。


四,命令行的操作

1,如何在命令行启动一个Hbase客户端:bin/hbase shell

2,创建一张表

create't_user_info','base_info','extra_info'第一个字段表示表名,后面的字段表示列族名。不要加分号

3,查询有多少张表 list

4,查看表定义 desc 't_user_info'

5,插入数据 put't_user_info','001','base_info:username','zhangsan'      表明+行健+列族(+key)+value

6,查询数据 scan 't_user_info'   整张表

                     get 't_user_info','001'   指定行健

7,删除    delete't_user_info','001','base_info:sex' 删除一个KV数据

                 deleteall't_user_info','001'   删除整行数据

                 disable 't_user_info'   删除整张表 drop 't_user_info'

              








原创粉丝点击