Apache HBase是Hadoop的数据库,一个分布式的,可扩展的,大数据存储组件。
Apache HBase适合随机的、实时的读写你的大数据场景,HBase的目标是管理非常大的表,在商业硬件集群上管理10亿行级别和500W列级别的数据。HBase是一个开源的,分布式的,版本化的非关系数据库,模仿Google的Bigtable,BigTable是结构化数据分布式存储系统。正如Bigtable利用Google的分布式文件系统,提供分布式数据存储,Apache HBase在Hadoop和HDFS之上,提供类似Bigtable的功能。
HBase可支持千万级别的QPS,PB级别的存储。
一,概述
HBase一般使用Hadoop HDFS作为它的数据存储,使用MapReduce处理数据,Zookeeper作为分布式协调服务。
HBase存储<K,V>数据,支持数据版本。HBase的几个关键概念:
表(Table)
HBase会将数据组织进一张张的表里面,但是需要注意的是表名必须是能用在文件路径里的合法名字,因为HBase的表是映射成hdfs上面的文件。
行(Row)
在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的,行键并没有什么特定的数据类型,以二进制的字节来存储。
rowkey
- 决定一行数据的唯一标识
- RowKey是按照字典顺序排序的。
- Row key最多只能存储64k的字节数据。
列簇
- HBase的每个列都属于某个列簇,列簇表结构定义的一部分预先给出,如create 'user' 'info' 'office'
- 列名以列簇作为前缀,每个“列簇”都可以有多个列成员(column,每个列族中可以存放几千~上千万个列);如 info:name, office:company,新的列簇成员(列)可以随后按需、动态加入。列簇下面可以有多个列,所以可以简单的理解为,HBase中的列是二级列,也就是说列簇是第一级列,列是第二级列。两个是父子关系。
- 权限控制、存储以及调优都是在列簇层面进行的。
- HBase把同一列簇里面的数据存储在同一目录下,由几个文件保存。
时间戳
- 在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间 戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
- 时间戳的类型是64位整型。
- 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫 秒的当前系统时间。
- 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突, 就必须自己生成具有唯一性的时间戳。
Cell单元格:
- 由行和列的坐标交叉决定;
- 单元格是有版本的(由时间戳来作为版本);
- 单元格的内容是未解析的字节数组(Byte[]),cell中的数据是没有类型的,全部是字节码形式存贮。
- 由{row key,column(=<family> +<qualifier>),version}唯一确定的单元。
使用关系数据库的理解方式去看待HBase的各个基本概念,如下图。
二,应用场景
HBase可以用作数据库,也可以用作存储,拥有双重属性的HBase具有广阔的应用场景。引入MOB,可以存储10M左右的对象,完全适应对象存储。
对象存储,HBase的引入MOB支持对象存储,新闻,图片,网页,文件,文档都可以认为是对象。
时序数据,HBase之上有OpenTSDB模块,满足时序类场景需求。
推荐画像,用户画像,稀疏矩阵。
时空数据,主要有轨迹,气象,网络等数据。
CubeDB OLAP,基于离线计算构建cube,存储在hbase之中,满足在线报表查询。
消息/订单,在电信、银行领域,订单,通信,消息的同步应用构建在HBase之上。
Feeds流,类似于xxx朋友圈的应用。
NewSQL,基于Phoenix插件,满足二级索引,SQL需求。但是不支持事务。
三,搭建、运行单节点Hbase
单节点也具有所有HBase的关键组成,Master,RegionServer,Zookeeper,在Java JVM中运行,数据持久化到本地文件系统。通过了解最基本的配置文件,了解Hbase Shell了解如何创建表,插入表,扫描表等关于HBase的各种操作。
HBase依赖JDK,首先安装JDK。
3.1,下载
下载官方Stable版本二进制tar包安装
[root@ecs-7bc6-0001 hbase]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-1.4.10-bin.tar.gz
解压,并进入目录
[root@ecs-7bc6-0001 hbase]# tar -zxvf hbase-1.4.10-bin.tar.gz
[root@ecs-7bc6-0001 hbase]# cd hbase-1.4.10
3.2,配置
在启动HBase之前,首先需要设置Java环境变量,或者需要在./conf/hbase.env中配置,配置自己的Java安装目录。hbase-site.xml是HBase主要的配置文件,接下来需要指定一个本地文件系统的目录,HBase和Zookeeper在这个目录写数据,确认风险。默认情况下,在/tmp目录下会创建一个新的目录,很多服务都会在系统重启的时候删除/tmp下的内容,所以你需要保存数据在别的地方。下面是如何配置目录,目录在testuse的用户主目录,将<property>标记粘贴到<configuration>标签下面,在新安装HBase的hbase-site.xml中<configuration>下应该为空。
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/root/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/root/zookeeper</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
<description>
Controls whether HBase will check for stream capabilities (hflush/hsync).
Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
with the 'file://' scheme, but be mindful of the NOTE below.
WARNING: Setting this to false blinds you to potential data loss and
inconsistent system state in the event of process and/or node failures. If
HBase is complaining of an inability to use hsync or hflush it's most
likely not a false positive.
</description>
</property>
</configuration>
不需要创建目录,HBase会自动创建目录,如果是基于Hadoop的HBase,需要配置类似
hdfs://namenode.example.org:8020/hbase
3.3,启动并测试
启动
./bin/start-base.sh
启动之后使用jps查看JVM进程。可以看到HMaster进程。
[root@ecs-7bc6-0001 hbase-2.2.0]# jps
17171 HMaster
27322 Jps
测试
3.3.1,连接到HBase shell,使用HBase安装目录下的bin目录下的hbase shell命令打开HBase shell
[root@ecs-7bc6-0001 hbase-2.2.0]# ./bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.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
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.2.0, rUnknown, Tue Jun 11 04:30:30 UTC 2019
Took 0.0030 seconds
hbase(main):001:0>
3.3.2,创建表,使用create命令创建表,需要指定表明和列簇名称
hbase(main):004:0* create 'user', 'info'
Created table user
Took 1.7162 seconds
=> Hbase::Table - user
3.3.3,列出创建表的信息
使用list命令查看表是否存在
hbase(main):006:0* list 'user'
TABLE
user
1 row(s)
Took 0.0168 seconds
=> ["user"]
使用describe命令查看表的详细信息,包括默认的配置。
hbase(main):008:0> describe 'user'
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLIC
ATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
1 row(s)
QUOTAS
0 row(s)
Took 0.0287 seconds
3.3.4,给表中插入数据,使用put命令
hbase(main):015:0* put 'user', 'row1', 'info:name', 'weihoa'
Took 0.1102 seconds
hbase(main):019:0* put 'user', 'row1', 'info:age', '25'
Took 0.0066 seconds
hbase(main):022:0* put 'user', 'row1', 'info:address', 'xian'
Took 0.0039 seconds
hbase(main):025:0* put 'user', 'row1', 'info:sex', 'male'
3.3.5,一次性查找表的所有数据,scan命令是一种从HBase查询数据的方式,scan命令全表扫描数据,也可以limit输出,现在查询所有数据。
hbase(main):038:0* scan 'user'
ROW COLUMN+CELL
row1 column=info:address, timestamp=1564034929590, value=xian
row1 column=info:age, timestamp=1564034921709, value=25
row1 column=info:name, timestamp=1564034907973, value=weihoa
row1 column=info:phone, timestamp=1564034998413, value=18888888888
row1 column=info:sex, timestamp=1564034946493, value=male
1 row(s)
Took 0.0093 seconds
插入三条记录,其中row1是rowkey,info:name代表info列簇下的info列,weihao代表info列的值
3.3.6,获取一行数据,使用get命令,通过指定rowkey
hbase(main):041:0* get 'user', 'row1'
COLUMN CELL
info:address timestamp=1564034929590, value=xian
info:age timestamp=1564034921709, value=25
info:name timestamp=1564034907973, value=weihoa
info:phone timestamp=1564034998413, value=18888888888
info:sex timestamp=1564034946493, value=male
1 row(s)
Took 0.0233 seconds
3.3.7,失效表,如果你想删除表或者想该表表的设置,或者在其他的场景中,你需要先失效这张表,使用disable命令,可以使用enable命令重新启用表
hbase(main):044:0* disable 'user'
Took 0.8237 seconds
hbase(main):046:0> describe 'user'
Table user is DISABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLIC
ATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
1 row(s)
QUOTAS
0 row(s)
Took 0.0393 seconds
hbase(main):047:0> get 'user', 'row1'
COLUMN CELL
ERROR: Table user is disabled!
For usage try 'help "get"'
Took 0.6623 seconds
hbase(main):048:0> enable 'user'
Took 0.7444 seconds
hbase(main):049:0> get 'user', 'row1'
COLUMN CELL
info:address timestamp=1564034929590, value=xian
info:age timestamp=1564034921709, value=25
info:name timestamp=1564034907973, value=weihoa
info:phone timestamp=1564034998413, value=18888888888
info:sex timestamp=1564034946493, value=male
1 row(s)
Took 0.0407 seconds
3.3.8,删除表,使用drop命令删除表。
hbase(main):052:0* drop 'user'
ERROR: Table user is enabled. Disable it first.
For usage try 'help "drop"'
Took 0.0178 seconds
hbase(main):053:0>
hbase(main):054:0*
hbase(main):055:0*
hbase(main):056:0* disable 'user'
Took 0.7429 seconds
hbase(main):057:0> drop 'user'
Took 0.4543 seconds
3.3.9,退出Hbase Shell使用quit或者Ctrl+C退出Hbase。
(完)(^_^)