导图社区 HBase优化知识点自学笔记
1、HBase简介 点我返回目录 HBase –是Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库 HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop Map...
编辑于2022-11-07 10:23:04 广东HBase优化知识点自学笔记
HBase简介
HBase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库
HBase数据模型
概述
从HBase的底层物理存储结构(K-V)来看,HBase像是一个multi-dimensional map
HBase的逻辑结构
架构说明
列族(Column Family)
列
行键(Row Key)
Region
Store
图示
HBase的物理存储结构
架构说明
Store
StoreFile
Row Key
Column Family
Column Qualifier
TimeStamp
Type
Value
图示
数据模型
Name Space
命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表
hbase
default
Table
类似于关系型数据库的表概念,不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列
Row
每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序(String)存储的
Column
HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定
Time Stamp
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。
Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元
cell中的数据是没有类型的,全部是字节码形式存贮。
HBase基本架构
架构说明
Region Server
Region Server为 Region的管理者,其实现类为HRegionServer
对于数据的操作:get, put, delete;
对于Region的操作:splitRegion、compactRegion
Master
Master是所有Region Server的管理者,其实现类为HMaster
对于表的操作:create, delete, alter
对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移
Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作
HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持
图示
HBase进阶
RegionServer
StoreFile
保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上
每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的
MemStore
数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile
WAL
数据会先写在一个叫做Write-Ahead logfile的文件中,防止数据丢失,然后再写入MemStore中(预写式)
BlockCache
读缓存,每次查询出的数据会缓存在BlockCache中
图示
HBase写流程
Client先访问zookeeper,获取hbase:meta表位于哪个Region Server
访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
与目标Region Server进行通讯
将数据顺序写入(追加)到WAL
将数据写入对应的MemStore,数据会在MemStore进行排序
向客户端发送ack
等达到MemStore的刷写时机后,将数据刷写到HFile
图示
MemStore Flush
刷写的定义
MemStore到刷写时机,将数据写到StoreFile(HFile)
刷写的条件
memstore单个大小
刷写条件
有一个memstore的大小达到128M,则所在region所有memstore刷写
尽可能减少列族,以防止小文件(最好1个,最多3个)
hbase.hregion.memstore.flush.size(默认值128M)
无法写入(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的大小顺序(由大到小)依次进行刷写
无法写入(Memstore总上限)
java_heapsize*hbase.regionserver.global.memstore.size(默认值0.4)
自动刷写时间
hbase.regionserver.optionalcacheflushinterval(默认1小时)
WAL文件数量
hbase.regionserver.max.logs(最大值32)
region会按照时间顺序依次进行刷写
图示
HBase读流程
Client先访问zookeeper,获取hbase:meta表位于哪个Region Server
访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
与目标Region Server进行通讯
分别在MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)
将查询到的新的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache
将合并后的最终结果返回给客户端
图示
整体流程
Merge细节
StoreFile Compaction
定义
为了减少HFile的个数,以及清理掉过期和删除的数据,会进行StoreFile Compaction
分类
Minor Compaction
会将(时间)临近的若干个较小的HFile合并成一个较大的HFile,并清理掉部分过期和删除的数据
Major Compaction
将一个Store下的所有的HFile合并成一个大HFile,并且会清理掉所有过期和删除的数据
图示
Region Split
定义
默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server
时机
0.94版本之前
当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分
0.94版本之后
当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.max.filesize,R为当前Region Server中属于该Table的Region个数(0.94版本之后)
图示
HBase与Hive集成
HBase与Hive的对比
Hive
数据仓库
存储
管理
计算分析
数据分析、清洗
基于HDFS,MapReduce
HBase
数据库
用于存储结构化和非结构化数据
基于HDFS
延迟较低,接入在线业务
HBase与Hive的集成使用
Apache版本下需要重新编译源码hive-hbase-handler-1.2.2.jar
建立Hive表,关联HBase表
CREATE TABLE hive_hbase_emp_table( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table"); hive> load data local inpath '/home/admin/softwares/data/emp.txt' into table emp; hive> insert into table hive_hbase_emp_table select * from emp;
HBase已有表,Hive关联
CREATE EXTERNAL TABLE relevance_hbase_emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
HBase优化
高可用
conf目录下创建backup-masters文件
echo hadoop131 > conf/backup-masters
分发到其他集群机器上
scp -r conf/ hadoop145:/opt/module/hbase/
预分区
分区仅仅是分区,如何将数据均匀的进入分区中,还需要进行rowKey设计
手动设定预分区
create 'staff1','info','partition1',SPLITS => ['1000','2000','3000','4000']
生成16进制序列预分区
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
按照文件中设置的规划预分区
create 'staff3','partition3',SPLITS_FILE => 'splits.txt' splits.txt aaaa bbbb cccc dddd
使用JavaAPI创建预分区
//自定义算法,产生一系列Hash散列值存储在二维数组中 byte[][] splitKeys = 某个散列值函数 //创建HBaseAdmin实例 HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create()); //创建HTableDescriptor实例 HTableDescriptor tableDesc = new HTableDescriptor(tableName); //通过HTableDescriptor实例和散列值二维数组创建带有预分区的HBase表 hAdmin.createTable(tableDesc, splitKeys);
RowKey设计
设计RowKey的目的
一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内
让数据均匀的分布于所有的region中,在一定程度上防止数据倾斜
设计RowKey的方法
生成随机数,hash,散列值
字符串反转
字符串拼接
内存优化
一般会分配整个可用内存的70%给HBase的Java堆
太大容易GC太久导致RegionServer长期不可用
基础优化
允许在HDFS的文件中追加内容
hdfs-site.xml/hbase-site.xml
属性:dfs.support.append
解释:开启HDFS追加同步,可以优秀的配合HBase的数据同步和持久化。默认值为true。
优化DataNode允许的最大文件打开数
hdfs-site.xml
属性:dfs.datanode.max.transfer.threads
解释:HBase一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为4096或者更高。默认值:4096
优化延迟高的数据操作的等待时间
hdfs-site.xml
属性:dfs.image.transfer.timeout
解释:如果对于某一次数据操作来讲,延迟非常高,socket需要等待更长的时间,建议把该值设置为更大的值(默认60000毫秒),以确保socket不会被timeout掉。
优化数据的写入效率
mapred-site.xml
属性:
mapreduce.map.output.compress
mapreduce.map.output.compress.codec
解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec或者其他压缩方式。
设置RPC监听数量
hbase-site.xml
属性:hbase.regionserver.handler.count
解释:默认值为30,用于指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
优化HStore文件大小
hbase-site.xml
属性:hbase.hregion.max.filesize
解释:默认值10737418240(10GB),如果需要运行HBase的MR任务,可以减小此值,因为一个region对应一个map任务,如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果HFile的大小达到这个数值,则这个region会被切分为两个Hfile。
优化HBase客户端缓存
hbase-site.xml
属性:hbase.client.write.buffer
解释:用于指定HBase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的。
指定scan.next扫描HBase所获取的行数
hbase-site.xml
属性:hbase.client.scanner.caching
解释:用于指定scan.next方法获取的默认行数,值越大,消耗内存越大。