This commit is contained in:
罗祥 2019-04-02 17:35:01 +08:00
parent 3289a0ab50
commit b95d247d28
4 changed files with 222 additions and 228 deletions

View File

@ -77,9 +77,9 @@
## 九、Azkaban
## 十、Hbase
1. Hbase基本环境搭建Standalone /pseudo-distributed mode
1. [Hbase基本环境搭建Standalone /pseudo-distributed mode](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hbase%E5%9F%BA%E6%9C%AC%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md)
2. Hbase系统架构及数据结构
2. [Hbase系统架构及数据结构](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Hbase%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%8F%8A%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.md)
3. Hbase shell
4. Hbase Java Api
5. Hbase 协处理器

View File

@ -1,5 +1,6 @@
# Hbase系统架构及数据结构
<nav>
# Hbase系统架构及数据结构
<nav>
<a href="#一基本概念">一、基本概念</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-Row-Key-行键">2.1 Row Key (行键)</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-Column-Family列族">2.2 Column Family列族</a><br/>
@ -18,204 +19,204 @@
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-读取数据的流程">4.2 读取数据的流程</a><br/>
</nav>
## 一、基本概念
一个典型的Hbase Table 表如下:
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-webtable.png"/> </div>
### 2.1 Row Key (行键)
row key是用来检索记录的主键。访问Hbase table中的行只有三种方式
+ 通过单个row key访问
+ 通过row key的range
+ 全表扫描
Row key行键 (Row key)可以是任意字符串(最大长度是 64KB实际应用中长度一般为 10-100bytes)在Hbase内部row key保存为字节数组。存储时数据按照Row key的字典序(byte order)排序存储。设计key时要充分排序存储这个特性将经常一起读取的行存储放到一起(位置相关性)
注意:
+ 字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整的自然序行键必须用0作左填充。
+ 行的一次读写是原子操作 (不论一次读写多少列)。
### 2.2 Column Family列族
hbase表中的每个列Column都归属与某个列族。列族是表的schema的一部分(列不是)必须在使用表之前定义。列名都以列族作为前缀。例如courses:historycourses:math都属于courses 这个列族。
### 2.3 Column Qualifier (列限定符)
列限定符被添加到列族中,以提供给定数据的索引。给定列族`content`,列限定符可能是`content:html`,另一个可能是`content:pdf`。虽然列族在创建表时是固定的,但列限定符是可变的,并且行与行之间可能有很大差异。
### 2.4 Column(列)
HBase 中的列由列族和列限定符组成,它们由`:`(冒号)字符分隔。
### 2.5 Cell
cell是行列族和列限定符的组合并包含值和时间戳。
### 2.6 Timestamp(时间戳)
HBase 中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中不同版本的数据按照时间倒序排序即最新的数据排在最前面。
## 二、存储结构
### 2.1 Regions
Hbase Table中的所有行都按照row key的字典序排列。HBase Tables 通过行键的范围row key range被水平切分成多个Region, 一个Region包含了在start key 和 end key之间的所有行。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig2.png"/> </div>
每个表一开始只有一个Region 随着数据不断插入表Region不断增大当增大到一个阀值的时候Region就会等分会两个新的Region。当Table中的行不断增多就会有越来越多的Region。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-region-splite.png"/> </div>
Region是Hbase中**分布式存储和负载均衡的最小单元**。最小单元就表示不同的Region可以分布在不同的Region Server上。但一个Region是不会拆分到多个server上的。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-region-dis.png"/> </div>
### 2.2 Region Server
Region Server在HDFS data node上运行。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-hadoop.png"/> </div>
Region Server 存取一个子表时,会创建一个 Region 对象,然后对表的每个列族 (Column Family) 创建一个 Store 实例,每个 Store 都会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFileHFile 就是实际的存储文件。因此,一个 Region 有多少个列族就有多少个 Store。
Region Server还具有以下组件
+ WALWrite Ahead Log预写日志是分布式文件系统上的文件。 WAL用于存储尚未进持久化存储的新数据以便在发生故障时进行恢复。
+ BlockCache是读缓存。它将频繁读取的数据存储在内存中。如果存储不足它将按照`最近最少使用原则`清除多余的数据。
+ MemStore是写缓存。它存储尚未写入磁盘的新数据并会在数据写入磁盘之前对其进行排序。每个Region上的每个列族都有一个MemStore。
+ HFile将行数据按照KeyValues的形式存储在文件系统上。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-Region-Server.png"/> </div>
## 三、Hbase系统架构
### 3.1 系统架构
HBase系统遵循master/salve架构由三种不同类型的组件组成。
**Zookeeper**
1. 保证任何时候,集群中只有一个master
2. 存贮所有Region的寻址入口
3. 实时监控Region Server的状态将Region server的上线和下线信息实时通知给Master
4. 存储Hbase的schema,包括有哪些Table每个Table有哪些column family
**Master**
1. 为Region server分配Region
2. 负责Region server的负载均衡
3. 发现失效的Region server并重新分配其上的Region
4. GFS上的垃圾文件回收
5. 处理schema更新请求
**Region Server**
1. Region server维护Master分配给它的Region 处理发到Region上的IO请求
2. Region server负责切分在运行过程中变得过大的Region
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig1.png"/> </div>
### 3.2 组件间的协作
HBase使用ZooKeeper作为分布式协调服务来维护集群中的服务器状态。 Zookeeper维护可用服务列表并提供服务故障通知。
+ 每个Region Server都会在ZooKeeper上创建一个临时节点HMaster通过Zookeeper的Watcher机制监控这些节点以发现可用的Region Server和故障的Region Server
+ Masters会竞争创建临时节点 Zookeeper确定第一个并使用它来确保只有一个主服务器处于活动状态。主Master向Zookeeper发送心跳备用HMaster监听主HMaster故障的通知在主HMaster发生故障的时候取而代之。
+ 如果Region Server或主HMaster未能发送心跳则会话过期并删除相应的临时节点。这会触发定义在该节点上的Watcher事件使得Region Server或备用Region Server得到通知。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig5.png"/> </div>
## 四、数据的读写流程简述
### 4.1 写入数据的流程
1. client向region server提交写请求
2. region server找到目标region
3. region检查数据是否与schema一致
4. 如果客户端没有指定版本,则获取当前系统时间作为数据版本
5. 将更新写入WAL log
6. 将更新写入Memstore
7. 判断Memstore存储是否已满如果存储已满则需要flush为Store Hfile文件
> 更为详细写入流程可以参考:[HBase 数据写入流程解析](http://hbasefly.com/2016/03/23/hbase_writer/)
### 4.2 读取数据的流程
以下是客户端首次读写Hbase 的流程:
1. 客户端从Zookeeper获取 META 表所在的Region Server。
2. 客户端访问 META 表所在的Region Server查询META 表获取它想访问的行键Row Key所在的Region Server。客户端将缓存这些信息以及META表的位置。
3. 客户端端将从相应的Region Server获取行数据。
如果再次读取客户端将使用缓存来获取META 的位置及之前的行键。这样时间久了客户端不需要查询META表除非Region移动所导致的缓存失效这样的话则将会重新查询更新缓存。
META 表是Hbase中一张特殊的表它保存了Hbase中所有数据表的Region位置信息ZooKeeper存储着META 表的位置。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig7.png"/> </div>
> 更为详细读取数据流程参考:
>
> [HBase原理数据读取流程解析](http://hbasefly.com/2016/12/21/hbase-getorscan/)
>
> [HBase原理迟到的数据读取流程部分细节](http://hbasefly.com/2017/06/11/hbase-scan-2/)
## 参考资料
本篇文章内容主要参考自官方文档和以下两篇博客,图片也主要引用自以下两篇博客:
+ [HBase Architectural Components](https://mapr.com/blog/in-depth-look-hbase-architecture/#.VdMxvWSqqko)
+ [Hbase系统架构及数据结构](https://www.open-open.com/lib/view/open1346821084631.html)
官方文档:
+ [Apache HBase ™ Reference Guide](https://hbase.apache.org/2.1/book.html)
## 一、基本概念
一个典型的Hbase Table 表如下:
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-webtable.png"/> </div>
### 2.1 Row Key (行键)
Row Key是用来检索记录的主键。访问Hbase Table中的行只有三种方式
+ 通过单个Row Key访问
+ 通过Row Key的range
+ 全表扫描
Row Key (行键)可以是任意字符串(最大长度是 64KB实际应用中长度一般为 10-100bytes)在Hbase内部Row Key保存为字节数组。存储时数据按照Row Key的字典序(byte order)排序存储。设计key时要充分排序存储这个特性将经常一起读取的行存储放到一起(位置相关性)
需要注意以下两点
+ 字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整的自然序行键必须用0作左填充。
+ 行的一次读写是原子操作 (不论一次读写多少列)。
### 2.2 Column Family列族
hbase表中的每个列Column都归属与某个列族。列族是表的schema的一部分(列不是),必须在使用表之前定义。列名都以列族作为前缀。例如`courses:history``courses:math`都属于`courses `这个列族。
### 2.3 Column Qualifier (列限定符)
列限定符被添加到列族中,以提供给定数据的索引。给定列族`content`,列限定符可能是`content:html`,另一个可能是`content:pdf`。虽然列族在创建表时是固定的,但列限定符是可变的,并且行与行之间可能有很大差异。
### 2.4 Column(列)
HBase 中的列由列族和列限定符组成,它们由`:`(冒号)字符分隔。
### 2.5 Cell
Cell是行列族和列限定符的组合并包含值和时间戳。
### 2.6 Timestamp(时间戳)
HBase 中通过`row``columns`确定的为一个存储单元称为Cell。每个Cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个Cell中不同版本的数据按照时间倒序排序即最新的数据排在最前面。
## 二、存储结构
### 2.1 Regions
Hbase Table中的所有行都按照Row Key的字典序排列。HBase Tables 通过行键的范围row key range被水平切分成多个Region, 一个Region包含了在start key 和 end key之间的所有行。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig2.png"/> </div>
每个表一开始只有一个Region随着数据不断插入表Region不断增大当增大到一个阀值的时候Region就会等分会两个新的Region。当Table中的行不断增多就会有越来越多的Region。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-region-splite.png"/> </div>
Region是Hbase中**分布式存储和负载均衡的最小单元**。最小单元就表示不同的Region可以分布在不同的Region Server上。但一个Region是不会拆分到多个server上的。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-region-dis.png"/> </div>
### 2.2 Region Server
Region Server在HDFS DataNode上运行。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-hadoop.png"/> </div>
Region Server存取一个子表时会创建一个 Region 对象,然后对表的每个列族 (Column Family) 创建一个 Store 实例,每个 Store 都会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFileHFile 就是实际的存储文件。因此,一个 Region 有多少个列族就有多少个 Store。
Region Server还具有以下组件
+ WALWrite Ahead Log预写日志是分布式文件系统上的文件。 WAL用于存储尚未进持久化存储的新数据以便在发生故障时进行恢复。
+ BlockCache是读缓存。它将频繁读取的数据存储在内存中。如果存储不足它将按照`最近最少使用原则`清除多余的数据。
+ MemStore是写缓存。它存储尚未写入磁盘的新数据并会在数据写入磁盘之前对其进行排序。每个Region上的每个列族都有一个MemStore。
+ HFile将行数据按照KeyValues的形式存储在文件系统上。
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-Region-Server.png"/> </div>
## 三、Hbase系统架构
### 3.1 系统架构
HBase系统遵循Master/Salve架构由三种不同类型的组件组成。
**Zookeeper**
1. 保证任何时候,集群中只有一个Master
2. 存贮所有Region的寻址入口
3. 实时监控Region Server的状态将Region server的上线和下线信息实时通知给Master
4. 存储Hbase的schema,包括有哪些Table每个Table有哪些Column Family
**Master**
1. 为Region server分配Region
2. 负责Region server的负载均衡
3. 发现失效的Region server并重新分配其上的Region
4. GFS上的垃圾文件回收
5. 处理schema更新请求
**Region Server**
1. Region server维护Master分配给它的Region 处理发到Region上的IO请求
2. Region server负责切分在运行过程中变得过大的Region
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig1.png"/> </div>
### 3.2 组件间的协作
HBase使用ZooKeeper作为分布式协调服务来维护集群中的服务器状态。 Zookeeper维护可用服务列表并提供服务故障通知。
+ 每个Region Server都会在ZooKeeper上创建一个临时节点HMaster通过Zookeeper的Watcher机制监控这些节点以发现可用的Region Server和故障的Region Server
+ Masters会竞争创建临时节点 Zookeeper确定第一个并使用它来确保只有一个主服务器处于活动状态。主Master向Zookeeper发送心跳备用HMaster监听主HMaster故障的通知在主HMaster发生故障的时候取而代之。
+ 如果Region Server或主HMaster未能发送心跳则会话过期并删除相应的临时节点。这会触发定义在该节点上的Watcher事件使得Region Server或备用Region Server得到通知。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig5.png"/> </div>
## 四、数据的读写流程简述
### 4.1 写入数据的流程
1. client向Region server提交写请求
2. Region server找到目标Region
3. Region检查数据是否与schema一致
4. 如果客户端没有指定版本,则获取当前系统时间作为数据版本
5. 将更新写入WAL log
6. 将更新写入Memstore
7. 判断Memstore存储是否已满如果存储已满则需要flush为Store Hfile文件
> 更为详细写入流程可以参考:[HBase 数据写入流程解析](http://hbasefly.com/2016/03/23/hbase_writer/)
### 4.2 读取数据的流程
以下是客户端首次读写Hbase 的流程:
1. 客户端从Zookeeper获取 META 表所在的Region Server。
2. 客户端访问 META 表所在的Region Server查询META 表获取它想访问的行键Row Key所在的Region Server。客户端将缓存这些信息以及META表的位置。
3. 客户端端将从相应的Region Server获取行数据。
如果再次读取客户端将使用缓存来获取META 的位置及之前的行键。这样时间久了客户端不需要查询META表除非Region移动所导致的缓存失效这样的话则将会重新查询更新缓存。
META 表是Hbase中一张特殊的表它保存了Hbase中所有数据表的Region位置信息ZooKeeper存储着META 表的位置。
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/HBaseArchitecture-Blog-Fig7.png"/> </div>
> 更为详细读取数据流程参考:
>
> [HBase原理数据读取流程解析](http://hbasefly.com/2016/12/21/hbase-getorscan/)
>
> [HBase原理迟到的数据读取流程部分细节](http://hbasefly.com/2017/06/11/hbase-scan-2/)
## 参考资料
本篇文章内容主要参考自官方文档和以下两篇博客,图片也主要引用自以下两篇博客:
+ [HBase Architectural Components](https://mapr.com/blog/in-depth-look-hbase-architecture/#.VdMxvWSqqko)
+ [Hbase系统架构及数据结构](https://www.open-open.com/lib/view/open1346821084631.html)
官方文档:
+ [Apache HBase ™ Reference Guide](https://hbase.apache.org/2.1/book.html)

View File

@ -25,6 +25,12 @@
### 五、Hbase
1. [Hbase基本环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hbase%E5%9F%BA%E6%9C%AC%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md)
### 五、Linux
+ [虚拟机静态IP配置](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/虚拟机静态IP配置.md)

View File

@ -2,21 +2,8 @@
<nav>
<a href="#一安装前置条件说明">一、安装前置条件说明</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#11-JDK版本说明">1.1 JDK版本说明</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-standalone-模式和伪集群模式的区别">1.2 standalone 模式和伪集群模式的区别</a><br/>
<a href="#二Standalone-模式">二、Standalone 模式</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-下载并解压">2.1 下载并解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-配置环境变量">2.2 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-进行Hbase相关配置">2.3 进行Hbase相关配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-启动Hbase">2.4 启动Hbase</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#25-验证启动是否成功">2.5 验证启动是否成功</a><br/>
<a href="#三伪集群模式安装Pseudo-Distributed">三、伪集群模式安装Pseudo-Distributed</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-Hadoop单机伪集群安装">3.1 Hadoop单机伪集群安装</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-Hbase版本选择">3.2 Hbase版本选择</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-软件下载解压">3.3 软件下载解压</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-配置环境变量">3.4 配置环境变量</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#35-进行Hbase相关配置">3.5 进行Hbase相关配置</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#36-验证启动是否成功">3.6 验证启动是否成功</a><br/>
</nav>
## 一、安装前置条件说明
@ -119,7 +106,7 @@ export JAVA_HOME=/usr/java/jdk1.8.0_201
验证方式二访问Hbase Web UI 页面,默认端口为`16010`
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-web-ui.png"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-web-ui.png"/> </div>
@ -127,21 +114,21 @@ export JAVA_HOME=/usr/java/jdk1.8.0_201
### 3.1 Hadoop单机伪集群安装
因为上面的单机版本采用了本地文件系统作为存储为了演示Hbase支持的多种存储方式这里我们采用HDFS作为Hbase的存储方案。需要预先安装Hadoop,Hadoop安装方式见本仓库[Hadoop单机伪集群搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop单机版本环境搭建.md)
> 需要说明的是Hbase即使是伪集群安装模式依然可以采用本地文件系统作为存储。
这里我们采用HDFS作为Hbase的存储方案需要预先安装Hadoop。如果你没有安装Hadoop依然可以按照Standalone 模式,采用本地文件系统作为存储方案)
> [Hadoop单机伪集群搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop单机版本环境搭建.md)
### 3.2 Hbase版本选择
Hbase的版本必须要与Hadoop的版本兼不然会发生各种Jar包冲突由于我们Hadoop采用的版本为`hadoop-2.6.0-cdh5.15.2`,所以这里保持CDH版本一致我们选择的Hbase版本为`hbase-1.2.0-cdh5.15.2` Hbase 1.2 的安装需要依赖JDK 1.7+ 。故所有软件版本如下:
Hbase的版本必须要与Hadoop的版本兼不然会发生各种Jar包冲突。
+ **hadoop 版本** hadoop-2.6.0-cdh5.15.2
由于我们Hadoop采用的版本为`hadoop-2.6.0-cdh5.15.2`,所以这里保持CDH版本一致我们选择的Hbase版本为`hbase-1.2.0-cdh5.15.2` Hbase 1.2 的安装需要依赖JDK 1.7+ 。所有软件版本如下:
+ **hbase 版本** hbase-1.2.0-cdh5.15.2
+ hadoop 版本: hadoop-2.6.0-cdh5.15.2
+ **JDK 版本**JDK 1.8
+ hbase 版本: hbase-1.2.0-cdh5.15.2
+ JDK 版本JDK 1.8
@ -236,4 +223,4 @@ hadoop001
验证方式二访问Hbase Web UI 界面需要注意的是1.2 版本的Hbase的访问端口为`60010`
<div align="center"> <img width="600px" src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-60010.png"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-60010.png"/> </div>