第1章 HBase简介
1.1 HBase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
1.2 HBase数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
1.2.1 HBase逻辑结构
1.2.2 HBase物理存储结构
1.2.3 数据模型
1)Name Space
- 命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。
2)Table
- 类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。
3)Row
- HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
4)Column
- HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
5)Time Stamp
- 用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。
6)Cell
- 由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据全部是字节码形式存贮。
1.3 HBase基本架构
第2章 HBase快速入门
2.1 HBase安装部署
2.1.1 Zookeeper正常部署
首先保证Zookeeper集群的正常部署,并启动之:
[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.5.7]$ bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.5.7]$ bin/zkServer.sh start
2.1.2 Hadoop正常部署
Hadoop集群的正常部署并启动:
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
2.1.3 HBase的解压
解压Hbase到指定目录:
[atguigu@hadoop102 software]$ tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module
[atguigu@hadoop102 software]$ mv /opt/module/hbase-2.0.5 /opt/module/hbase
配置环境变量
[atguigu@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
添加
export HBASE_HOME=/opt/module/hbase
export PATH=$PATH:$HBASE_HOME/bin
2.1.4 HBase的配置文件
修改HBase对应的配置文件。 1.hbase-env.sh修改内容:
export HBASE_MANAGES_ZK=false
2.hbase-site.xml修改内容:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property>
</configuration>
3.regionservers:
hadoop102
hadoop103
hadoop104
2.1.5 HBase远程发送到其他集群
[atguigu@hadoop102 module]$ xsync hbase/
2.1.6 HBase服务的启动
1.单点启动
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start master
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start regionserver
提示:如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。 修复提示: a、同步时间服务 请参看帮助文档:《尚硅谷大数据技术之Hadoop入门》 b、属性:hbase.master.maxclockskew设置更大的值
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from master</description>
</property>
2.群启
[atguigu@hadoop102 hbase]$ bin/start-hbase.sh
对应的停止服务:
[atguigu@hadoop102 hbase]$ bin/stop-hbase.sh
2.1.7 查看HBase页面
启动成功后,可以通过“host:port”的方式来访问HBase管理页面,例如: http://hadoop102:16010
2.2 HBase Shell操作
看另外文档
第3章 HBase进阶
3.1 RegionServer 架构
3.2 写流程
写流程:
- Client访问Zookeeper获取meta(元数据)表在那个RegionServer.
- 访问对应RegionServer得到meta表,根据meta表访问存储目标数据的Server的RegionServer,并将meta表中region信息在表中位置存储在meta cache中,便于下次访问
- 与存储目标数据的RegionServer进行通信,将数据顺序写入到Wal中
- 将数据写入memstore中,数据在Memstore中进行排序,并向客户端发送ack
- 等待memstor达到一定规则后,向StoreFile(HFile)中刷写
3.3 MemStore Flush
MemStore刷写时机:
- 当某个memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所在region的所有memstore都会刷写。
当memstore的大小达到了 hbase.hregion.memstore.flush.size(默认值128M) *hbase.hregion.memstore.block.multiplier(默认值4) 时,会阻止继续往该memstore写数据。 - 当region server中memstore的总大小达到
java_heapsize(堆内存) *hbase.regionserver.global.memstore.size(默认值0.4) *hbase.regionserver.global.memstore.size.lower.limit(默认值0.95), region会按照其所有memstore的大小顺序(由大到小)依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下。 当region server中memstore的总大小达到 *java_heapsize hbase.regionserver.global.memstore.size(默认值0.4) 时,会阻止继续往所有的memstore写数据。 - 到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)。
- 当WAL文件的数量超过hbase.regionserver.max.logs,region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.max.logs以下(该属性名已经废弃,现无需手动设置,最大值为32)。
3.4 读流程
1)整体流程 2)Merge细节 读流程 1)Client先访问Zookeeper的meta表在那个RegionServer的Server中 2)访问meta表的Server拿到该表,根据请求rowkey查询出目标数据在那个RegionServer的Server中,并将该表的Region信息和meta表的位置信息缓存到meta cache,方便下次询问 3)与目标RegionServer通信发送get请求,先在Block Cache 中查找目标数据,若没有,则在Memstore中查找目标数据,若还无,则在HDFS中查找目标数据.将查到目标数据信息存储在Block Cache中 4)将结果合并后返回客户端
3.5 StoreFile Compaction
- 每次MemStore刷写都会产生一个新的Hfile数据,由于版本的不用,而产生一些过期信息,为了减少HFile的个数,清理过期和删除数据,会进行StoreFile Compaction。
- Compaction分为两种,分别是Minor Compaction和Major Compaction。
- Minor Compaction:将邻近数据合并,并清理部分过期数据和删除的数据
- Major Compaction:将一个Store下的所有数据合并,清理所有过期数据和删除数据
3.6 Region Split
由于刚开始一个Table中只有一个Region,所以会不断向这个Region中写入数据,为了实现负载均衡.因此实现Region Split. Region Split时机: 1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize(10G),该Region就会进行拆分(0.94版本之前)。 2.当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSizeR^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2hbase.hregion.memstore.flush.size(2*128M),R为当前Region Server中属于该Table的Region个数(0.94版本之后)。 具体的切分策略为: 第一次split:1^3 * 256 = 256MB 第二次split:2^3 * 256 = 2048MB 第三次split:3^3 * 256 = 6912MB 第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB 后面每次split的size都是10GB了。 3.Hbase 2.0引入了新的split策略:如果当前RegionServer上该表只有一个Region,按照2 * hbase.hregion.memstore.flush.size(256M)分裂,否则按照hbase.hregion.max.filesize(10G)分裂。 注意:在一个Region为刷写前,物理上并不是将该Region进行分裂,而是在另一Region上引入索引,以后添加数据在该Region 上写,当Store File进行合并时候,再将Region 进行彻底分裂写入.
第4章 HBase API
看文档
第5章 HBase优化
5.1 预分区
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase性能。 1.手动设定预分区
hbase> create 'staff1','info',SPLITS => ['1000','2000','3000','4000']
2.生成16进制序列预分区
create 'staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
3.按照文件中设置的规则预分区 创建splits.txt文件内容如下:
aaaa bbbb cccc dddd
然后执行:
create 'staff3','info',SPLITS_FILE => 'splits.txt'
4.使用JavaAPI创建预分区
byte[][] splitKeys = 某个散列值函数
HBaseAdmin hAdmin = new HBaseAdmin(HbaseConfiguration.create());
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
hAdmin.createTable(tableDesc, splitKeys);
5.2 RowKey设计
一条数据的唯一标识就是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
5.3 内存优化
HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~36G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。
5.4 基础优化
1.Zookeeper会话超时时间 hbase-site.xml
属性:zookeeper.session.timeout 解释:默认值为90000毫秒(90s)。当某个RegionServer挂掉,90s之后Master才能察觉到。可适当减小此值,以加快Master响应,可调整至60000毫秒。
2.设置RPC监听数量 hbase-site.xml
属性:hbase.regionserver.handler.count 解释:默认值为30,用于指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
3.手动控制Major Compaction hbase-site.xml
属性:hbase.hregion.majorcompaction 解释:默认值:604800000秒(7天), Major Compaction的周期,若关闭自动Major Compaction,可将其设为0
4.优化HStore文件大小 hbase-site.xml
属性:hbase.hregion.max.filesize 解释:默认值10737418240(10GB),如果需要运行HBase的MR任务,可以减小此值,因为一个region对应一个map任务,如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果HFile的大小达到这个数值,则这个region会被切分为两个Hfile。
5.优化HBase客户端缓存 hbase-site.xml
属性:hbase.client.write.buffer 解释:默认值2097152bytes(2M)用于指定HBase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的。
6.指定scan.next扫描HBase所获取的行数 hbase-site.xml
属性:hbase.client.scanner.caching 解释:用于指定scan.next方法获取的默认行数,值越大,消耗内存越大
7.BlockCache占用RegionServer堆内存的比例 hbase-site.xml
属性:hfile.block.cache.size 解释:默认0.4,读请求比较多的情况下,可适当调大
8.MemStore占用RegionServer堆内存的比例 hbase-site.xml
属性:hbase.regionserver.global.memstore.size 解释:默认0.4,写请求较多的情况下,可适当调大
第6章 整合Phoenix
6.1 Phoenix简介
6.1.1 Phoenix定义
Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。
6.1.2 Phoenix特点
1)容易集成:如Spark,Hive,Pig,Flume和Map Reduce; 2)操作简单:DML命令以及通过DDL命令创建和操作表和版本化增量更改; 3)支持HBase二级索引创建。
6.1.3 Phoenix架构
6.2 Phoenix快速入门
6.2.1 安装
1.官网地址 http://phoenix.apache.org/ 2.Phoenix部署 1)上传并解压tar包
[atguigu@hadoop102 module]$ tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
[atguigu@hadoop102 module]$ mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix
2)复制server包并拷贝到各个节点的hbase/lib
[atguigu@hadoop102 module]$ cd /opt/module/phoenix/
[atguigu@hadoop102 phoenix]$ cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/
[atguigu@hadoop102 phoenix]$ xsync /opt/module/hbase/lib/phoenix-5.0.0-HBase-2.0-server.jar
4)配置环境变量
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
5)重启HBase
[atguigu@hadoop102 ~]$ stop-hbase.sh
[atguigu@hadoop102 ~]$ start-hbase.sh
- 连接Phoenix
[atguigu@hadoop101 phoenix]$ /opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
6.2.2 Phoenix Shell操作
6.2.3 Phoenix JDBC操作
6.3 Phoenix二级索引
6.3.1 二级索引配置文件
6.3.2 全局二级索引
6.3.3 本地二级索引
第7章 与Hive的集成
7.1 HBase与Hive的对比
1.Hive (1) 数据分析工具 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。 (2) 用于数据分析、清洗 Hive适用于离线的数据分析和清洗,延迟较高。 (3) 基于HDFS、MapReduce Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。 2.HBase (1) 数据库 是一种面向列族存储的非关系型数据库。 (2) 用于存储结构化和非结构化的数据 适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。 (3) 基于HDFS 数据持久化存储的体现形式是HFile,存放于DataNode中,被ResionServer以region的形式进行管理。 (4) 延迟较低,接入在线业务使用 面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
7.2 HBase与Hive集成使用
|