一、概要
1.1、简介
Hbase是一个高可靠性、高性能、列存储、可伸缩、多版本的NoSQL的分布式数据存储系统,实现对大型数据的实时、随机读写访问。
HBase 是Google Bigtable 的开源实现,HBase是Hadoop的数据库。利用HDFS 作为其文件存储系统,用MapReduce来处理HBase中的海量数据,以Zookeeper做服务协调。
Hadoop 可以通过 HDFS 来存储结构化、半结构甚至非结构化的数据,它是传统数据库的补充,是海量数据存储的最佳方法,它针对大文件的存储,批量访问和流式访问都做了优化,同时也通过多副本解决了容灾问题。但是 Hadoop 的缺陷在于它只能执行批处理,并且只能以顺序方式访问数据,这意味着即使是最简单的工作,也必须搜索整个数据集,无法实现对数据的随机访问。实现数据的随机访问是传统的关系型数据库所擅长的,但它们却不能用于海量数据的存储。在这种情况下,必须有一种新的方案来解决海量数据存储和随机访问的问题,HBase 就是其中之一 (HBase,Cassandra,couchDB,Dynamo 和 MongoDB 都能存储海量数据并支持随机访问)。
1.2、特点
- 大,一张表可以存放上亿行,上百万列
- 存储类型:所有数据的底层存储格式都是字节数组 (byte[])。
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索。
- 稀疏:对于空的列,不占用存储空间
- 数据类型单一:HBase中的数据都是字符串,没有类型。
- 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
- 不支持复杂的事务,只支持行级事务,即单行数据的读写都是原子性的。
- 由于是采用 HDFS 作为底层存储,所以和 HDFS 一样,支持结构化、半结构化和非结构化的存储。
- 支持通过增加机器进行横向扩展。
- 支持数据分片。
- 易于使用的 Java 客户端 API。
1.3、模型介绍
1.3.1、表(Table)
HBase会将数据存入表中,但是需要注意的是表名必须能用文件路径里的合法名字,因为HBase的表是映射hdfs文件上面的文件。
1.3.2、行(Row)
表里每行代表一个数据对象,每行以一个Row Key来进行唯一标识,并且按照 RowKey 的字典序进行排序。Row Key是HBase表结构设计中很重要的一环,它设计的好坏直接影响程序和HBase交互的效率和数据存储的性能。
1.3.3、列族(Column Family)
定义表之前设置好列族,表中所有列都要组织在列族里面,列族一旦确定后不能轻易修改,因为它会影响到HBase真实物理存储结构。但列族里的列以及对应的值可以动态删除。每行都有相同的列族但是不需要一致的列。
1.3.4、列标识(Cloumn Qualifier)
就是列名,同张表可以有不同的列。这也就体现出比传统关系型数据库更灵活。
1.3.5、单元(cell)
每一个行键,列族和列标识共同确定一个单位叫做单元,存储在单元里的数据称为单元数据。但不同的是 HBase 中的一个单元格是由多个版本的数据组成的,每个版本的数据用时间戳进行区分。
1.3.6、时间戳(Timestamp)
默认情况下每一个单元中的数据插入时都会用时间戳来进行版本标识。读取单元数据时,如果时间戳没被指定,则默认返回最新的数据,写入新的单元数据时,如果没设置时间戳,默认使用当前时间。每一个列族的单元数据的版本数量都被Hbase单独维护,默认情况下HBase保留3个版本数据。
二、HBase安装
2.1、准备工作
HBase依赖ZooKeeper做服务协调,这个可以使用hbase自带的也可以单独安装;
HDFS做底层的数据存储,所以需要提前安装好hadoop;
本身使用Java编写的,需要安装JDK环境
2.2、下载安装包
-
1、下载地址,注意版本需要和hadoop的版本要兼容
2.3、环境变量设置
#编辑文件
vim /etc/profile
#添加内容如下
export HBASE_HOME=hbase安装路径
export PATH=$HBASE_HOME/bin:$PATH
# 刷新环境变量
source /etc/profile
2.4、配置文件修改
修改${HBASE_HOME}/conf目录下的文件
-
hbase-env.sh文件,内容如下
# 配置JDK安装位置 export JAVA_HOME=/usr/java/jdk1.8.0_201 # 不使用内置的zookeeper服务,设为true则反之 export HBASE_MANAGES_ZK=false # 指向配置文件目录 export HBASE_CLASSPATH=/data/down/Hbase/hbase-2.3.6/conf
-
hbase-site.xml,内容如下
<property> <!-- 指定HBase数据在HDFS上的存储路径 --> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9000/hbase</value> </property> <property> <name>hbase.tmp.dir</name> <value>./tmp</value> </property> <property> <!-- 在启动HBase以后,避免会出现无法找到HMaster进程的错误 --> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> <property> <!-- 指定 zookeeper 的地址,如果使用内部的zookeeper不要配置--> <name>hbase.zookeeper.quorum</name> <value>localhost:2181</value> </property> <property> <!-- hbase的WEBUI 端口号,可选--> <name>hbase.master.info.port</name> <value>60010</value> </property>
2.5、命令
#启动,需要确保
{hbase目录}/bin/start-hbase.sh
#停止
{hbase目录}/bin/stop-hbase.sh
#进入shell界面
{hbase目录}/bin/hbase shell
三、hbase里的shell命令
3.1、基本命令
-
查看服务器状态
stuats
-
查看版本
version
3.2、关于表的操作
-
创建表
创建一个student的表,字段有name,sex,age
#reate '表名称', '列族名称1','列族名称2','列名称 N' create 'student','name','sex','age'
注意单引号
-
查看所有表
list
-
查看表的信息
describe 'student'
-
表的禁用和启用
# 禁用表 disable 'student' # 检查表是否被禁用 is_disabled 'student' # 启用表 enable 'student' # 检查表是否被启用 is_enabled 'student'
-
检查表是否存在
exists 'student'
-
删除表
分两步操作
#将表设为不可用 disable 'student' #删除表 drop 'student'
-
添加列族
# alter '表名','列族名' alter 'student', 'teacherInfo'
-
删除列族
# alter '表名', {NAME => '列族名', METHOD => 'delete'} alter 'student', {NAME => 'teacherInfo', METHOD => 'delete'}
3.3、数据的增删改查
-
添加数据
添加一条行键为1,name为xiaoMing的数据,注意每次添加只能往某一行某一个列添加,所以使用shell命令效率很低。添加的行键相同,则为修改
# put '表名', '行键','列族:列','值' put 'student','1','name','xiaoMing'
-
获取数据
# get '表名','行键','列族(可选)' get 'student','1'
-
删除数据
# delete只删除某一行的某一个列 delete 'student','1','sex' # deleteall 删除一行 delete 'student'
-
查询整表数据
scan 'student'
-
查询这个表的列族数据
scan 'student', {COLUMN=>'name'}
-
条件查询
COLUMNS :列名,STARTROW:起始行键,STOPROW:查询关键字,LIMIT:分页,VERSIONS:版本
scan 'student', {COLUMNS=> 'baseInfo:name',STARTROW => 'rowkey2',STOPROW => 'wrowkey4',LIMIT=>2, VERSIONS=>3}
三、SpringBoot集成
参考文献
https://www.w3cschool.cn/hbase_doc/hbase_doc-m3y62k51.html
https://www.cnblogs.com/qingyunzong/p/8665698.html
https://www.jianshu.com/p/a8c07648c2eb
https://hbase.apache.org/2.1/book.html