HBase简介

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包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值