HBase理论知识框架
2022-09-06 14:43:33 1 举报
AI智能生成
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刷写
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表
HBase已有表,Hive关联
HBase优化
高可用
conf目录下创建backup-masters文件
分发到其他集群机器上
预分区
手动设定预分区
生成16进制序列预分区
按照文件中设置的规划预分区
使用JavaAPI创建预分区
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方法获取的默认行数,值越大,消耗内存越大。
0 条评论
下一页