没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
HBase 的介绍
1.Hbase 的特点:
1.面向列:Hbase 是面向列的存储和权限控制,并支持独立索引。列式存储,其数据在表中
是按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量。
2.多版本:Hbase 每一个列的存储有多个 Version。
3.稀疏性:为空的列不占用存储空间,表可以设计得非常稀疏。
4.扩展性:底层依赖 HDFS。
5.高可靠性:WAL 机制保证了数据写入时不会因集群异常而导致写入数据丢失, Replicaon
机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且 Hbase 底层使用
HDFS,HDFS 本身也有备份。
6.高性能:底层的 LSM 数据结构和 Rowkey 有序排列等架构上的独特设计,使得 Hbase 具有
非常高的写入性能。region 切分,主键索引和缓存机制使得 Hbase 在海量数据下具备一定的
随机读取性能,该性能真对 Rowkey 的查询能到达到毫秒级别。
2.HBase 的读写过程
写数据流程
动物园管理员中存储了元表的区域信息,从元表获取相应地区信息,然后找到元表
的数据
根据命名空间,表名和 rowkey 根据元表的数据找到写入数据对应的区域信息
找到对应的 RegionServer 的
把数据分别写到的 Hlog 和那种 MEMSTORE 上一份
的 memstore 达到一个阈值后则把数据刷成一个 StoreFile 文件。若的 memstore 中
的数据有丢失,则可以总的 Hlog 上恢复
当多个 StoreFile 文件达到一定的大小后,会触发紧凑合并操作,合并为一个
StoreFile,这里同时进行版本的合并和数据删除。
当压缩后,逐步形成越来越大的 StoreFIle 后,会触发拆分操作,把当前的 StoreFile
分成两个,这里相当于把一个大的区域分割成两个区域如下图:
19.png
读数据流程
1. 动物园管理员中存储了元表的区域信息,所以先从动物园管理员中找到元表区域的位置,
然后读取元表中的数据.META 中又存储了用户表的区域信息。
2. 根据命名空间,表名和 rowkey 在元表中找到对应的区域信息
3. 找到这个区域对应的 RegionServer 的
4. 查找对应的区域
5. 先从那种 MEMSTORE 找数据,如果没有,再到 StoreFile 上读(为了读取的效率)。
Client-Server 交互逻辑
运维开发了很长一段时间 HBase,经常有业务同学咨询为什么客户端配置文件中没有配置
RegionServer 的地址信息,这里针对这种疑问简单的做下解释,客户端与 HBase 系统的交互阶段主要
有如下几个步骤:
1.客户端首先会根据配置文件中 zookeeper 地址连接 zookeeper,并读取/<hbase-rootdir>/
meta-region-server 节点信息,该节点信息存储 HBase 元数据(hbase:meta)表所在的
RegionServer 地 址 以 及 访 问 端 口 等 信 息 。 用 户 可 以 通 过 zookeeper 命令 (get /<hbase-
rootdir>/meta-region-server)查看该节点信息。
2.根据 hbase:meta 所在 RegionServer 的访问信息,客户端会将该元数据表加载到本地并进
行缓存。然后在表中确定待检索 rowkey 所在的 RegionServer 信息。
3.根据数据所在 RegionServer 的访问信息,客户端会向该 RegionServer 发送真正的数据读
取请求。服务器端接收到该请求之后需要进行复杂的处理,具体的处理流程将会是这个专
题的重点。
通过上述对客户端以及 HBase 系统的交互分析,可以基本明确两点:
1.客户端只需要配置 zookeeper 的访问地址以及根目录,就可以进行正常的读写请求。不
需要配置集群的 RegionServer 地址列表。
2.客户端会将 hbase:meta 元数据表缓存在本地,因此上述步骤中前两步只会在客户端第一
次请求的时候发生,之后所有请求都直接从缓存中加载元数据。如果集群发生某些变化导
致 hbase:meta 元数据更改,客户端再根据本地元数据表请求的时候就会发生异常,此时
客户端需要重新加载一份最新的元数据表到本地。
RegionServer 接收到客户端的 get/scan 请求之后,先后做了两件事情:构建 scanner 体系
(实际上就是做一些 scan 前的准备工作),在此体系基础上一行一行检索。举个不太合
适但易于理解的例子,scan 数据就和开发商盖房一样,也是分成两步:组建施工队体系,
明确每个工人的职责;一层一层盖楼。
数据读写流程
HBase 写数据流程
1,Client 先访问 zookeeper,从 meta 表获取相应 region 信息,然后找到 meta 表的数据
2,根据 namespace、表名和 rowkey 根据 meta 表的数据找到写入数据对应的 region 信息
3,找到对应的 regionserver
4,把数据分别写到 HLog 和 MemStore 上一份
4,MemStore 达到一个阈值后则把数据刷成一个 StoreFile 文件。(若 MemStore 中的数据有丢
失,则可以总 HLog 上恢复)
5,当多个 StoreFile 文件达到一定的大小后,会触发 Compact 合并操作,合并为一个
StoreFile,(这里同时进行版本的合并和数据删除。)
6,当 Store8le 大小超过一定阈值后,会把当前的 Region 分割为两个(Split),并由 Hmaster
分配到相应的 HRegionServer,实现负载均衡
HBase 读数据流程
1,Client 先访问 zookeeper,从 meta 表读取 region 的位置,然后读取 meta 表中的数据。
meta 中又存储了用户表的 region 信息。
2,根据 namespace、表名和 rowkey 在 meta 表中找到对应的 region 信息
3,找到这个 region 对应的 regionserver
4,查找对应的 region
5,先从 MemStore 找数据,如果没有,再到 StoreFile 上读(为了读取的效率)。
Hbase 写数据流程
a) Client 发起了一个 HTable.put(Put)请求给 HRegionServer
b) HRegionServer 会将请求匹配到某个具体的 HRegion 上面
c) 决定是否写 WAL log。WAL log 文件是一个标准的 Hadoop SequenceFile,文
件中存储了 HLogKey,这些 Keys 包含了和实际数据对应的序列号,主要用于
崩溃恢复。
d) Put 数据保存到 MemStore 中,同时检查 MemStore 状态,如果满了,则触
发 Flush to Disk 请求。
e) HRegionServer 处理 Flush to Disk 的请求,将数据写成 HFile 文件并存到
HDFS 上,并且存储最后写入的数据序列号,这样就可以知道哪些数据已经存
入了永久存储的 HDFS 中。
由于不同的列族会共享 region,所以有可能出现,一个列族已经有 1000 万行,
而另外一个才 100 行。当一个要求 region 分割的时候,会导致 100 行的列会
同样分布到多个 region 中。所以,一般建议不要设置多个列族。
Hbase 快速响应数据
hbase 上的数据是以 store8le(HFile)二进制流的形式存储在 HDFS 上 block
剩余10页未读,继续阅读
资源评论
sxluohuan91
- 粉丝: 0
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功