1、HBase基本介绍
大数据中一款nosql型的数据库, 既然是nosql型数据库, hbase不支持事务(多行事务),也不支持SQL, 也没有表关系, 不支持join操作
hbase是使用java语言开发的, 基于HDFS的, 数据最终都是存储在HDFS的
hbase中查询数据主要有三种方式:
- 1) 通过主键查询
- 2) 通过主键的range范围查询
- 3) 全表扫描
主要是用于存储结构化和半结构化的数据
hbase中支持的数据类型: byte[] (字节数组)
nosql型数据库: 一切皆字节
hbase中表一般具有以下的特征:
- 1) 大: 一个表可以支持有上十亿行的数据, 支持有上百万个列
- 2) 面向列: 面向列族的存储和权限的管理工作
- 3) 稀疏性: 对于为空(null)的列, 并不占用存储空间, 因为表可以设计非常的稀疏
hbase的使用场景:
- 数据量比较的庞大, 而且这些数据需要进行随机的读写操作, 不妨使用hbase来试一试
目前hbase是apache的顶级项目: 其域名为 https://hbase.apache.org
2、HBase特点
- 1) 强一致性的读写操作
- 2) 自动分块: region划分
- 3) 自动的故障转移
- 4) hbase可以和HDFS进行集成: 本身基于HDFS
- 5) hbase可以和MR进行集成:
- 6) 支持普通的java API
- 7) 支持Thrift 接口API : 可以通过此API 实现和HUE的集成工作
- 8) 块缓存和布隆过滤器
- 9) hbase提供管理界面
3、HBase的表模型
1、表(table):hbase中数据存储在表中, 一个表可以支持有上百万列 也可以存储上十亿上数据
2、row key:主键,以字典序排序,数据最长支持16kb
设计rowkey要确保唯一,否则数据会被覆盖,同时保证相关的数据要存放在一起
3、列族:创建表的时候,需要制定列族,HBase对列的管`在这里插入代码片`理基于列族
列族的设计:设计列族的时候尽量精简,能用一个列族绝不使用两个,因为随着列族的增多,HBase效率会随之下降
4、列名:列名被列族管理,一个列族下可以有多个列名
列名在添加数据的时候动态指定,不需要在建表的时候指定
5、时间戳:往每个单元格中添加数据的时候会自动生成时间戳,用于记录数据的添加时间
6、版本号:用于记录单元格中数据的变更版本(只有在创建表的时候指定保留多少个版本才会进行记录,如果不指定,只记录一个版本号,默认为1)
7、确定一个单元格:表名+rowkey+列族+列名+value
4、HBase原理
4.1、HBase的架构说明
如图:
HBase集群由HClient(客户端)、HMaster(主节点)、HRegionServer(从节点)组成
单节点(单个HMaster)、高可用(多个HMaster)、HRegionServer可以多个(奇数台)
4.1.1HMaster
描述:集群的主节点,可以单节点运行,支持一主一备和一主多备
作用:1、管理从节点
2、分配region
4.1.2HClient
描述:HBase客户端
作用:提供给用户对数据进行操作
4.1.3 HRegionServer
描述:集群的从节点
作用:1、管理主节点分配的region
2、负责数据的存放和读写
3、负责和主节点进行通信
4.1.4 HRegionServer组成
1、每一个HRegionServer由一个HLog和多个Region组成
2、每一个Region中有多个store模块组成
3、每一个store模块中,由一个MemStore和多个StoreFile组成
Region的划分:
region是对表的水平划分,每一张表创建的时候只有一个region。一个region只能被一个RegionServer管理,一个RegionServer可以管理多个region。
Store的划分:
store是对表进行垂直划分,一个列族会对应一个store。所以列族越多时,会对应更多的store,多个store会分散在不同的内存和文件中,读取数据时,会造成更多的IO和网络消耗。(所以建议能使用一个列族绝不使用两个)
4.2 HBase数据读取和写入流程
4.2.1 数据读取流程
如图:
- 1、HClient发起读取数据请求,先连接zookeeper,获取meta表所在的RegionServer位置(meta表存放的信息包括:要读取的表所包含的region信息,以及region所存在的RegionServer位置)
- 2、连接meta表所对应的RegionServer,从meta中获取表数据存放在哪些region中,并将这些region所在的RegionServer的位置返回给客户端
- 3、HClient开始并行连接这些RegionServer读取数据,读取顺序按照memStore->blockCache->StoreFile->大的HFile
- 4、所有数据读取完毕后一起返回给客户端,客户端再根据条件过滤出需要的数据
4.2.2 写入数据流程
如图:
- 客户端的同步流程:
- 1、HClient先连接zookeeper,获取HBase meta表所在的RegionServer地址
- 2、连接meta表所在的RegionServer服务器,从meta表中获取要写入数据的表所在的region所在的server地址(基于rowkey的startKey和endKey来确定)
- 3、连接RegionServer服务器,开始数据的写入
- 4、首先将数据写入到RegionServer对应的HLog中,再将数据写入到region对应的memStore中,当这两部分的数据都写入完成后,客户端会认为数据已经写入成功
- 服务器的异步执行流程:
- 5、当数据不断写入到memStore中,memStore中的数据会越来越多,当其中的数据达到一定的阈值(128MB|1个小时),会启动一个flush线程,将数据刷新到HDFS中,并形成一个StoreFile文件
- 6、当数据不断刷新到HDFS中,会生成多个StoreFile文件,当StoreFile文件到达一定数量(3个及以上)后,会启动一个compact线程,将StoreFile合并成一个大的HFile文件
- 7、随着StoreFile文件不断合并,HFile文件会越来越大,当HFile文件达到10GB大小以后,启动split机制,将HFile文件一分为二,此时原来的region也会分裂成两个,每个region管理分裂完成后的HFlie文件,原来的region被下线
- 8、随着HFile不断的split,region的数量也会越来越多
5、HBase常用的shell命令
1、获取帮助:help
2、查看系统中所有表:list
3、创建表:
1、create '表名','列族名'...
2、create '表名',{NAME=>'列族名',VERSION=>N}
4、添加数据:
put '表名','rowkey','列族名:列名','列值'
5、查看某一条数据:
get '表名','rowkey',['列族'|'列族:列名']
6、查看整张表所有数据:
1、scan '表名'
2、显示中文:scan '表名',{FORMATTER=>'toString'}
3、显示前N条:scan '表名',{LIMIT=>N}
4、显示指定列:scan '表名',{COLUMNS=>['列族','列族:列名'],VERSION=>N}
7、rowkey范围查询:
scan '表名',{STARTROW=>'其实rowkey值',ENDROW=>'结束rowkey值'}
8、列值过滤器:
get '表名','rowkey',{FILTER=>"ValueFilter(=,'binary:beijing')"}
9、列名过滤器:
scan'表名',{FILTER=>"QualifierFilter(=,'substring:a')"}
scan '表名',{FILTER=>"QualifierFilter(=,'binary:address')"}
10、rowkey前缀过滤器:
scan '表名',{FILTER=>"PrefixFilter('rk')"}
11、修改数据:和添加数据一致,保持rowkey一致即可
put '表名','rowkey','列族:列名','列值'
12、删除数据:
delete '表名','rowkey','列族:列名'(可用于删除某个字段)
deleteall '表名','rowkey',['列族':'列名']
注意事项:
- deleteall 是在 hbase 2.0版本后出现的, 在2.0版本之前, 只需要使用delete这个命令即可完成所有的删除数据工作
- delete删除数据时候, 只会删除最新版本的数据, 而deleteall 直接将对应数据的所有的历史版本全部删除
13、删除一个列族:
alter '表名',{NAME=>'列族',METHOD=>'delete'}
alter '表名',{'delete'=>'列族'}
14、清空表:
truncate '表名'
15、删除表(删除表之前,先禁用表,disable '表名'):
drop '表名'
16、统计表中一共有多少行:
count '表名'
17、查看表的详细信息:
describe '表名'
18、判断一张表是否存在:
exists '表名'
19、添加新的列族:
alter '表名',NAME=>'列族'
6、HBase服务操作命令
1、服务器启动命令
nohup start-hbase.sh 2>&1 &
2、启动客户端命令
hbase shell