通俗易懂之HBase

定义

面向分布式的数据库系统,构建在Hadoop(HDFS)和Zookeeper之上,灵感来源于Google的Bigtable论文

基本结构

分布式特性

类似于Mysql的数据最终是存储在磁盘的文件系统中,程序本身只是提供对这些数据的增删改查的能力。HBase相似,它同样提供对数据的处理能力,不同的是HBase有运行在多台机器上的RegionServer,不同的RegionServer处理对应的数据,并且选择HDFS作为最终存储的文件系统。这样的好处是易扩展(通过增加RegionServer数量),高并发(机器数量多)。这也对应了定义中的分布式结构以及构建在Hadoop(HDFS)上的特性。

表结构(面向列)

先看与Mysql的对比图:

Mysql表结构:t_user(id,name,age,addr)
id(int)name(varchar)age(int)addr(varchar)
1张三22河南商丘
2李四18上海市
HBase表结构:t_user
row_key列族:base_info列族:extra_info
0001id:1,name:张三,age:22,addr:河南商丘
0002id:2,name:李四,birthday:1993-3-6,phone:13460199189addr:上海市
0003id:3,name:王五hobby:sleep

按照Mysql的视角来看,HBase是一张没有规则的表,如果我们把HBase出现的所有属性都列出来并填写对应的值,可以得到:

idnameageaddrbirthdayphonehobby
1张三22河南商丘
2李四上海市1993-3-613460199189
3王五sleep

这里体现了HBase的稀疏性,但是看起来并不是高明的做法,因为这样并没有加快查找速度

出现这种情况的原因是我们按照了Mysql的思路来整理甚至存储这些数据,这是不对的。因为HBase是面向列的,这点刚接触比较难以转变过来,请看HBase在物理上是如何存储的:

0001:base_info:id  --  1
0001:base_info:name  --  张三
0001:base_info:age  --  22
0001:base_info:addr  --  河南商丘
0002:base_info:id  --  2
0002:base_info:name  --  李四
0002:base_info:birthday  --  1993-3-6
0002:base_info:phone  --  13460199189
0002:extra_info:addr  --  上海市
0003:extra_info:hobby  --  sleep
......
  1. 容易看出上面的数据结构是按照key – value的形式,key由三部分组成:行键(row_key):列族名(columnFamily):列名(qualifier)(其实还有一个时间戳属性,为简明未给出);value则对应该key所指向的数值,个人将key比喻为该值所在的路径,因为路径唯一,所以很容易能够找到对应值。根据key的组成我们也能理解了为什么说HBase是面向列的
  2. 其实这个属性值存放在哪个列族是没有关系的,哪怕相同属性名存储在不同的列族中都是允许的,因为我们通过它在物理上的存储可以看出两条数据并没有什么关联。
  3. 在存储时,这些key – value是按照”完整key“的字典序有序存储的(上面的物理存放展示为了方便理解并未完全按照字典序),所以它可以有很高的查询效率。
  4. 在对数据的格式要求方面,HBase并没有做什么限制,我理解底层应该是存储了数据的byte[],所以哪怕你存放MP4之类格式的数据都是允许的。

集群角色

Region

Region是HBase中的基本单元(存放某段范围行键row_key的数据)。当一个Region增长到一定大小后,会自动分裂为两个。
在每个Region中大概率会有多个列族存在,其实在HDFS中每个Region不同列族的数据是存放在不同文件中,例如有两个Region:region-id-1,region-id-2,每个Region包含两个列族:f1,f2,那么在HDFS中存储形式为:

/hbase/data/t_user/region-id-1/f1/文件1(K–V)
/hbase/data/t_user/region-id-1/f2/文件2(K–V)
/hbase/data/t_user/region-id-2/f1/文件3(K–V)
/hbase/data/t_user/region-id-2/f2/文件4(K–V)

可知HBase的物理数据存储是按照列族分开的,进一步说明了HBase为列式存储数据库。为了避免在HDFS中生成更多的小文件,查询更多的文件和浪费存储空间,因此建议列族不要定的太多,名称尽可能短。

RegionServer

RegionServer是一套对Region中的数据进行操作的程序。
作为分布式结构,一般的集群架构都会有多个RegionServer,他们同样通过Master来对这些RegionServer进行管理。Region需要HDFS来支持,Master则对RegionServer的管理一般会部署到zookeeper上面,当然Master也可以有多个防止单一Master故障时不能及时恢复。

HBase安装部署

前提条件:zookeeper和HDFS集群都已正常部署并启动

  1. 下载HBase压缩包
  2. 解压:
tar -zxvf hbase-2.3.2-bin.tar.gz -C /opt/module
  1. 修改配置文件
  • hbase-env.sh修改内容
export JAVA_HOME=/opt/module/jdk1.8.0_144
#是否使用HBase自带的zookeeper,一般关闭,使用自己安装的
export HBASE_MANAGES_ZK=false
  • hbase-site.xml修改内容
<configuration>
<!--指定hbase在HDFS上存储的路径-->
<property>
	<name>hbase.rootdir</name>
	<value>hdfs://ip:port/hbase</value>
</property>
<!--指定hbase是分布式运行-->
<property>
	<name>hbase.cluster.distributed</name>
	<value>true</value>
</property>
<!--指定zookeeper地址,若有多个用,分割-->
<property>
	<name>hbase.zookeeper.quorum</name>
	<value>ip1:port1,ip2:port2,ip3:port3</value>
</property>
<property>
	<name>hbase.unsafe.stream.capability.enforce</name>
	<value>false</value>
</property>
</configuration>
  • regionservers(只是在运行启动脚本时使用,master使用的时zk来进行管理的):
ip1
ip2
ip3
  1. 远程发送到其他节点
scp -r hbase/ ipx:$PWD
  1. HBase服务启动
  • master和regionserver分开启动
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver

注意: 如果集群之间的时间不同步,会导致regionserver无法启动,可以通过同步时间服务或者设置hbase.master.maxclockskew设置更大的值。

  • master和regionserver同时启动:
bin/start-hbase.sh

对应的停止服务:

bin/stop-hbase.sh
  1. 查看HBase页面
    启动成功后,可以通过host:port(通常为16010)访问HBase的集群管理页面

HBase常用命令

通用命令

启动hbase shell:

hbase shell

以下命令均可通过在hbase shell输入:help 命令来查看

通用命令:

#查看状态
status
#查看版本
version
#表引用命令提供帮助
table_help
#提供有关用户的信息
whoami

数据定义语言DDL

#create 创建一个表,比如:
create 'student','info' #创建表student,包含一个列族info
#version表示存储数据的最大历史版本数,TTL表示数据最大的存活时间,默认永久
#BLOOMFILTER表示布隆过滤器,用来快速定位需要查询的数据所在的文件位置。可选择ROW,ROWCOL级别
create 'student',{NAME=>'f1',version=>3,TTL=>5000,BLOOMFILTER=>'ROW'} 
create 'userprofile','tags',SPLITS => {'a','d','f','h','j','o'}
list #列出所有的表
desc 'tableName' #查看表信息
drop 'tableName' #删除表
disable 'tableName' #禁用表
#变更表结构,例如将版本参数修改为存储2个版本:
alter 'tableName',{NAME=>'info',VERSION=>2}

数据操作语言DML

扫描表命令:scan

#扫描查看表数据
scan 'tableName'
#扫描表查看指定列的数据
scan 'tableName',{COLUMNS=>'st1:age'}
#扫描表并使用过滤器(相当于SQL中的where)筛选指定数据
#例如,筛选row以10开头的数据(ROWPREFIXFILTER为hbase自带的**行前置过滤器**)
scan 'tableName',{ROWPREFIXFILTER => '10'}
#扫描表查看指定row范围内的数据,后面的STOPROW参数也可省略
scan 'tableName',{STARTROW=>'1001',STOPROW=>'1001'}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值