使用冷存储
介绍
冷数据是大数据存储当中常见的场景。阿里云HBase针对冷数据存储的场景,提供一种新的冷存储介质,其存储成本仅为高效云盘的1/3,写入性能与云盘相当,并能保证数据随时可读。冷存储适用于数据归档、访问频率较低的历史数据等各种冷数据场景。冷存储的使用非常简单,用户可以在购买云HBase实例时选择冷存储作为一个附加的存储空间,并通过建表语句指定将冷数据存放在冷存储介质上面,从而降低存储成本。
同时HBase增强版还基于冷存储实现了在同一张表内的冷热分离功能,能够自动将表中将热数据放到读写速度快的热存储中,而把不常访问的数据放到冷存储中降低成本,如果用户有冷热分离的需求,可以移步冷热分离介绍章节
开通冷存储
冷存储可以独立购买,作为一个附加存储空间使用。
创建新的HBase增强版实例时,可在购买页面选择是否选购冷存储和冷存储的容量。如果您在创建实例时没有选择开通冷存储,也没有关系。在集群控制台上,找到冷存Tab,点击开通。注意:只有HBase增强版2.1.8版本以上才支持冷存储,如果低于此版本在开通过程中会自动升级到最新版本
使用冷存储
注意:冷存储功能需要HBase增强版服务端升级到2.1.8版本以上,客户端依赖要求AliHBase-Connector 1.0.7/2.0.7以上,Shell要求alihbase-2.0.7-bin.tar.gz以上
HBase增强版支持在ColumnFamily(列簇)级别设置存储属性。可以将表的某个列簇(或者所有列簇)的Storage设为冷存储。一旦设置为冷存储后,那么这个表中该列簇(或者所有列簇)的数据,都会存储在冷存储中,并不会占用该集群的HDFS空间。设置的方法可以在建表时指定,也可以在建好表后,对列簇的属性进行修改。
建表和修改表属性均可以使用Java API和HBase shell完成,在使用Java API前请 按照HBase Java API 访问文档中的步骤完成Java SDK安装和参数配置。在使用HBase shell前,请按照HBase Shell访问文档中的步骤完成Shell的下载和配置。
建表时指定冷存储
HBase Shell
hbase(main):001:0> create 'coldTable', {NAME => 'f', STORAGE_POLICY => 'COLD'}
Java API
// 参见创建连接: https://help.aliyun.com/document_detail/119570.html
Admin admin = connection.getAdmin();
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("coldTable"));
HColumnDescriptor cf = new HColumnDescriptor("f");
cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
descriptor.addFamily(cf);
admin.createTable(descriptor);
修改表属性指定冷存储
如果表已经建立后,可以通过修改表中列簇的属性来设置冷存储的列簇。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会进入到冷存储
HBase Shell
hbase(main):011:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'COLD'}
Java API
// 参见创建连接: https://help.aliyun.com/document_detail/119570.html
Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("coldTable");
HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
// 设置表的存储类型为冷存储
cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
admin.modifyTable(tableName, descriptor);
将表属性改回热存储
如果表的列存存储类型为冷存储,想改回到热存储,可以通过修改表属性的方式实现。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会回到热存储中
HBase Shell
hbase(main):014:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'DEFAULT'}
Java API
// 参见创建连接: https://help.aliyun.com/document_detail/119570.html
Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("coldTable");
HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
// 设置表的存储类型为默认存储,默认存储为热存储
cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_DEFAULT);
admin.modifyTable(tableName, descriptor);
查看冷存储使用情况
在控制台的冷存储界面,可以查看整体的冷存储使用状况,并可以扩容冷存储。在集群管理系统的表Tab中,可以显示某一张表的冷存储使用大小和热存储使用大小。
性能测试
环境说明
Master: ecs.c5.xlarge, 4core 8G, 20G高效云盘4RegionServer: ecs.c5.xlarge, 4core 8G, 20G高效云盘4测试机器:ecs.c5.xlarge, 4core 8G
写性能
表类型 | avg rt | p99 rt |
---|---|---|
热表 | 1736 us | 4811 us |
冷表 | 1748 us | 5243 us |
说明: 每条记录10列,每列100B,也就是单行1k, 16线程写
随机Get性能
表类型 | avg rt | p99 rt |
---|---|---|
热表 | 1704 us | 5923 us |
冷表 | 14738 us | 31519 us |
说明: 关闭表的BlockCache,完全读盘。每条记录10列,每列100B,也就是单行1k。8线程读,每次读出1k。
范围Scan性能
表类型 | avg rt | p99 rt |
---|---|---|
热表 | 6222 us | 20975 us |
冷表 | 51134 us | 115967 us |
说明: 关闭表的BlockCache,每条记录10列,每列100B,也就是单行1k。8线程读,每次读出1k。Scan的Caching设为30
注意事项
1.冷存储的读IOPS能力很低(每个节点上限为25),所以冷存储只适合低频查询场景。
2.写入吞吐上,冷存储和基于高效云盘的热存储相当,可以放心写入数据。
3.冷存储不适合并发大量读请求,如果有这种行为可能会导致请求异常。
4.购买冷存储空间特别大的客户可以酌情调整 读IOPS 能力,详情工单。
5.建议平均每个core节点管理冷数据不要超过30T。如果需要单个core节点管理更大数据量的冷数据,可以工单咨询优化建议。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论