赞
踩
1,Hbase是一个分布式数据库,主要用来做联机的事务处理。它是一个No SQL 数据库。里面存储的数据都是K,V类型的数据,与另一个分布式数据库Redis类似。而不同于Mysql中的数据库表模型(三范式)。
2,Hbase具备实时的增删改查功能,以后我们做实时的数据分析,可以将结果存入Hbase,Redis中。分布式数据库的优点:可以动态扩容,负载能力可以动态扩展。
3,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,查询用户表的数据。
首先理解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状态。
1,一个表,有表明
2,一个表可以分为多个列族(不同列族的数据会存储在不同的文件中)
3,表中的每一行有一个“行健 rowkey”,而且行健在表中不能重复。
4,表中的每一对kv数据称作是一个cell
5,HBASE可以对数据存储多个历史版本(历史版本数量可以配置)
6,整张表由于数据量过大,会被切分成若干个region(用rowkey范围标识),不同的region的数据也存储在不同的文 件中。
插入到hbase中去的数据,hbase会自动排序存储:
排序规则: 首先看行键,然后看列族名,然后看列(key)名;按字典顺序
Hbase的这个特性跟查询效率有极大的关系
比如:一张用来存储用户信息的表,有名字,户籍,年龄,职业....等信息
然后,在业务系统中经常需要:
查询某个省的所有用户
经常需要查询某个省的指定姓的所有用户
思路:如果能将相同省的用户在hbase的存储文件中连续存储,并且能将相同省中相同姓的用户连续存储,那么,上述两个查询需求的效率就会提高!!!
做法:将查询条件拼到rowkey内
此处的byte[]包括:rowkey,key,value,列族名,表名
问题一:列族划分多好还是少好?
要牢牢把握住:不同列族中的数据是存储在不同的文件中的。所以可以分为两种情况来说。假如我们要经常查询rowkey的全部内容,就不要划分列族。因为不同列族将来会将数据存储到不同的文件中,如果划分列族过多,就需要查询不同的文件,效率肯定变低。假如我们经常要做的查询,只是行健中的某些内容。就可以将经常进行查询的内容放在一个列族中,不经常用的内容放在另一个列族中,这样进行查询的时候就可以不查那些内容了。总结来说都是为了执行效率更快。
因为以后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' 指定行健
deleteall't_user_info','001' 删除整行数据
disable 't_user_info' 删除整张表 drop 't_user_info'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。