HBase —— 入门
HBase介绍
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase的架构组件
Client
- 客户端负责发送请求到数据库
- 客户端的连接方式主要有两种:hbase shell 和 类JDBC
- 发送的请求也是基本的数据库操作 DDL、DML、DQL
- client还维护着一些cache来加快hbase的访问,例如Region的位置信息
Zookeeper
- 保证任何时候集群只有一个master
- 存储所有Region的寻址入口和所有元数据信息
- 实时监控Region Server的状态,将其上下线信息汇报给Master
- 存储Hbase的schema,包括表和列簇
HMaster
- HBase的主节点,为Region Server分配Region并负责其负载均衡
- 管理用户的DDL操作,表的元数据存储在Zookeeper中,表的数据存储在HRegionServer上
- 当HRegionServer下线时,HMaster会将该HRegionServer上的region转移到其他HRegionServer上
HRegionServer
- HBase具体数据的管理者,维护Master分配给它的region,处理对这些region的IO请求
- 实时和Master保持通信,汇报当前节点信息
- 当接收到master创建一张表的命令时,分配一个region对应一张表
- Region Server 负责切分在运行过程中变得过大的region
- 当客户端发送DML和DQL操作时,HRegionServer负责和客户端连接
- 当前Region Server意外关闭,其region会被其他Region Server接手
HRegion
- HRegion是HBase中分布式存储的最小单元,可存储在不同的HRegionServer中
- HBase自动把表水平划分为多个region,每个region会保存一个表里某一段连续的数据
- 开始一张表只有一个region,当region增大一定程度会发生等分裂变。
Store
- HRegion是表获取和分布的基本元素,由一个或多个Store组成,每个store保存一个列簇
- store又由一个memstore和零个或多个StoreFile组成
- HFile是HBase在HDFS中文件的存储格式,包含多层索引,不必为了一部分数据而加载整个文件
Hlog
- 做任何事情之前先写日志,Hlog实际是一个普通的Hadoop Sequence文件
- Hlog直接存储在HDFS上,一个HRegionServer只有一个log文件
- 当memstore达到阈值开始写出日志文件,会在日志文件中设置一个检查点
- MasterProcWAL:HMaster记录管理操作,WAL记录所有HBase数据改变
HBase的数据模型
**数据类型:**HBase不存在数据类型,唯一的数据类型就是字节
**NameSpace:**命名空间是关系数据库中的概念,实际是表的逻辑分组。HBase有两个特殊的命名空间,default和hbase。
Table:
Row key | Time Stamp | Column Family1 | Column Family2 | Column Family3 |
---|---|---|---|---|
1 | t6 | CF2:q1=val1 | CF3:q3=val3 | |
2 | t3 | CF1:q2=val3 | ||
t2 | CF2:q3=val2 |
Row Key
- 一行的唯一标识,是用来检索记录的主键。
- 行键可以是任意字符串,最长64kb,以字节数组保存
- 存储是按照行键的字典序(byte order)进行排序。设计时一般将会一起被读取的行放在一起。
Column Family
-
每一行都有相同的列簇,列簇包含许多列与列的值,每个列簇都有一些存储属性可配置。
-
例如:可使用存储、压缩类型、存储版本号。
-
将功能属性相近的放在同一个列簇,而同一个列簇的列会存储在同一个Store中。
-
列簇一般在创建表的时候就声明,一般不要超过三个。
-
列簇由多个列组成,表由多个列簇组成。
Column Qualifier
- 列簇的限定词,可以理解为唯一标识,但是列标识时可改变的,所以每一行可以有不同的列标识。
- 使用方式必须为,列簇: 列
- 列可以根据需求动态添加或删除,同一个表中不同行的数据列都可以不同。
Cell
- cell由row key、column family、column qualifier、version组成
- cell中数据没有类型,全部由字节存储
Time Stamp
-
HBase中每个cell存储着同一份数据的不同版本。
-
版本通过时间戳来索引:
-
时间戳的类型是64位整型
-
时间戳精确到毫秒,不自行设置默认为系统当前时间
-
若应用程序想要避免版本冲突,就需要自己生成具有唯一性的时间戳
-
每个cell中不同版本的数据按照时间倒序排序,最新的排在最前
-
查询时不指定时间戳,则默认显示最新数据
-
为了避免数据存在过多版本难以管理,采用保存最后n个版本或保存最后一段时间内的版本的方式。
安装HBase
上传解压安装包
scp hbase压缩包 用户@机器IP:/上传/目录
tar -xzvf hbase压缩包 -C /解压/目录
修改配置文件
修改hbase-env.sh:
cd hbase-2.4.13/conf/
vim hbase-env.sh
export JAVA_HOME=/JDK安装路径
export HBASE_MANAGES_ZK=false
修改hbase-site.xml:
vim hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.19.5:8020/hbase</value>
</property>
<!--false单机模式、true分布式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--zookeeper位置-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.19.5:2181</value>
</property>
<!--zookeeper快照存储位置-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/sjj/install/apache-zookeeper-3.7.1-bin/data</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
配置环境变量
vim /etc/profile
# 配置HBase环境
export HBASE_HOME=/home/sjj/install/hbase-2.4.13
export PATH=$PATH:${HBASE_HOME}/bin:${HBASE_HOME}/sbin
source /etc/profile
复制jar包到lib
cd hbase-2.4.13/lib/client-facing-thirdparty
cp htrace-core4-4.2.0-incubating.jar ../lib
修改regionservers
cd hbase-2.4.13/conf
vim regionservers
你的节点机器
分发HBase包
scp -r hbase包 用户名@机器IP:/分发/目的地
分发完之后记得还要为分发的机器设置环境变量
启动HBase
# 注意要先启动zookeeper
start-dfs.sh
start-hbase.sh
hbase shell