Hbase相关学习及提升

Hbase相关学习

绪论

基础
底层原理
企业开发
TSDB 时间戳模式,rowkey设计
基础表格模式
依赖框架
整合框架
设计理念:
数十亿行 数百万列
稀疏的 分布式的持久的 多维排序Map
Map 由 行键 列键和时间索引 :映射中的每个值 都是未解释的字节数组。
总结 :最终理解为 稀疏 ---- 分布式---- 多维---- 排序的映射。

逻辑结构

数据存储整体 有序 按照Rowkey的字典序排列。rowKey为Byte 数组。
表格按照行拆分,块名称为Region 用于实现分布式结构。以列族为单位 纵向切分。

物理结构

Key 是:rowKey + column Family + Column Qualifier + TimeStamp + Type + Value

底层存储在HDFS上。 在不修改数据基础上实现功能 ,以时间戳版本来实现。
删除数据 其 操作类型为Delete

数据模型

1)NameSpace
与DB类型。有两个默认的NameSpace default 和hbase 内置表。
2)Table。表
定义时只需要声明列族即可。列族可以动态追加列。
3)Row
每行数据 都由 一个RowKey和多个列组成。数据是按照RowKey字典序 存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey设计十分重要。
4)Column
Column Famliy 和Column Quailifer 每个列 都由列族和列限定符进行限定。
info:name info:age 无需提前定义。
5)TimeStamp
标记不同版本的数据
6)Cell
由 RowKey CF CQ TS 唯一确定的单元 Cell 中的数据都是字节码形式存储。

基础架构

hbase.meta 数据存储在HDFS 由Master 管理
Master 负责通过ZK监控RegionServer 进程状态 同时是所有元数据变化的接口。内部启动监控执行Region的故障转移和拆分的线程。

RegionServer 主要的进程 实现类为HregionServer 部署于DN
主要负责数据Cell的处理同时在执行区域拆分合并时 由RegionServer 来实际执行。

安装

HDFS + ZK 需要修改hbase-env.sh. hbase-site.xml. regionServers.
解决Hbase +Hadoop log4j兼容性问题。

页面 16010 访问
页面信息:RegionServer— BackUpMaster— Table

高可用

conf 下创建backup-master 文件 加入backup机器。

Hbase Shell操作

ddl。 dml。 namespace
list 看不到系统表:hbase:meta. hbase:namespace
describe 查看详细信息。
drop 先disable 再drop
写入数据 put 可以手动写入时间戳 推荐不写默认 当前系统的时间。
如果重复写入相同的rowKey 相同列的数据会进行多个版本的覆盖。

读取数据
get 哪一行 哪几列数据。 最多一行数据
scan 扫描。START_ROW STOP_ROW 左闭右开。
删除与版本介绍
delete
deleteall 删除所有的版本。
!!!! 实际开发中不会用到Shell命令

Hbase API操作。

Hbase 客户端连接由 ConnectionFactory 类来创建 用户使用完成之后需要手动关闭连接。同时连接是一个重量级的推荐一个进程使用一个连接。 对Hbase 命令通过Admin 和Table来实现。

单线程使用连接—
不推荐 使用异步的链接。
多线程使用连接—
官网推荐 静态代码块中 初始化。

获取Admin
Table–DML 语言。
Admin DDl 语言。
admin 的链接是轻量级的 不是线程安全的 不推荐池化或者缓冲连接。
用到了获取 用不到关闭

创建命名空间:
代码相对于Shell 更加底层,所以Shell可以实现的功能,代码一定能实现。
建造者模式 创建NameSpaceDescriptor。

多异常处理
创建命名空间 出现的问题都属于本方法自身的问题 不应该抛出。
链接问题 调用方法时 解决。
判断 表格是否存在:

创建表格
表格创建问题解决
可变参数:至少有一个列族。
利用TableExist 函数 先判断一下·。

修改表格: 修改列族。使用admin 对象
错误实例:
想要 修改表 需要获取 旧的 表格描述器。
删除表
先disable 再drop

写入数据API DML
如果对表进行修改 用ADMIN
数据进行修改 用Table Put对象 添加属性值。
读取数据
Get 对象 进行操作 对一行数据进行操作。
扫描数据
创建Scan 对象。ResultScanner 记录多行数据。

单列过滤扫描
setFilter ~。 只保留 单列的数据
setSingleColumnValue 保留整行数据。
结果会保留没有当前列的数据。

删除数据 删除某一列
编写Delete 对象。
需要 提供一个二次开发的Jar 包给业务方使用。

底层原理 进阶

Master 架构
HMaster –
负载均衡器。 通过读取Meta表 了解 Region的分配,通过连接ZK 了解RegionServer 的启动情况,5分钟调控一次分配平衡。
元数据表管理器。 管理元数据表。
预写日志管理器 MasterProcWAL /hbase/MasterData/WALs
32M 或1H滚动操作。 操作执行到meta表后删除WAL。
补充:
meta表
rowKey。table region start key region id
对客户端的元数据进行操作时,才会连接Master 数据进行连接ZK 进行读入,
Hbase 2.3+。新模式。Master Registry 客户端可以 访问Master 获取Master 表信息。

源码与进程

Region Server 架构:
读缓存 Block Cache
写缓存:Memory Store
线程监控 必要的服务: Region 拆分,合并。MemStore 刷写 WAL 预写日志滚动

写流程。
客户端创建连接—>>> 刷写落盘到HDFS上。
MemStore Flush 刷写流程。
低水位线。0.4
高水位线。 0.95
刷写时机:
周期性刷写 默认5min 一次。

读流程:
HFile结构
包括数据本身 元数据记录 文件信息 数据索引 元数据索引和一个固定长度的尾部信息,记录文件的修改情况
还有一个布隆过滤器 文件中的Key

读数据:
合并读取数据优化:
读取三个位置进行合并。
版本合并效率非常低,需要优化。
1)HFile 带有索引文件,读取对应的RowKey数据会比较快
2) Block Cache 会缓存之前读取的内容和元信息,如果HFile没有发生变化,则不需要再次读取
3) 使用布隆过滤器,能够快速过滤当前HFile 不存在需要读取的Key 从而 避免读取文件。

文件合并:
minor Compaction
major Compaction
小合并的文件机制:
5个参数:
Region Split: 自定义分区
预分区:
指定分区端点。
指定采取16进制进行拆分。15个分区。
文件中 设置规则预分区。
JavaAPI 设置预分区
系统分区:
Region 拆分
ZK 汇报Master 修改对应Meta表的信息添加列。
~0.94 ~2.0 ~ 最新。简单设计。

Hbase 优化

RowKey设计
TSDB: timestamp DataBase
设计原则
1)生成随机数,hash散列
2)时间戳反转 9999-99-99 减去当前。
3)字符串拼接

实际案例设计:
单个人 一段时间消费金额
所有人 总金额。
1)填充字段保证所有数据有相同的长度
scan StartRow => ^A ^Azhangsan2021-12
结尾需要写和设计rowKey对应位置的最大值的字符。
stopRow=> ^A ^A zhangsan2021-12.
rowKey 设计格式 ^A ^A zhangsan2021-12.
2)
一种设计格式只能完美的满足一个 需求。
scan startRow 2021-12
stopRow 2021-12.
最终满足两个需求的设计
可以穷举的写在前面即可,
rowKey设计格式,date(yyyy-MM)^A ^A userdate(-dd hh:mm:ss ms)
rowKey 设计:
添加预分区:

分区优化:
hash(user+date(MM))/120
分区号 填充 1–>> 001
提前将月份和分区对应。
hash(user+date(MM))/10
使用调优:
1)Zookeeper会话超时时间 默认90s
2)RPC 监听的数量 30 . PUT。GET 。
3) 手动控制Major Compaction。 大合并
如果关闭 手动合并。
4)优化Hstore 文件大小。 10G
5)优化客户端缓存 网络通信缓存。
6)指定Scan扫描Hbase 获取最大行数
7)BlockCache占用堆内存的比例 0.4
8) MemStore 占用的堆内存比例 0.4
7,8 不超过0.8
JVM 调优:
内存设置
垃圾回收设置
写缓存数据是不能垃圾回收的。 主要回收的是写缓存,
使用CMS + 新生代尽量小,同时尽早开启GC
scanner 扫描结果占用内存的大小:默认2M。hbase.client.max.result.size 2M. eden 空间的1/8

使用调优---- 权威法则:
1> Region 大小10-50G
2> cell 大小不超过10M 性能对应小于100k 有优化。 如果使用mob 则不超过50M Medium sized Objects
3> 1张表 1~3 个列族 最好一个尽量保证不会同时读取多个列族。 一个表 太多列族 没有办法并发。
4> 1~2 个列族的表格 50~100Region
5> 列族名称尽可能短,不要去模仿RDBMS 准确名称和描述。 KV 存储 都会写一遍列族和列名。占用存储 非关系型数据库同理。
6> rowKey 设计时间在最前面,大量的旧数据存储在不活跃的region 中仅会操作少数活动Region 建议增加更多的Region
7> 如果 只有一个列族写入数据,分配内存资源 可以做出调整,即写缓存不会占用太多内存。

整合Phoenix

Phoenix 基础命令:
!tables 查看系统表
表名和列名 都 大写 加“” 变小写。
列名编码处理—>>>.
upsert 插入。
视图映射和表映射:
视图映射是只读的。
表映射: 可以修改删除。 不能用列名编码。
数字类型说明:
无符号类型: 如果是负数 自定义函数。
标准JDBC 连接:
实际开发:内嵌Phonix 连接。
URL 配置对象 user passwd 获取链接 编译SQL
不可以写分号。
二级索引:
修改Hbase 参数:hbase.regionserver.wal.codec . …
二级索引:
全局索引。 新建一张表。 适合于多读 少些的场景。
想查询的字段 不是索引字段。索引表不会被使用。 不会带来查询速度的优化(如果有非索引字段)。
包含索引:
每次创建索引 删除之前的索引。
创建携带其他字段的全局索引 create index my_index on my_table(v1) INCLUDE(v2)
使用索引时 会哪个快 用哪个。会增加写的表的个数,
本地索引:
索引放在同一个表中,同一个Region
本地索引更 稀疏一点 写入更方便 更均衡 适用于 写多的场景。
集成Hive
大量 数据在Hive 上 如果不在的话 用Phoenix 。
已经按照杂乱无章的顺序存储—>>> 用Hive 。
column mapping。
load data 只是上传 文件。 insert into 可以进行文件的对应。
hive 外部表 映射。
2022-08-25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值