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

阅读数:7 2019 年 12 月 16 日 15:49

使用 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 Hadoop Apache 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 中:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用 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:

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 命令。

从副本读取数据

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

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

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

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

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

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

保持只读副本的一致性

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

在只读副本上:

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

  • 为表添加 / 修改记录。

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

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

在主集群上:

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

相关属性和命令

HBase 属性:

col 1 col 2 col 3
配置 默认值 说明
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 命令:

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

小结

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

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


后续步骤

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

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

本文转载自 AWS 技术博客。

原文链接: https://amazonaws-china.com/cn/blogs/china/setting-up-read-replica-clusters-with-hbase-on-amazon-s3/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布