全部产品
云市场

使用冷存储

更新时间:2019-09-12 12:51:06

介绍

冷数据是大数据存储当中常见的场景。阿里云HBase针对冷数据存储的场景,提供一种新的冷存储介质,其存储成本仅为高效云盘的1/3,写入性能与云盘相当,并能保证数据随时可读。冷存储适用于数据归档、访问频率较低的历史数据等各种冷数据场景。冷存储的使用非常简单,用户可以在购买云HBase实例时选择冷存储作为一个附加的存储空间,并通过建表语句指定将冷数据存放在冷存储介质上面,从而降低存储成本。

同时HBase增强版还基于冷存储实现了在同一张表内的冷热分离功能,能够自动将表中将热数据放到读写速度快的热存储中,而把不常访问的数据放到冷存储中降低成本,如果用户有冷热分离的需求,可以移步冷热分离介绍章节oss1

开通冷存储

冷存储可以独立购买,作为一个附加存储空间使用。

创建新的HBase增强版实例时,可在购买页面选择是否选购冷存储和冷存储的容量。oss2如果您在创建实例时没有选择开通冷存储,也没有关系。在集群控制台上,找到冷存Tab,点击开通。oss3注意:只有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

  1. hbase(main):001:0> create 'coldTable', {NAME => 'f', STORAGE_POLICY => 'COLD'}

Java API

  1. // 参见创建连接: https://help.aliyun.com/document_detail/119570.html
  2. Admin admin = connection.getAdmin();
  3. HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("coldTable"));
  4. HColumnDescriptor cf = new HColumnDescriptor("f");
  5. cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
  6. descriptor.addFamily(cf);
  7. admin.createTable(descriptor);

修改表属性指定冷存储

如果表已经建立后,可以通过修改表中列簇的属性来设置冷存储的列簇。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会进入到冷存储

HBase Shell

  1. hbase(main):011:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'COLD'}

Java API

  1. // 参见创建连接: https://help.aliyun.com/document_detail/119570.html
  2. Admin admin = connection.getAdmin();
  3. TableName tableName = TableName.valueOf("coldTable");
  4. HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
  5. HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
  6. // 设置表的存储类型为冷存储
  7. cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_COLD);
  8. admin.modifyTable(tableName, descriptor);

将表属性改回热存储

如果表的列存存储类型为冷存储,想改回到热存储,可以通过修改表属性的方式实现。如果这个列簇中已经有数据,那么只有在major compaction之后,数据才会回到热存储中

HBase Shell

  1. hbase(main):014:0> alter 'coldTable', {NAME=>'f', STORAGE_POLICY => 'DEFAULT'}

Java API

  1. // 参见创建连接: https://help.aliyun.com/document_detail/119570.html
  2. Admin admin = connection.getAdmin();
  3. TableName tableName = TableName.valueOf("coldTable");
  4. HTableDescriptor descriptor = admin.getTableDescriptor(tableName);
  5. HColumnDescriptor cf = descriptor.getFamily("f".getBytes());
  6. // 设置表的存储类型为默认存储,默认存储为热存储
  7. cf.setValue("STORAGE_POLICY", AliHBaseConstants.STORAGETYPE_DEFAULT);
  8. admin.modifyTable(tableName, descriptor);

查看冷存储使用情况

在控制台的冷存储界面,可以查看整体的冷存储使用状况,并可以扩容冷存储。oss4集群管理系统的表Tab中,可以显示某一张表的冷存储使用大小和热存储使用大小。oss5

性能测试

环境说明

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节点管理更大数据量的冷数据,可以工单咨询优化建议。