HBASE
1. hbase特点
- hbase是一种基于hdfs的NoSQL数据库,弥补了hdfs无法随机写的缺陷。
2. hbase的基本概念
- 命名空间(namespace)
hbase没有databse的概念,namespace类似database;
hbase自带两个namespace:hbase和default,hbase用户存储hbase的内置表(metadata),default用于存储创建时未指定namespace的表 - 列族(column family)
一个或多个列的集合,底层存储时,相同列族的列会被存在同一个地方(hdfs的同一个文件夹);
创建表时必须制定列族,之后可追加 - 列
与关系型数据库的列类似,在hbase中,一个列属于且只属于一个列族;但每行数据同一个列族中的列可以不一样 - Row Key
类似关系型数据库的主键,可唯一定位出一行数据;存入hbase的数据会自动以字典序排列,查询时只能通过row key进行检索
hbase只支持一列未做row_key,假设利用sqoop从mysql导入到hbase,需要将多个列作为row_key,可使用参数–hbase-row-key “column1,column2,…”。虽然可操作,但是hbase会以”_"将其拼接成一列。 - Region
hbase会按row key对存储的数据进行切片,一个切片即一个region,同一个region的数据会被存放在同一个region server上,当同一个region的数据量过大(默认256m),会将region切分成两个新的region
- Store
一个region由一个或多个store组成,table有几个列族就有几个store;一个store由一个memstore和0个或多个storefile组成 - MemStore
memStore是放在内存里的,保存修改数据;当memStore的大小达到了一个阈值(默认64),memStore会被flush到文件,形成快照。 - StoreFile
memStore内存中的数据写到文件后就是StoreFile,flush一个生成一个新的storeFile,storeFile底层以HFile的格式保存 - HFile
HFile是HBase中key-value数据的存储格式,是hadoop的二进制文件,一个storeFile对于一个HFile,而HFile存储于hdfs
==HBase可以实现秒级响应的随即写操作,其主要原因就是通过记录用户的操作记录,然后打上时间戳,在读的时候根据时间戳返回最新的数据(HBase的高效随即写其实是“假”的) ==
3. HBase基本架构
- 角色:Master和Region Server
- Region Server作用(DML)
data get(select)、put(insert,update)、delete
region:splitRegion、compactRegion - Master作用(DDL)
Table:create、delete、alter
RegionServer:分配region到RegionServer,监控每个RegionServer的状态
4. HBase语法
- hbase shell 进入命令行
- 当输入错误语法时,shell会一直换行,无法执行,此时可以通过在shell输入 >‘ 来退出当前编辑状态
- help 查看帮助
- 建命名空间
- creata_namespace ‘namespace_name’
- 列出所有命名空间
- list_namespace
- 删除命名空间
- drop_namespace ‘namespace_name’
删除命名空间前必须先清空命名空间下的所有表
- 建表
- create ‘tablename’ ,‘info’
创建了一张名为tablename的表,该表有一个名为info的列族 - create ‘tablename’,‘info1’,‘info2’
创建了一张名为tablename的表,该表有名为info1和info2的列族 - create ‘namespace_name:table_name’,‘info’
将表建在名称为namespace的命名空间下
- 查看表
- list
列出所有命名空间下的所有表 - desc/describe ‘tablename’
查看表结构
- 删除表
- drop ‘tablename’
drop前需要先disable表
disable ‘tablename’
- 更改表
- 更改version
alter ‘tablename’ ,{NAME => ‘列族’,VERSIONS=>3}
HBase允许对同一个row key的相同位置存放多个版本的数据,通过VERSIONS来控制保存的版本数量
- 往表插入数据
- put ‘namespace:table_name’,‘row key’,'列族:列名‘,‘value’
put ‘ns1:student’,‘1000’,‘info:name’,‘zhangsan’ - put ‘namespace:table_name’,‘row key’,'列族:列名‘,‘value’,timestamp
该timestamp用于标记数据的“新旧”,在取数据时,会返回timestamp最新的数据
put会按照对rowkey以字典序对数据进行排序
- 查询
- scan ‘ns:table_name’
输出整张表的内容 - scan ‘ns:table_name’,{STARTROW => ‘1001’,ENDROW => ‘1111’}
查询rowkey在[1001,1111]内的所有内容 - scan ‘ns:table_name’,{RAW=TRUE,VERSIONS=10}
指定历史修改的版本 - get ‘ns:table_name’,‘row key’
必须指定row key,查询rowkey所有列族的内容 - get ‘ns:table_name’,‘row key’,‘列族’
- get ‘ns:table_name’,‘row key’,‘列族:column1’,‘列族:columns2’…
指定列column1、column2
- 删除
- deleteall ‘ns:table_name’,‘row key’
删除整个rowkey为’row key’的值,删除条件至少指定到’row key’ - delete ‘ns:table_name’,‘row key’,‘列族‘
delete在shell模式下,删除条件至少指定到’列族’,而在api中delete和deleteall一样 - truncate ‘ns:table_name’
清空整张表的内容
== 数据在hdfs中以/region/列族 的路径存储==
5. 常用命令
- 计数
# 法1 hbase shell下
count 'table_name' #该方法效率慢
#法2 linux shell下
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'table_name' #效率远高于法1