Hbase 详解
1、什么是 HBase?
HBase 是一个分布式,可扩展,面向列的适合存储海量数据的 NoSQL 数据库,其最主要的功能是解决海量数据下的实时随机读写的问题。 HBase 依赖 HDFS 做为底层分布式文件系统。
1、特性
强读写一致,但是不是最终一致性的数据存储,这使得它非常适合高速的计算聚合
自动分片,通过 Region 分散在集群中,当行数增长的时候,Region 也会自动的切分和再分配
自动的故障转移
Hadoop/HDFS 集成,和 HDFS 开箱即用
丰富、简洁、高效的 API
块缓存,布隆过滤器,可以高效的列查询优化
操作管理,Hbase 提供了内置的 web 界面来操作
2、什么时候用 Hbase?
Hbase 不适合解决所有的问题:
首先数据库量要足够多,如果有十亿及百亿行数据,那么 Hbase 是一个很好的选择,如果只有几百万行甚至不到的数据量,RDBMS 是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态。
其次,如果不需要辅助索引,静态类型的列,事务等特性,一个已经用 RDBMS 的系统想要切换到 Hbase,则需要重新设计系统。
最后,保证硬件资源足够,每个 HDFS 集群在少于 5 个节点的时候,都不能表现的很好。因为 HDFS 默认的复制数量是 3,再加上一个 NameNode。
3、HBase 架构
zookeeper:开源分布式协调服务框架,主要解决分布式系统中的一致性和数据管理问题。本质上是分布式文件系统,做 HMaster 选举,关键信息如 meta-region 地址,Replication 进度,Regionserver 地址与端口等存储。
HMaster: 是一个轻量级进程,负责所有 DDL 操作,负载均衡, region 信息管理,并在宕机恢复中起主导作用。
HRegionServer: 管理 HRegion,与客户端点对点通信,负责实时数据的读写(DML 操作)。RegionServer 要实时的向 HMaster 报告信息。HMaster 知道全局的 RegionServer 运行情况,可以控制 RegionServer 的故障转移和 Region 的切分。
HRegion:Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 Region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 Region。
Store:一个 Store 对应 HBase 表中的一个列族(Column Family)。
MemStore:内存存储,位于内存中,用来保存当前的数据操作。
HFile:在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile 的形式存储在 HDFS 的。
HDFS:Hbase 运行的底层文件系统。
Write-Ahead logs:HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2、HBase 工作流程
1、数据写流程
1、client--->zk 请求 meta 表所在的 RegionServer 机器地址
2、client<---zk 返回存放 meta 表的 RegionServer 机器地址
3、client--->RegionServer 请求 meta 数据信息
4、RgionServer--->client 返回 meta,获取存放用户数据的 RegionServer 机器
5、将 meta 进行缓存,下一次查询先查询缓存
6、发送 put 请求到对应的 RegionServer(反馈 client 写入成功)
7、对表加锁、更新时间戳、构建 WAL,将操作追加到 WAL 中
8、将数据写到 MemStore 中,释放锁
9、将数据同步到 StoreFile 中(如果同步失败,清理 Memstore 中的数据)
meta 表中存放用户表的信息
客户端访问 zk 中的 meta-region-server,返回对应机器
查询到对应机器
老版本的 HBase 可能存在-root-表,存放 meta 表的对应机器,作用:防止 meta 发生切分到不同的 RegionServer。(版本 0.9)
2、HBase 的 Flush
内存在一定条件下 flush:时间、大小(将写入 MemStore 中的数据刷写入 HFile 中)
相关配置
当 RegionServer 中所有的 MemStore 中的大小超过内存的 40%时 flush(阻塞状态,client 不可写入内存)
当 RegionServer 中所有的 Memstore 中的大小超过内存的 40%*95%时开始 flush(client 可以写入内存),刷写时会对 memstore 进行排序
内存中的文件自动刷新之前能够存活的最长时间,默认 1h(最后一次编辑时间,全部 flush)
单个 Region 中的 Memstore 中的缓存大小达到 128M(默认),当前 Region 就会 flush
当 WAL 文件的数量超过hbase.regionserver.max.log
时,Region 会按照时间顺序一次进行刷写,直到 WAL 低于hbase.regionserver.max.log
以下,默认最大值为 32(不暴露在用户配置文件中了)
3、HBase 的 Compact
以牺牲磁盘 io 来换取读性能的稳定
小合并(minor):一个 Region 下一个 Store 中的部分 HFile 合并成一个比较大的 StoreFile。
大合并(major):一个 Region 下一个 Store 中的所有 HFile 合并成一个更大的 HFile。会清理 ttl 过期,版本超限定,标记删除的数据。
Compact 流程
1、触发条件(1、每次 memstore 在 flush 之后都会判断是否触发 Compaction。2、后台线程周期性检查。3、手动触发)
2、分别读出待合并 Hfile 文件的数据(K,V),进行归并排序,之后写到./tmp 临时文件中。
3、将临时文件移动到对应的 Store 的数据目录。
4、将 Compaction 的输入文件路径和输出路径封装成 KV 写入到 HLog 日志,并打上 Compaction 标记,最后强制执行 sync。
5、将对应的 Store 数据目录下的 Compaction 输入文件全部删除。
相关配置
在 Region 下的所有 hfile 会进行合并,默认为 7 天,majorcompaction 非常消耗资源,建议关闭(设置为 0)
合并是 rewrite(重写),由于时间不确定,万一在负载较高的情况下,容易出现问题,选择合适时间进行手动合并。
合并数量限制,3 >= hfile(默认 3 个)触发合并
4、HBase 的 split
根据 rowkey 进行切分,从 rowkey 中间进行切分。自动切分容易产生数据倾斜(所以建表的时候需要进行预分区)。官方建议使用 1--3 个列族(防止出现小文件)(使用多个列族需要数据量同步增长的情况下使用)。
Hfile 最大 10G(默认)
5、数据读流程
1、client--->zk 请求 meta 表所在的 RegionServer 机器地址
2、client<---zk 返回存放 meta 表的 RegionServer 机器地址
3、client--->RegionServer 请求 meta 数据信息
4、RgionServer--->client 返回 meta,获取存放用户数据的 RegionServer 机器
5、将 meta 进行缓存,下一次查询先查询缓存
6、访问存储用户的 RegionServer 中的 Memstore 和 StoreFile 中的数据,进行对比返回最大时间戳的数据
3、Hbase 基础命令
版权声明: 本文为 InfoQ 作者【Fong】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3e345a6dcb2a626cb8a40648】。文章转载请联系作者。
评论