1、 HBase的简单介绍及其基本概念
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
----------------------------------------------------
HBase体系结构
表、 列族、 列
一张表的列簇不会超过5个,
每个列簇中的列数没有限制
表(table)
划分数据集合的概念,和传统的db中的表的概念是一样的。
行健(RowKey):
一行数据的唯一标示,要想操作(read/write)一条数据,必须通过行健,其在hbase底层都是使用字节数组进行存放,
所以方便我们使用rk进行排序,
行键是字节数组, 任何字符串都可以作为行键;表中的行根据行键进行排序,数据按照Row key的字节序(byte order)排序存储;
所有对表的访问都要通过行键 (单个RowKey访问,或RowKey范围访问,或全表扫描)。
列族(columnFamily)
简单的认为是一系列“列”的集合。列族是以单独的文件进行存储。
列限定符(column Qualifier)
或者叫列。列里面的数据定位通过列限定符 每个CF可以有一个或多个列成员(ColumnQualifier),
列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入。时间戳(version)
在单元格中可以存放多个版本的数据。
单元格(cell)
Cell 由行键,列族:限定符,时间戳唯一决定,Cell中的数据是没有类型的,全部以字节码形式存贮,主要用来存储数据。
2、 HBase的优点及其与关系型数据库的对比
1. 容量大:HBase单表可以有上百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性。
2. 面向列:HBase是面向列的存储和权限控制,并支持独立检索。列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数据量。
3. 多版本:HBase每一个列的数据存储有多个Version(version)。
4. 稀疏性:为空的列并不占用存储空间,表可以设计的非常稀疏。
5. 扩展性:底层依赖于HDFS
6. 高可靠性:WAL机制保证了数据写入时不会因集群异常而导致写入数据丢失:Replication机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且HBase底层使用HDFS,HDFS本身也有备份。
7.高性能:底层的LSM数据结构和Rowkey有序排列等架构上的独特设计,使得HBase具有非常高的写入性能。region切分、主键索引和缓存机制使得HBase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够达到毫秒级别。
与关系型数据库的对比
与mysql(InnoDB)区别:
1. mysql是关系型数据库,支持事务,支持二级索引,支持SQL,支持主从
2. HBase基于HDFS,支持海量数据读写,支持上亿列、上百万行的,面向列的分布式NoSQL数据库。天然分布式,主从架构,但是不支持事务
3. mysql采用行存储,HBase面向列的NoSQL数据库
mysql: 在建表时,需要提前定义表结构,就是表中有哪些列需要提前定义好,并且定义好每个列的数据类型及其所占用的存储空间,即时该列没有数据,也会占用存储空间,
所以,对于比较稀疏的大表,HBase能节省空间。
HBase: 以列为单位存储存储数据,每一列就是一个key-value, 建表时,只需要指定列族即可,列不用提前定义,可以动态扩展,
3、 HBase的安装
前提条件:已安装JDK,Hadoop
选择合适的HBase版本
官网版本:http://archive.apache.org/dist/hbase/
CDH版本(稳定,推荐):http://archive.cloudera.com/cdh5/
4、 HBase shell的常用命令
1. 启动Hbase
[root@zzf hbase-1.2.6]# pwd
/usr/local/hbase-1.2.6
[root@zzf hbase-1.2.6]# ./bin/start-hbase.sh
2. 关闭Hbase
[root@zzf hbase-1.2.6]# ./bin/close-hbase.sh
3. 进入hbase shell
[root@zzf hbase-1.2.6]# ./bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
4. 查看数据库状态
hbase(main):001:0> status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
5. 查看数据库版本信息
hbase(main):002:0> version
1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017
6.查看当前HBase中具有哪些表
hbase(main):003:0> list
TABLE
0 row(s) in 0.1320 seconds
=> []
7. 创建表:表wordSplit,列族content
hbase(main):004:0> create 'wordSplit',{NAME => 'content',VERSIONS => 1}
0 row(s) in 5.2710 seconds
=> Hbase::Table - wordSplit
8. 查看表的结构,describe '表名'
hbase(main):005:0> describe 'wordSplit'
Table wordSplit is ENABLED
wordSplit
COLUMN FAMILIES DESCRIPTION
{NAME => 'content', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', C
OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.4150 seconds
9. 使表在线,enable '表名'
hbase(main):006:0> enable 'wordSplit'
10. 查看表是否存在,exists '表名'
hbase(main):007:0> exists 'wordSplit'
Table wordSplit does exist
0 row(s) in 0.0680 seconds
x 11. 查看表是否在线,is_enable '表名'
12. 加入一行数据,行键'zkb', 列族content的列名为“”, 值为5
hbase(main):014:0> put 'wordSplit','zkb','content:','5'
0 row(s) in 0.1640 seconds
13. 给zkb这一行的数据的列族content添加一列 <\math,97>
hbase(main):016:0> put 'wordSplit','zkb','content:math','97'
0 row(s) in 0.1500 seconds
14. 加入一行数据,行键'hjm',列族grade的列名为“” 值为4
hbase(main):017:0> put 'wordSplit','hjm','grade:','4'
这个列族必须先建好?
15. 查看wordSplit表行键为zkb的相关数据
hbase(main):018:0> get 'wordSplit','zkb'
COLUMN CELL
content: timestamp=1536717318496, value=5
content:math timestamp=1536717466960, value=97
2 row(s) in 0.1900 seconds
16. 查看wordSplit表中的所有数据,
# 注意:scan命令可以指定startrow,stoprow来scan多个row
# 例如:scan 'user_test',{COLUMNS =>'info:username',LIMIT =>10, STARTROW =>
# 'test',STOPROW=>'test2'}
hbase(main):019:0> scan 'wordSplit'
ROW COLUMN+CELL
zkb column=content:, timestamp=1536717318496, value=5
zkb column=content:math, timestamp=1536717466960, value=97
1 row(s) in 0.1020 seconds
17. 查看wordSplit表中所有content列族的数据
hbase(main):020:0> scan 'wordSplit',{COLUMN => 'content'}
ROW COLUMN+CELL
zkb column=content:, timestamp=1536717318496, value=5
zkb column=content:math, timestamp=1536717466960, value=97
1 row(s) in 0.1260 seconds
18. 删除表wordSplit
disable 'wordSplit'
delete '表名','行键名','列族名:列名' 删除某个列
deleteall '表名','行键' 删除某个行键的所有数据
drop '表名' 删除表
19. 查看表中行数
hbase(main):007:0> count 'wordSplit'
1 row(s) in 0.2180 seconds
=> 1
20. 清空表数据
hbase(main):009:0> truncate 'device'
Truncating 'device' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 4.4350 seconds
再查看表中行数:
hbase(main):010:0> count 'device'
0 row(s) in 0.2000 seconds
=> 0
21. 查看表大小
22. 修改版本数
alter 'tablename', {NAME => 'ColFam', VERSION => 4}
23. 删除某个列族
alter 'tablename', {NAME => 'ColFam', METHOD => 'delete'}
24. 增加一个列族
disable 'tablename'
alter 'tablename' {NAME => 'ColFam1', NAME => 'ColFam2'}
enable 'tablename'
25. 设置列族的最大值为256MB
alter 'tablename', {NAME => 'ColFam',METHOD => 'table_att', MAX_FILESIZE=>268435456}
26. 在创建表时实现压缩
create 'tablename', {NAME => 'ColFam', COMPRESSION => 'SNAPPY'}
27. 修复未分配、错误分配或多次分配region的问题
hbase hbck -fixAssignments
28. 修复元数据与region保持一致
hbase hbck -fixAssignments -fixMeta
29.修复region空洞
hbase hbck -repairHoles
30.显示所有相关命令
hbase hbck
5、 HBase的行键设计
参考:https://juejin.im/entry/5764f4c95bbb500063f949f9
6、 HBase的原生客户端
参考:https://blog.csdn.net/qq_37670707/article/details/82701863
参考:https://blog.csdn.net/net19880504/article/details/17733161?utm_source=blogxgwz13
7、 HBase的常用过滤器
参考:https://www.cnblogs.com/similarface/p/5805973.html
1. RowFilter 行键过滤器:
2. FamilyFilter列族过滤器:
3. ValueFilter值过滤器:
4. DependentColumnFilter 参考列过滤器
5. PrefixFilter 前缀过滤器:
6. PageFilter 分页过滤器
KeyOnlyFilter 行键过滤器
FirstKeyOnlyFilter 首次行键过滤器
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter 包含结束的过滤器
FuzzyRowFilter 模糊行匹配过滤器
ColumnCountGetFilter 列计数过滤器
可以使用这个过滤器来限制每行最多取回多少列,
当一行的列数到设定的最大值,这个过滤器会停止整个扫描操作。
ColumnPrefixFilter 列前缀过虑器
该过滤器通过对列名称进行前缀匹配过滤
MultipleColumnPrefixFilter 多个列前缀过滤器
ColumnRangeFilter 列范围过滤器
SingleColumnValueFilter 单列值过滤器
SingleColumnValueExcludeFilter 单列排除过滤器
单列排除过滤器继承自SingleColumnValueFilter,过滤的方式还是按照SingleColumnValueFilter去过滤,
但是最后的结果集去除了作为过滤条件的列
TimestampsFilter 时间过滤器
使用时间戳的值来过滤值
RandomRowFilter 随机行过滤器
Decorating Filters 装饰过滤器或附加过滤器
SkipFilter 跳过过滤器 根据构造器中的过滤器为基准跳过行
FilterList 过滤列表[多个过滤器一起起作用]
9、 HBase与SpringBoot集成,遇到的问题
1. 参考官网:https://github.com/spring-projects/spring-hadoop-samples
2. 通过spring-boot-start-hbase https://github.com/JThink/spring-boot-starter-hbase
由于Spring Boot内嵌了Web容器,所以框架默认导入了依赖:tomcat-embed-core-8.5.5.jar、tomcat-embed-el-8.5.5.jar等包。而HBase的jar中包含了:servlet-api-2.5.jar、servlet-api-2.5-6.1.14.jar。当你添加好HBase的相关依赖后,应用程序启动报异常,启动不启来。在搭建项目环境时,记录不要导入servlet-api-2.5.jar、servlet-api-2.5-6.1.14.jar这两个jar包。