一、Hbase的概述
1.1 Hbase的简介
1)简要介绍
1. Hbase是一个Hadoop 数据库
2. 是一个非关系型(NoSql:Not Only SQL)的、分布式的、具有良好的扩展性、面向列式存储的数据库。
3. 开发灵感来源于Google的Bigtable论文,java语言编写,并且开源。
2)特性
- 强一致性读/写:具有一致性读和写的功能,适合统计分析聚合类型的任务.
- 自动分片:hbase的表对应的region会根据大小自动拆分,并重写分布
- 自动 RegionServer故障转移
- Hbase的存储是基于HDFS的
- hbase可以和Mapreduce进行整合,从而进行数据分析
- Hbase还提供了java语言的客户端接口
- Thrift/REST API:Hbase也提供了非java语言的连接操作
- Hbase提供了块缓存和布隆过滤器等机制来提高查询效率等
3)何时选择Hbas
1. 当数据量特别大的时候,
2. 集群节点数多于10个的情况下。
3. 以及不需要具有事务、高级查询语言等功能的情况下。
1.2 Hbase的表模型(重点)
1.2.1 关系型数据库的表模型
1. 表模型是面向行式存储的。也就是每一条记录的数据都是紧凑的挨着的。
2. 优点:
-- 用户在插入数据时,效率特别高,只是追加操作。
-- 在查询操作时,比如select * 时效率是非常高的
-- 结构清晰,每一行的列的数量是固定的
-- 支持ACID事务
3. 缺点:
-- 一旦数据表中存储数据后,修改表结构变得特别困难。
-- 如果我们想扩展字段时,会对表结构产生影响。
-- 即使某一行中的某个字段没有赋值,也要使用null填充
-- 一旦涉及到多张表,因为数据表存在着复杂的关系,管理非常不方便。 比如外键约束
-- 一旦面对海量数据的处理时,读写性能特别差,尤其在高并发这一块。
1.2.2 Hbase的表模型(重点)
1、 hbase是面向列(colum family:列簇,列族)式存储的。
2. 定义表的时候不需要指定列名,列类型。只需要指定列族名即可
3. 数据实际上是按照key:value形式存储的,一个kv对通常称之为一个Cell(单元格)
4. 每个kv对后都有一个版本号。版本号是一个时间戳。一个K可以有多个版本
5. 为了方便管理多个KV对,引入了列族的概念。
-- 一个列族对应至少一个文件
-- 列族之间一定是不同的文件
6. 又为了区分KV是不同的事物的,引入了rowkey的概念。 因此rowkey必须具有唯一性
7. 为了管理表的数据,引入了region的概念。一个region对应一张表,或者是一张表的一部分。
region是由rowkey的范围来表示的。
如果一张表只有一个region:
region的rowkey的偏移量:startKey没有最小值,endKey也没有最大值。
8. Hbase的中的所有数据,都是byte[]类型。没有其他类型
9. hbase会在内存里进行排序:
查询时:先按照rowkey排序,然后是列族名排序,再按照key进行排序
实际上插入数据时: 先按照rowkey进行排序,再按照key进行排序 都是字典排序规则
1.3 Hbase的体系架构(重点)
1. Client:hbase的客户端
- hbase提供了客户端使用的API接口
- API里还维护了一个缓存机制,用于加快客户端访问的效率,比如缓存查询过的region的地址
2. Zookeeper
- 维护hbase的高可用,保证只有一个活跃的Hmaster,其他的为backup
- 维护着regionserver的动态上下线感知
- 维护着所有的region地址以及部分元数据
3. Hmaster
- hmaster主要管理着region的负载均衡
(1) 表的第一个region分配的位置
(2) region过大后,进行切分后,形成的新region的重新分配
(3) regionserver宕机后的region的重新分配
- hdfs上的垃圾回收
- 处理新的schama的维护(namespace的创建和删除等)
4. RegionServer
- 主要就是管理本节点上的所有region(包括region的切分)。
- 处理客户端的读写请求
- 负责hlog和storefile的读和写
5. Region
- 实际上就是表,或者是表的一部分。 是Hbase的表的存储单元
- 本质:在hdfs上是目录
6. store
- 一个列族对应一个store
- 本质:在是region目录下的子目录。
7. memstore
- 一个store 对应一个memstore(写缓存),默认大小是128M.
8. Hfile/StoreFile
- 当memstore达到阈值(128M,1小时,或者是内存的40%)就会被flush出来,形成一个storefile。以hfile存储格式存储到HDFS上。
9. hlog:
- 一个regionserver上维护着一个hlog文件。以WAL(write ahead log)格式记录着客户端的操作,防止宕机后丢失数据,然后可以重演一次,以便找回数据。
二、Hbase的安装
2.1 单机模式的简要说明(了解)
就是在一台节点上,解压,配置环境变量,启动一个hmaster服务,没有regionserver服务项,使用本地的文件系统存储数据。
2.2 伪分布式的搭建(了解)
伪分布式,指的是除了有hmaster外,只有一个regionserver服务项。存储的文件系统可以是本地文件系统,也可以使用hdfs。
2.3 完全分布式的搭建(重点)
2.3.1 简要说明
完全分布式,指的就是除了hmaster守护进程外,有多个regionserver守护进程,并且每一个regionserver守护进程独占一个机器节点。使用的文件系统是HDFS。
布局如下:
qianfeng01: hmaster regionserver
qianfeng02: hmaster regionserver
qianfeng03: regionserver
环境说明:
必须配置好集群的免密登录认证
必须配置时间同步。保证集群节点的时间差不能超过30秒,否则regionserver启动失败
2.3.2 搭建步骤
步骤1): 上传、解压、配置环境变量 、重导生效
[root@qianfeng01 ~]# tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv hbase-1.2.1/ hbase
[root@qianfeng01 local]# vim /etc/profile
.......省略.......
#hbase environment
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH
[root@qianfeng01 local]# source /etc/profile
步骤2):配置hbase-env.sh环境脚本
[root@qianfeng01 local]# vi $HBASE_HOME/conf/hbase-env.sh
#找到下面内容,解开注释,添加具体路径
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/usr/local/jdk
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false #禁止内置zookeeper
步骤3):配置hbase-site.xml文件
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://qianfeng01:8020/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>qianfeng01:2181,qianfeng02:2181,qianfeng03:2181</value>
</property>
<!--将属性hbase.unsafe.stream.capability.enforce 改为true -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>true</value>
</property>
<!-- 取消内存检查 -->
<property>
<name>hbase.table.sanity.checks</name>
<