亚马逊AWS官方博客

使用 HBase on Amazon S3 设置只读副本集群

Original URL: https://aws.amazon.com/cn/blogs/big-data/setting-up-read-replica-clusters-with-hbase-on-amazon-s3/
许多客户已经在享受使用 HBase on Amazon S3的众多好处,包括更低的成本、更好的数据持久性和更便捷的可扩展性。美国金融业监管局 (FINRA) 已 通过迁移到 HBase on Amazon S3架构将成本降低了 60%,并通过将存储与计算解耦以及将 S3 用作存储层获得了众多运营优势。HBase on Amazon S3允许您启动集群并立即开始对 S3 中的数据进行查询,而不必执行冗长的快照还原过程。随着  Amazon EMR 5.7.0 的发布,您现在可以将 HBase on Amazon S3的高可用性和持久性提升到集群级别,您现在可以启动多个 HBase 只读集群,并将这些集群连接到 S3 中的相同 HBase 根目录。这可以确保您的数据始终可以通过只读副本集群访问,并且可以在多个可用区中运行集群。在本文中,我将指导您使用HBase on Amazon S3设置只读副本集群。

HBase 概览

Apache HBase 是 Apache Hadoop 生态系统中的一种大规模可扩展分布式大数据存储。它是一种开源、非关系型、版本控制的数据库,在 Hadoop 分布式文件系统 (HDFS) 上运行。它为具有数十亿行和数百万列的表提供了随机、强一致、实时的数据访问。它与 Apache HadoopApache Hive 和 Apache Pig 紧密集成,因此您可以轻松兼得大规模并行分析与快速数据访问的优势。HBase 的数据模型、吞吐量和容错能力非常适合广告技术、网络分析、金融服务以及使用时序数据的应用程序中的工作负载等等。

像许多 NoSQL 技术一样,HBase 中的表结构应直接受到数据的查询和访问模式的影响。查询性能会因集群采用的数据处理和返回方式而大不相同。

HBase on Amazon S3

要使用 HBase on Amazon S3只读副本,必须首先使用 HBase on Amazon S3。如果您还不熟悉 HBase on Amazon S3架构,本节将介绍一些基础知识供您参考。

通过将 S3 用作 HBase 的数据存储,您可以分离集群的存储和计算节点。这使您能够通过调整集群大小来满足您的计算需求,从而降低成本。您不必为存储在集群 Hadoop 分布式文件系统 (HDFS) 中的整个数据集的 3 副本而付费。

EMR 将 HBase on Amazon S3配置为在集群中的内存和磁盘上缓存数据,以提高 S3 的读取性能。您可以快速轻松地扩展和缩减计算节点,而不会影响底层存储。您还可以终止集群以削减成本,然后在另一个可用区中快速还原它。

从 EMR 5.2.0 版开始,HBase 开始支持 S3。要将 S3 用作数据存储,请在 HBase 配置中配置存储模式并指定根目录。另外,建议启用 EMRFS 一致性视图。有关更多信息,请参阅 HBase on Amazon S3

HBase on Amazon S3 读副本集群的使用场景

使用 HBase on Amazon S3可以安全持久地存储您的数据。它在集群以外持久保留数据,从而消除了在终止集群时可能丢失数据的风险。在某些情况下,您希望确保 HBase 上数据的高可用性,即使是发生了集群或可用区故障的罕见事件。另一种情况是,您希望可以让多个集群访问 S3 中的相同根目录。如果您的主集群在批量加载、写入和压缩期间处于高负载状态,则您可以借助此功能创建辅助集群,以实现负载分担,将读取负载与写入负载分离开来,从而确保您满足读取服务级别协议要求,同时围绕成本和性能进行优化。

下图显示了没有只读副本的 HBase on Amazon S3。在这种情况下,集群故障或可用区故障等事件会导致用户无法访问 HBase 上的数据。

HBase 根目录(包括 HFile 和元数据)保存在 S3 中:

在 EMR 5.7.0 之前,您不能将多个集群指向同一个根目录。对于要求高可用性的架构,您需要在 S3 上创建重复数据。

 

EMR 5.7.0 发布后,您现在可以启动多个 HBase 只读集群,并可将这些集群连接到 S3 中的相同 HBase 根目录。这让您可以确保数据始终可以通过只读副本集群访问,并且可以在多个可用区中运行您的集群。

以下是一些使用 HBase on Amazon S3只读副本的架构示例,它们显示了可能的停机事件之前和之后的情况。

同一可用区中的 HBase 只读副本 – 在主集群发生故障时具有恢复能力。

不同可用区中的 HBase 只读副本 – 在可用区发生故障时具有恢复能力。

 

使用 HBase on Amazon S3只读副本的另一个场景是,您能够根据负载相应地调整集群的大小。例如,如果您预计读取负载较小,但仍然需要确保高可用性,则可以将只读副本的大小设置为较小的值,并且使用较小的实例类型。

另一个示例是批量加载,在这种情况下,您的写入集群可以在批量加载期间扩展以支持峰值负载。然后,在批量加载完成后,再将集群缩减到最小的规模。在扩展和收缩的过程中,您的只读副本可以保持特定于读取的集群规模,甚至可以具有异构的混合规模。

参考示例

您可以参考以下步骤设置 HBase on Amazon S3只读副本环境。此功能仅在 EMR 5.7.0 及更高版本中可用。

使用 HBase on Amazon S3 创建 EMR 集群

aws emr create-cluster --termination-protected --applications Name=Hadoop Name=Hive Name=HBase Name=Spark Name=Phoenix --ec2-attributes '{"KeyName":""}' --release-label emr-5.7.0 --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","InstanceType":"m3.xlarge","Name":"Master - 1"},{"InstanceCount":20,"BidPrice":"0.15","InstanceGroupType":"CORE","InstanceType":"m3.2xlarge","Name":"Core - 2"}]' --configurations '[{"Classification":"emrfs-site","Properties":{"fs.s3.consistent.retryPeriodSeconds":"1","fs.s3.consistent":"true","fs.s3.consistent.retryCount":"5","fs.s3.consistent.metadata.tableName":"YOUR_CONSISTENT_VIEW_TABLE_NAME"},"Configurations":[]},{"Classification":"hbase","Properties":{"hbase.emr.storageMode":"s3","hbase.emr.readreplica.enabled":"true"},"Configurations":[]},{"Classification":"hbase-site","Properties":{"hbase.rootdir":"s3:///"},"Configurations":[]}]' --service-role EMR_DefaultRole --name 'HBase Read Replica'

示例配置 JSON:

[  
   {  
      "Classification":"hbase-site",
      "Properties":{  
         "hbase.rootdir":"s3://{S3_LOCATION}",
      }
   },
   {  
      "Classification":"hbase",
      "Properties":{  
         "hbase.emr.storageMode":"s3",
         "hbase.emr.readreplica.enabled":"true"
      }
   }
]

将数据添加到主集群

在使用 HBase 只读副本加载系统时,必须确保从主集群发起的所有写入操作都作为 HFile 刷新到 S3。只读副本集群从这些 HFile 中读取,并且无法读取尚未从 Memstore 中刷新的任何新写入操作。为确保只读副本集群读取的是最新数据,请按照以下步骤操作:

  • 照常将数据插入 HBase 主集群(如果数据量较大,最好使用 BulkLoading)。
  • 确保(使用 flush 命令)将数据刷新到 S3。注意:这种做法仅在不使用 BulkLoading 时才有意义。
  • 等待所有区域拆分或合并完成,以确保 hbase:meta 表处于一致状态。
  • 如果任何区域已发生更改(拆分、合并)或者任何表元数据已修改(添加/删除了表),请在只读副本集群上运行 refresh_meta 命令。
  • 在只读副本集群上,对更新的表运行 refresh_hfiles 命令。

从副本读取数据

现在,您可以照常从集群读取数据了。

从主集群读取数据的屏幕截图

从只读副本集群读取数据的屏幕截图

如您所见,两个集群返回了相同的值。

保持只读副本的一致性

为使只读副本集群保持一致,请遵循以下通用准则:

在只读副本上:

在以下情况下运行“refresh_hfiles”:

  • 为表添加/修改记录。

在以下情况下运行“refresh_meta”:

  • 区域发生了更改(拆分、压缩)或任何表元数据发生了修改(添加/删除了表)

在主集群上:

如果启用了compaction,请执行compaction,以避免在触发major compaction(minor compaction可以处理)时出现不一致。

相关属性和命令

HBase 属性:

配置 默认值 说明
hbase.meta.table.suffix “” 在meta表名称中添加后缀:value=’test’ -> ‘hbase:meta_test’
hbase.global.readonly.enabled false 将整个集群设置为只读模式
Hbase.meta.startup.refresh false 将meta表与存储同步。用于获取新表或区域。

提醒:如果将 hbase.emr.readreplica.enabled 设置为 true,则系统会自动设置这些属性。

HBase 命令:

命令 描述
refresh_hfiles <Tablename 从磁盘刷新 HFile。用于在只读副本中获取新的编辑。
clear_block_cache <tablename> 清除指定表的缓存。
refresh_meta 将meta表与存储同步。用于获取新表活区域。

小结

现在,您可以为 HBase on Amazon S3集群创建高可用性的只读副本集群。一旦发生集群故障、 I/O密集的compaction甚至是较为罕见的可用区故障事件,您都可以保证正常的 HBase 数据读取访问。如需了解详情,请参阅使用 HBase on Amazon S3只读副本集群

建议您尝试一下 HBase on Amazon S3只读副本功能!

 


后续步骤

将您的技能提升到更高水准。学习从 HDFS 迁移到 S3 上的 Apache HBase 的技巧