大数据技术之Hbase

第 1 章 HBase 简介

1.1 什么是 HBase

HBase 的原型是 Google 的 BigTable 论文,受到了该论文思想的启发,目前作为 Hadoop
的子项目来开发维护,用于支持结构化的数据存储。
官方网站:http://hbase.apache.org
– 2006 年 Google 发表 BigTable 白皮书
– 2006 年开始开发 HBase
– 2008 年北京成功开奥运会,程序员默默地将 HBase 弄成了 Hadoop 的子项目
– 2010 年 HBase 成为 Apache 顶级项目
– 现在很多公司二次开发出了很多发行版本,你也开始使用了。
HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBASE 技
术可在廉价 PC Server 上搭建起大规模结构化存储集群。
HBase 的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能
够处理由成千上万的行和列所组成的大型数据。
HBase 是 Google Bigtable 的开源实现,但是也有很多不同之处。比如:Google Bigtable
利用 GFS 作为其文件存储系统,HBase 利用 Hadoop HDFS 作为其文件存储系统;Google
运行 MAPREDUCE 来处理 Bigtable 中的海量数据,HBase 同样利用 Hadoop MapReduce 来
处理HBase 中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用 Zookeeper
作为对应。

1.2 Hbase 特点

1)海量存储
Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下,
能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的
扩展性,才为海量数据的存储提供了便利

2)列式存储
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以
有非常多的列,列族在创建表的时候就必须指定。

3)极易扩展
Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩
展,一个是基于存储的扩展(HDFS)。
通过横向添加 RegionSever 的机器,进行水平扩展,提升 Hbase 上层的处理能力,提升 Hbsae服务更多 Region 的能力。
备注:RegionServer 的作用是管理 region、承接业务的访问,这个后面会详细的介绍通
过横向添加 Datanode 的机器,进行存储层扩容,提升 Hbase 的数据存储能力和提升后端存
储的读写能力

4)高并发
由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不
小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个
IO 延迟下降并不多。能获得高并发、低延迟的服务。

5)稀疏
稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空
的情况下,是不会占用存储空间的。

1.3 HBase 架构

在这里插入图片描述
从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等
几个组件组成,下面来介绍一下几个组件的相关功能:
1)Client
Client 包含了访问 Hbase 的接口,另外 Client 还维护了对应的 cache 来加速 Hbase 的访
问,比如 cache 的.META.元数据的信息。
2)Zookeeper
HBase 通过 Zookeeper 来做 master 的高可用、RegionServer 的监控、元数据的入口以及
集群配置的维护等工作。具体工作如下:
通过 Zoopkeeper 来保证集群中只有 1 个 master 在运行,如果 master 异常,会通过竞争
机制产生新的 master 提供服务
通过 Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候,通过回
调的形式通知 Master RegionServer 上下线的信息
通过 Zoopkeeper 存储元数据的统一入口地址
3)Hmaster
master 节点的主要职责如下:
为 RegionServer 分配 Region
维护整个集群的负载均衡
维护集群的元数据信息
发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上 当 RegionSever 失效的时候,协调对应 Hlog 的拆分
4)HregionServer
HregionServer 直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
管理 master 为其分配的 Region
处理来自客户端的读写请求
负责和底层 HDFS 的交互,存储数据到 HDFS
负责 Region 变大以后的拆分
负责 Storefile 的合并工作
5)HDFS
HDFS 为 Hbase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在
HDFS)的支持,具体功能概括如下:
提供元数据和表数据的底层分布式存储服务,数据多副本,保证的高可靠和高可用性

1.3 HBase 中的角色

1.3.1 HMaster

功能
1.监控 RegionServer
2.处理 RegionServer 故障转移
3.处理元数据的变更
4.处理 region 的分配或转移 5.在空闲时间进行数据的负载均衡
6.通过 Zookeeper 发布自己的位置给客户端

1.3.2 RegionServer

功能
1.负责存储 HBase 的实际数据
2.处理分配给它的 Region
3.刷新缓存到 HDFS
4.维护 Hlog
5.执行压缩
6.负责处理 Region 分片

1.3.3 其他组件

1.Write-Ahead logs
HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内
存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的
概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件
中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2.Region
Hbase 表的分片,HBase 表会根据 RowKey值被切分成不同的 region 存储在 RegionServer
中,在一个 RegionServer 中可以有多个不同的 region。
3.Store
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
4.MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在
WAL 中之后,RegsionServer 会在内存中存储键值对。
5.HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile
的形式存储在 HDFS 的。

第 2 章 HBase 安装

2.1 Zookeeper 正常部署

首先保证 Zookeeper 集群的正常部署,并启动之:

[hadoop@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
[hadoop@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
[hadoop@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start

2.2 Hadoop 正常部署

Hadoop 集群的正常部署并启动:

[hadoop@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[hadoop@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

2.3 HBase 的解压

解压 HBase 到指定目录:

[hadoop@hadoop102 software]$ tar -zxvf hbase-1.3.1-bin.tar.gz -C 
/opt/module

2.4 HBase 的配置文件

修改 HBase 对应的配置文件。
1)hbase-env.sh 修改内容:

export JAVA_HOME=/opt/module/jdk1.8.0_144
export HBASE_MANAGES_ZK=false

2)hbase-site.xml 修改内容:

<configuration>
<property> 
<name>hbase.rootdir</name> 
<value>hdfs://hadoop102:9000/hbase</value> 
</property>
<property> 
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
 <!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
 
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</
value>
</property>
<property> 
<name>hbase.zookeeper.property.dataDir</name>
 
<value>/opt/module/zookeeper-3.4.10/zkData</value>
</property>
</configuration>

3)regionservers:

hadoop102
hadoop103
hadoop104

4)软连接 hadoop 配置文件到 hbase:

[root@hadoop102 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
[root@hadoop102 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml

2.5 HBase 远程发送到其他集群

[hadoop@hadoop102 module]$ scp -rp root@hadoop102 hbase/
[hadoop@hadoop102 module]$ scp -rp root@hadoop103 hbase/
[hadoop@hadoop102 module]$ scp -rp root@hadoop104 hbase/

2.6 HBase 服务的启动

1.启动方式 1

[hadoop@hadoop102 hbase]$ bin/hbase-daemon.sh start master
[hadoop@hadoop102 hbase]$ bin/hbase-daemon.sh start regionserver

提示:
如果集群之间的节点时间不同步,会导致 regionserver 无法启动,抛出
ClockOutOfSyncException 异常。
修复提示:
a、同步时间服务
b、属性:hbase.master.maxclockskew 设置更大的值

<property>
 <name>hbase.master.maxclockskew</name>
 <value>180000</value>
 <description>Time difference of regionserver from 
master</description>
</property>

2.启动方式 2

[hadoop@hadoop102 hbase]$ bin/start-hbase.sh

对应的停止服务:

[hadoop@hadoop102 hbase]$ bin/stop-hbase.sh

2.7 查看 HBase 页面

启动成功后,可以通过“host:port”的方式来访问 HBase 管理页面,例如:
http://hadoop102:16010

第 3 章 HBase Shell 操作

3.1 基本操作

1.进入 HBase 客户端命令行

[atguigu@hadoop102 hbase]$ bin/hbase shell

2.查看帮助命令

hbase(main):001:0> help

3.查看当前数据库中有哪些表

hbase(main):002:0> list

3.2 表的操作

1.创建表

hbase(main):002:0> create 'student','info'

2.插入数据到表

hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'

3.扫描查看表数据

hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => 
'1001'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}

4.查看表结构

hbase(main):011:0> describe ‘student’ 5.更新指定字段的数据
hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'

6.查看“指定行”或“指定列族:列”的数据

hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1001','info:name'

7.统计表数据行数

hbase(main):021:0> count 'student'

8.删除数据
删除某 rowkey 的全部数据:

hbase(main):016:0> deleteall 'student','1001'

删除某 rowkey 的某一列数据:

hbase(main):017:0> delete 'student','1002','info:sex'

9.清空表数据

hbase(main):018:0> truncate 'student'

提示:清空表的操作顺序为先 disable,然后再 truncate。

10.删除表
首先需要先让该表为 disable 状态:

hbase(main):019:0> disable 'student'

然后才能 drop 这个表:

hbase(main):020:0> drop 'student'

提示:如果直接 drop 表,会报错:ERROR: Table student is enabled. Disable it first.
11.变更表信息
将 info 列族中的数据存放 3 个版本:

hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get 
'student','1001',{COLUMN=>'info:name',VERSIONS=>3}

第 4 章 HBase 数据结构

4.1 RowKey

与 nosql 数据库们一样,RowKey 是用来检索记录的主键。访问 HBASE table 中的行,只
有三种方式:
1.通过单个 RowKey 访问
2.通过 RowKey 的 range(正则)
3.全表扫描

RowKey 行键 (RowKey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为
10-100bytes),在 HBASE 内部,RowKey 保存为字节数组。存储时,数据按照 RowKey 的字
典序(byte order)排序存储。设计 RowKey 时,要充分排序存储这个特性,将经常一起读取的
行存储放到一起。(位置相关性)

4.2 Column Family

列族:HBASE 表中的每个列,都归属于某个列族。列族是表的 schema 的一部 分(而列
不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math
都属于 courses 这个列族。

4.3 Cell

由{rowkey, column Family:columu, version} 唯一确定的单元。cell 中的数据是没有类型
的,全部是字节码形式存贮。
关键字:无类型、字节码

4.4 Time Stamp

HBASE 中通过 rowkey和 columns 确定的为一个存贮单元称为cell。每个 cell都保存 着
同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以
由 HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳
也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性
的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE 提供 了两
种数据版本回收方式。一是保存数据的最后 n 个版本,二是保存最近一段 时间内的版本(比
如最近七天)。用户可以针对每个列族进行设置

4.5 命名空间

命名空间的结构:在这里插入图片描述
1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,
则在 default 默认的命名空间中。
2) RegionServer group:一个命名空间包含了默认的 RegionServer Group。
3) Permission:权限,命名空间能够让我们来定义访问控制列表 ACL(Access Control List)。
例如,创建表,读取表,删除,更新等等操作。
4) Quota:限额,可以强制一个命名空间可包含的 region 的数量。

第 5 章 HBase 原理

5.1 读流程

在这里插入图片描述
1)Client 先访问 zookeeper,从 meta 表读取 region 的位置,然后读取 meta 表中的数据。meta
中又存储了用户表的 region 信息;
2)根据 namespace、表名和 rowkey 在 meta 表中找到对应的 region 信息;
3)找到这个 region 对应的 regionserver;
4)查找对应的 region;
5)先从 MemStore 找数据,如果没有,再到 BlockCache 里面读;
6)BlockCache 还没有,再到 StoreFile 上读(为了读取的效率);
7)如果是从 StoreFile 里面读取的数据,不是直接返回给客户端,而是先写入 BlockCache,
再返回给客户端。

5.2 写流程

在这里插入图片描述
1)Client 向 HregionServer 发送写请求;
2)HregionServer 将数据写到 HLog(write ahead log)。为了数据的持久化和恢复;
3)HregionServer 将数据写到内存(MemStore);
4)反馈 Client 写成功。

5.3 数据 flush 过程

1)当 MemStore 数据达到阈值(默认是 128M,老版本是 64M),将数据刷到硬盘,将内存
中的数据删除,同时删除 HLog 中的历史数据;
2)并将数据存储到 HDFS 中;
3)在 HLog 中做标记点。

5.4 数据合并过程

1)当数据块达到 4 块,Hmaster 触发合并操作,Region 将数据块加载到本地,进行合并;
2)当合并的数据超过 256M,进行拆分,将拆分后的 Region 分配给不同的 HregionServer
管理;
3)当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.;
4)注意:HLog 会同步到 HDFS。

第 6章 HBase 优化

6.1 高可用

在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如
果 Hmaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不
会维持太久。所以 HBase 支持对 Hmaster 的高可用配置。
1.关闭 HBase 集群(如果没有开启则跳过此步)

[hadoop@hadoop102 hbase]$ bin/stop-hbase.sh

2.在 conf 目录下创建 backup-masters 文件

[hadoop@hadoop102 hbase]$ touch conf/backup-masters

3.在 backup-masters 文件中配置高可用 HMaster 节点

[hadoop@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters

4.将整个 conf 目录 scp 到其他节点

[hadoop@hadoop102 hbase]$ scp -r conf/ hadoop103:/opt/module/hbase/
[hadoop@hadoop102 hbase]$ scp -r conf/ hadoop104:/opt/module/hbase/

5.打开页面测试查看
http://hadooo102:16010

6.2 预分区

每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的
rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投
放的分区提前大致的规划好,以提高 HBase 性能。
1.手动设定预分区

hbase> create 'staff1','info','partition1',SPLITS => 
['1000','2000','3000','4000']

2.生成 16 进制序列预分区

create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 
'HexStringSplit'}

3.按照文件中设置的规则预分区
创建 splits.txt 文件内容如下:

aaaa
bbbb
cccc
dddd

然后执行:

create 'staff3','partition3',SPLITS_FILE => 'splits.txt'

4.使用 JavaAPI 创建预分区

//自定义算法,产生一系列 Hash 散列值存储在二维数组中
byte[][] splitKeys = 某个散列值函数
//创建 HBaseAdmin 实例
HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());
//创建 HTableDescriptor 实例
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
//通过 HTableDescriptor 实例和散列值二维数组创建带有预分区的 HBase 表
hAdmin.createTable(tableDesc, splitKeys);

6.3RowKey 设计

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于
哪个一个预分区的区间内,设计 rowkey的主要目的 ,就是让数据均匀的分布于所有的 region
中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案。

1.生成随机数、hash、散列值

比如:
原 本 rowKey 为 1001 的 , SHA1 后变成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
原 本 rowKey 为 3001 的 , SHA1 后变成:49042c54de64a1e9bf0b33e00245660ef92dc7bd
原 本 rowKey 为 5001 的 , SHA1 后变成:7b61dec07e02c188790670af43e717f0f46e8913
在做此操作之前,一般我们会选择从数据集中抽取样本,来决定什么样的 rowKey 来 Hash后作为每个分区的临界值。

2.字符串反转

20170524000001 转成 10000042507102
20170524000002 转成 20000042507102

这样也可以在一定程度上散列逐步 put 进来的数据。
3.字符串拼接

20170524000001_a12e
20170524000001_93i7

6.4 内存优化

HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分
配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,因为 GC 过
程持续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因
为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

6.5 基础优化

1.允许在 HDFS 的文件中追加内容

hdfs-site.xml、hbase-site.xml
属性:dfs.support.append
解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true。

2.优化 DataNode 允许的最大文件打开数

hdfs-site.xml
属性:dfs.datanode.max.transfer.threads
解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,
设置为 4096 或者更高。默认值:4096

3.优化延迟高的数据操作的等待时间

hdfs-site.xml
属性:dfs.image.transfer.timeout
解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把
该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。

4.优化数据的写入效率

mapred-site.xml
属性:
mapreduce.map.output.compress
mapreduce.map.output.compress.codec
解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为
true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者
其他压缩方式。

5.设置 RPC 监听数量

hbase-site.xml
属性:hbase.regionserver.handler.count
解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写
请求较多时,增加此值。

6.优化 HStore 文件大小

hbase-site.xml
属性:hbase.hregion.max.filesize
解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值,
因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间
过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两
个 Hfile。 

7.优化 hbase 客户端缓存

hbase-site.xml
属性:hbase.client.write.buffer
解释:用于指定 HBase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内
存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。

8.指定 scan.next 扫描 HBase 所获取的行数

hbase-site.xml
属性:hbase.client.scanner.caching
解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

9.flush、compact、split 机制

当 MemStore 达到阈值,将 Memstore 中的数据 Flush 进 Storefile;compact 机制则是把 flush
出来的小文件合并成大的 Storefile 文件。split 则是当 Region 达到阈值,会把过大的 Region
一分为二。

**涉及属性:**
即:128M 就是 Memstore 的默认阈值
hbase.hregion.memstore.flush.size:134217728
即:这个参数的作用是当单个 HRegion 内所有的 Memstore 大小总和超过指定值时,flush 该
HRegion 的所有 memstore。RegionServer 的 flush 是通过将请求添加一个队列,模拟生产消
费模型来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可
能会导致内存陡增,最坏的情况是触发 OOM。
hbase.regionserver.global.memstore.upperLimit:0.4
hbase.regionserver.global.memstore.lowerLimit:0.38
即:当 MemStore 使用内存总量达到 hbase.regionserver.global.memstore.upperLimit 指定值时,
将会有多个 MemStores flush 到文件中,MemStore flush 顺序是按照大小降序执行的,直到
刷新到 MemStore 使用内存略小于 lowerLimit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-FuWei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值