Hbase的介绍,shell操作及JAVAAPI操作

一、特点

1、海量存储

如果使用RDBMS存储数据,当数据量越来越大,RDBMS变得难以管理和操作,此时出现了读写分离策略,即通过一个Master专门负责写操作,多个Slave负责读操作,因此服务器成本将会倍增。随着压力增加,Master也撑不下去了,因此就出现了分库,即把关联不大的数据分开部署。但这样一来,一些join查询就不能用了,必须借助中间层。而对于单个数据表来讲,随着表中的数据量增加,查询速度就会很慢,因此又得对表进行拆分。比如按ID取模分成多个表以减少单个表的记录数。但是,如果采用HBase就简单了,只需要加机器即可,HBase会自动水平切分扩展,跟Hadoop的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)。
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利。

2、列式存储 (表是行的集合,行是列族的集合,列族是列的集合,列是键值对的集合)

这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
由于是基于列式的存储,因此非常适合存储半结构化或非结构化数据。从这个意义角度上讲,HBase是一种NoSQL数据库。对于那些数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用HBase。比如文章的tag信息就会不断的增加、删除,无法统一的定制一个tage数据模型进行约束。再比如商品的规格信息,由于商品类型千差万别,其规格模型描述也不可能统一描述。
(注意:关系型数据库取出列值的计算是在最后阶段执行的投影运算)

3、极易扩展

Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
备注:RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。

4、高并发

由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。

5、记忆非常稀疏

稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

6、多版本数据

Row key和Column key定位到的Value可以有任意数量的版本值,因此对于需要存储变动历史记录的数据,用HBase就非常方便了。业务上一般只需要最新的值,但有时可能需要查询到历史值。

二、HBase适用场景

 查询简单
 不涉及到复杂的 Join 查询,基于 RowKey 或者 RowKey 的范围查询
 订单流水、交易记录、需要记录历史版本的数据等

三、HBase不适用场景

 几千、几百万那种还不如使用RDBMS
 需要类型列(不过已经可以用Phoniex on HBase解决这个问题)
 需要跨行事务,目前HBase只支持单行事务,需要跨行必须依赖第三方服务
 SQL查询(不过可以用Phoniex on HBase解决这个问题)
 硬件太少,因为HBase依赖服务挺多,比如至少5个HDFS DataNode,1个HDFS NameNode(为了安全还需要个备节点),一个Zookeeper集群,然后还需要HBase自身的各节点
 需要表间Join。HBase只适合Scan和Get,虽然Phoenix支持了SQL化使用HBase,但Join性能依然很差。如果非要用HBase做Join,只能再客户端代码做

四、HBASE使用

启动hbase(启动之前先启动zooleeper)

start-hbase.sh

进入hbase的shell界面

hbase shell

基本指令

查看hbase状态

status
1 active master, 1 backup masters, 3 servers, 0 dead, 4.0000 average load
 一个master        一个备份        3个servers   无死亡的           平均负载  4次

查看当前版本

version
1.4.10, r76ab087819fe82ccf6f531096e18ad1bed079651, Wed Jun  5 16:48:11 PDT 2019

当前登录用户

 whoami
root (auth:SIMPLE)
    groups: root

列出所有的表(他只能列出除了hbase系统命名空间下的表)

list

展示当前命名空间下的表

 list_namespace_tables 'default'

创建命名空间

create_namespace'命名空间名'
create_namespace'命名空间名', { '属性名' => '属性值' }

显示命名空间定义

describe_namespace 'gj'

添加(set)和删除(unset)命名空间的属性

添加 : alter_namespace 'gj',{METHOD=>'set','xss'=>'18'}

删除:alter_namespace 'gj',{METHOD=>'unset',NAME=>'xss'}

创建表

 create 'gj:test3',{NAME=>'g3',VERSIONS=>6}     列族是g3   版本号是6

 create 'gj:test1','g1','g2'     创建一个表有两个列族 g1  g2

删除表 先禁用(因为是多用户所以先禁用然后再删除) 再删除

disable 'gj:test3'  禁用  禁用之后就无法进行scan 等操作了
 is_disabled 'gj:test1'    查看是否被禁用    禁用的话就会返回  true
enable 'gj:test1'     启用表

drop 'gj:test3'    删除

检测表是否存在

 exists 'gj:test1'
    does exist             存在
    does  not  exists   不存在

给表起一个别名 ,后期操作这个名字就相当于操作这个表

 s=get_table 'stu'   将表赋给s
 
 s.scan     查询s(相当于查询stu)   没有别名的情况下,遍历整张表的方法是    scan 'stu'

创建、添加、展示表

hbase(main):066:0> create 'gj:test1','g1'      创建一个表只有一个列族   g1
0 row(s) in 1.2750 seconds
=> Hbase::Table - gj:test1

hbase(main):067:0> put 'gj:test1','1001','g1:name','gengjing'
hbase(main):067:0> put 'gj:test1','1001','g1:age',18
0 row(s) in 0.1300 seconds

hbase(main):068:0> scan 'gj:test1'
ROW                   COLUMN+CELL
 1001                 column=g1:age, timestamp=1580539926288, value=18
 1001                 column=g1:name, timestamp=1580539745808, value=gengjing
1 row(s) in 0.0100 seconds

scan展示表

查询指定列
scan 'xss:test1',{COLUMNS=>['cf:age']}             只能用  scan '表名' ;不能用    表的别名.scan   不然报错
scan 'xss:test1',{COLUMNS=>['cf:age','cf:name']}       查询单列可以不用中括号,但是查询多列的时候就需要用中括号
查询指定行键范围内
scan 'xss:test1',{STARTROW=>'1001',ENDROW=>'1004'}
只查询一行的信息(就是只查一个行键的值)
scan 'xss:test1',{STARTROW=>'1001',ENDROW=>'1004',LIMIT=>1}
查询指定时间戳范围内的数据(万一历史信息的时间戳符合这个范围,TIMERANGE也会筛选出来)
scan '表名', { TIMERANGE => [最小时间戳, 最大时间戳]}    包含最小,不包含最大

修改已经建立好的表的版本号(VERSION) 只有先禁用表才能修改版本号

1、先将表禁止使用,锁住表
 disable 'xss:test1'
2、查看表是否被禁用(true表示已经被禁用)
is_disabled 'xss:test1'
true
0 row(s) in 0.0300 seconds
3、修改表的版本号   只有确定列族的情况下才能修改版本号
alter 'xss:test1',{NAME=>'cf',VERSIONS=>5}
4、查看表的详细信息看版本号是否修改成功
 describe 'xss:test1'
 5、最后启用表
 enable 'xss:test1'

删除单列

delete 'xss:test1','1001','cf:name'

删除整行 deleteall 删除整行 某列数据 比delete可以删除整行

deleteall 'xss:test1','1001'

通过行键获取某一行信息

 get 'xss:test1','1002'

统计表的总行数(有几个行键就有几行)

count 'xss:test1'

append指定列追加内容

 append 'xss:test1','1001','cf:name','-xss'
发布了50 篇原创文章 · 获赞 30 · 访问量 7056

猜你喜欢

转载自blog.csdn.net/qq_44472134/article/details/104128058