华为云 HBase 冷热分离最佳实践
本文分享自华为云社区 《华为云HBase 冷热分离最佳实践》,作者:pippo。
HBase 介绍
HBase 是 Hadoop Database 的简称,是建立在 Hadoop 文件系统之上的分布式面向列的数据库,它具有高可靠、高性能、面向列和可伸缩的特性,提供快速随机访问海量数据能力。
HBase 采用 Master/Slave 架构,由 HMaster 节点、RegionServer 节点、ZooKeeper 集群组成,底层数据存储在 HDFS 上。
整体架构如图所示:
HMaster 主要负责:
在 HA 模式下,包含主用 Master 和备用 Master。
主用 Master:负责 HBase 中 RegionServer 的管理,包括表的增删改查;RegionServer 的负载均衡,Region 分布调整;Region 分裂以及分裂后的 Region 分配;RegionServer 失效后的 Region 迁移等。
备用 Master:当主用 Master 故障时,备用 Master 将取代主用 Master 对外提供服务。故障恢复后,原主用 Master 降为备用。
RegionServer 主要负责:
存放和管理本地 HRegion。
RegionServer 负责提供表数据读写等服务,是 HBase 的数据处理和计算单元,直接与 Client 交互。
RegionServer 一般与 HDFS 集群的 DataNode 部署在一起,实现数据的存储功能。读写 HDFS,管理 Table 中的数据。
ZooKeeper 集群主要负责:
存放整个 HBase 集群的元数据以及集群的状态信息。
实现 HMaster 主从节点的 Failover。
HDFS 集群主要负责:
HDFS 为 HBase 提供高可靠的文件存储服务,HBase 的数据全部存储在 HDFS 中。
结构说明:
Store
一个 Region 由一个或多个 Store 组成,每个 Store 对应图中的一个 Column Family。
MemStore
一个 Store 包含一个 MemStore,MemStore 缓存客户端向 Region 插入的数据,当 RegionServer 中的 MemStore 大小达到配置的容量上限时,RegionServer 会将 MemStore 中的数据“flush”到 HDFS 中。
StoreFile
MemStore 的数据 flush 到 HDFS 后成为 StoreFile,随着数据的插入,一个 Store 会产生多个 StoreFile,当 StoreFile 的个数达到配置的阈值时,RegionServer 会将多个 StoreFile 合并为一个大的 StoreFile。
HFile
HFile 定义了 StoreFile 在文件系统中的存储格式,它是当前 HBase 系统中 StoreFile 的具体实现。
HLog(WAL)
HLog 日志保证了当 RegionServer 故障的情况下用户写入的数据不丢失,RegionServer 的多个 Region 共享一个相同的 HLog。
HBase 提供两种 API 来写入数据。
Put:数据直接发送给 RegionServer。
BulkLoad:直接将 HFile 加载到表存储路径。
HBase 冷热分离诉求
HBase 是 Hadoop Database 的简称,是建立在 Hadoop 文件系统之上的分布式面向列的数据库,它具有高可靠、高性能、面向列和可伸缩的特性,提供快速随机访问海量数据能力。
在海量大数据场景下,表中的部分业务数据随着时间的推移仅作为归档数据或者访问频率很低,同时这部分历史数据体量非常大,比如订单数据或者监控数据,如果降低这部分数据的存储成本将会极大的节省企业的成本。
冷热分离功能支持将冷热数据存储在不同的介质上,冷数据的存储类型为普通 IO 存储,热数据的存储类型为超高 IO 存储。普通 IO 存储的价格仅为超高 IO 存储的 30%,大大降低了存储成本。
HBase 冷热分离介绍
HBase 支持对同一张表的数据进行冷热分离存储。用户在表上配置数据冷热时间分界点后,HBase 会依赖用户写入数据的时间戳(毫秒)和时间分界点来判断数据的冷热。数据开始存储在热存储上,随着时间的推移慢慢往冷存储上迁移。同时用户可以任意变更数据的冷热分界点,数据可以从热存储到冷存储,也可以从冷存储到热存储。
整体架构如图所示:
命令介绍
设置表的冷热分界线
创建冷热分离表:
hbase(main):002:0> create 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>'86400'}
参数说明:
NAME:需要冷热分离的列族。
COLD_BOUNDARY:冷热分离时间点,单位为秒(s)。例如 COLD_BOUNDARY 为 86400,代表 86400 秒(一天)前写入的数据会被自动归档到冷存储。
取消冷热分离。
hbase(main):004:0> alter 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>""}
为已经存在的表设置冷热分离,或者修改冷热分离分界线,单位为秒。
hbase(main):005:0> alter 'hot_cold_table', {NAME=>'f', COLD_BOUNDARY=>'86400'}
查询冷热分离是否设置或者修改成功
hbase(main):005:0> desc 'hot_cold_table'
数据写入
冷热分离的表与普通表的数据写入方式完全一致,数据会先存储在热存储(超高 IO)中。随着时间的推移,如果一行数据满足当前时间-时间列值>COLD_BOUNDARY 设置的值条件,则会在执行 Compaction 时被归档到冷存储(普通 IO)中。
插入记录
执行“put”命令往指定表插入一条记录,需要指定表的名称,主键,自定义列,以及插入的具体值。
hbase(main):004:0> put 'hot_cold_table','row1','cf:a','value1'
参数说明:
hot_cold_table:表的名称。
row1:主键。
cf:a:自定义的列。
value1:插入的值。
数据查询
由于冷热数据都在同一张表中,因此用户所有的查询操作都只需在一张表内进行。在查询时,建议通过配置 TimeRange 来指定查询的时间范围,系统将会根据指定的时间范围决定查询模式,即仅查询热存储、仅查询冷存储或同时查询冷存储和热存储。如果查询时未限定时间范围,则会导致查询冷数据。在这种情况下,查询吞吐量会受到冷存储的限制。
随机查询
不指定 HOT_ONLY 参数来查询数据。在这种情况下,将会查询冷存储中的数据。
hbase(main):001:0> get 'hot_cold_table', 'row1'
通过指定 HOT_ONLY 参数来查询数据。在这种情况下,只会查询热存储中的数据。
hbase(main):002:0> get 'hot_cold_table', 'row1', {HOT_ONLY=>true}
通过指定 TimeRange 参数来查询数据。在这种情况下,CloudTable 将会比较 TimeRange 和冷热边界值,以确定是只查询热存储还是冷存储中的数据,还是同时查询热冷存储中的数据
hbase(main):003:0> get 'hot_cold_table', 'row1', {TIMERANGE => [0, 1568203111265]}
范围查询
不指定 HOT_ONLY 参数来查询数据。在这种情况下,将会查询冷存储中的数据。
hbase(main):001:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9'}
通过指定 HOT_ONLY 参数来查询数据。在这种情况下,只会查询热存储中的数据。
hbase(main):002:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9', HOT_ONLY=>true}
通过指定 TimeRange 参数来查询数据。在这种情况下,CloudTable 将会比较 TimeRange 和冷热边界值,以确定是只查询热存储还是冷存储中的数据,还是同时查询热冷存储中的数据。
hbase(main):003:0> scan 'hot_cold_table', {STARTROW =>'row1', STOPROW=>'row9', TIMERANGE => [0, 1568203111265]}
数据合并
合并表所有分区的热数据区。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'HOT'
合并表所有分区的冷数据区。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'COLD'
合并表所有分区的热冷数据区。
hbase(main):002:0> major_compact 'hot_cold_table', nil, 'NORMAL', 'ALL'
HBase 冷热分离效果
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/20c5bb7effc12eb2000bdc71c】。文章转载请联系作者。
评论