Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

HBase on Amazon S3 (Amazon S3 存储模式)

在 Amazon EMR 5.2.0 版或更高版本上运行 HBase 时,您可以启用 HBase on Amazon S3,这将提供以下优势:

  • HBase 根目录存储在 Amazon S3 中,包括 HBase 存储文件和表元数据。此数据在集群外部持续存在且可跨 Amazon EC2 可用区访问,您无需使用快照或其他方法进行恢复。

  • 对于 Amazon S3 中的存储文件,您可以针对计算要求而非数据要求调整 Amazon EMR 集群的大小 (在 HDFS 上为 3 倍复制)。

  • 使用 Amazon EMR 5.7.0 版或更高版本,您可设置只读副本集群,这允许您将数据的只读副本保留在 Amazon S3 中。如果主集群变得不可用,您可以访问只读副本集群中的数据以同时执行读取操作。

下图显示与 HBase on Amazon S3 相关的 HBase 组件。

 HBase on Amazon S3 架构。

启用 HBase on Amazon S3

您可以使用 Amazon EMR 控制台、AWS CLI 或 Amazon EMR API 启用 HBase on Amazon S3。该配置是集群创建期间的一个选项。在使用控制台时,您使用 Advanced options 选择设置。在使用 AWS CLI 时,可使用 --configurations 选项提供 JSON 配置对象。配置对象的属性指定了 Amazon S3 中的存储模式和根目录位置。您指定的 Amazon S3 位置应位于 Amazon EMR 集群所在的区域内。一次仅一个活动集群可使用 Amazon S3 中的相同 HBase 根目录。有关控制台步骤和使用 AWS CLI 的详细 create-cluster 示例,请参阅创建带 HBase 的集群。以下 JSON 代码段中显示了示例配置对象。

重要

在为生产工作负载启用 HBase on Amazon S3 时,我们强烈建议您使用 EMRFS 一致视图。不使用一致视图可能会影响特定操作的性能。有关配置一致视图的更多信息,请参阅 Amazon EMR 管理指南 中的一致视图

{ "Classification": "hbase-site", "Properties": { "hbase.rootdir": "s3://my-bucket/my-hbase-rootdir"} }, { "Classification": "hbase", "Properties": { "hbase.emr.storageMode":"s3" } }

使用只读副本集群

在使用 HBase on Amazon S3 设置主集群后,您可创建和配置只读副本集群,此集群提供对与主集群相同的数据的只读访问权限。当您需要同步访问权限以查询数据或在主集群变得不可用的情况下进行连续访问时,这会很有用。只读副本功能适用于 Amazon EMR 5.7.0 版和更高版本。

主集群和只读副本集群的设置方式相同,但有一个重要差异。二者都指向同一 hbase.rootdir 位置。不过,只读副本集群的 hbase 分类包括 "hbase.emr.readreplica.enabled":"true" 属性。

例如,假定主集群的 JSON 分类如主题中前面所示,只读副本集群的配置如下所示:

{ "Classification": "hbase-site", "Properties": { "hbase.rootdir": "s3://my-bucket/my-hbase-rootdir"} }, { "Classification": "hbase", "Properties": { "hbase.emr.storageMode":"s3", "hbase.emr.readreplica.enabled":"true" } }

在添加数据时同步只读副本

由于只读副本使用主集群写入 Amazon S3 的 HBase 存储文件和元数据,因此,只读副本仅与 Amazon S3 数据存储一样新。在写入数据时,以下指导信息可帮助您最大程度地缩短主集群和只读副本之间的滞后时间。

  • 如果可能,请在主集群上批量加载数据。有关更多信息,请参阅 Apache HBase 文档中的批量加载

  • 将存储文件写入 Amazon S3 的刷新操作应在添加数据后尽快进行。手动刷新或微调刷新设置可最大程度地缩短滞后时间。

  • 如果压缩可自动运行,则运行手动压缩可避免触发压缩时产生不一致。

  • 在只读副本上,在任何元数据发生更改后 - 例如,在执行 HBase 区域拆分或压缩后,或添加或删除表后 - 运行 refresh_meta 命令。

  • 在只读副本集群上,在表中添加或更改记录后,运行 refresh_hfiles 命令。

 将数据与 HBase 只读副本同步

操作注意事项

HBase 区域服务器使用 BlockCache 在内存中存储数据读取,并使用 BucketCache 在本地磁盘上存储数据读取。此外,区域服务器使用 MemStore 将数据写入存储在内存中,并在数据被写入 Amazon S3 中的 HBase 存储文件之前使用预写日志将数据写入存储到 HDFS 中。集群的读取性能与可从内存中或磁盘缓存中读取记录的频率有关。缓存未命中会导致从 Amazon S3 中的存储文件读取记录,与从 HDFS 读取相比,这将产生更大的延迟和标准差。此外,Amazon S3 的最大请求速率低于可从本地缓存中检索内容的速率,因此对于需要进行大量读取操作的工作负载来说,缓存数据可能非常重要。有关 Amazon S3 性能的更多信息,请参阅 Amazon Simple Storage Service Developer Guide 中的性能优化

为了提高性能,建议您在 EC2 实例存储中缓存尽可能多的数据集。由于 BucketCache 使用区域服务器的 EC2 实例存储,因此,您可以选择具有足够实例存储的 EC2 实例类型并添加 Amazon EBS 存储来适应所需的缓存大小。您也可以使用 hbase.bucketcache.size 属性增加所附加实例存储和 EBS 卷上的 BucketCache 大小。默认设置为 8192 MB。

对于写入操作,次要压缩和主要压缩期间存在的 MemStore 刷新频率和存储文件数量会大大推动区域服务器响应时间的增加。要获得最佳性能,请考虑增大 MemStore 刷新和 HRegion 块倍数的大小,这将增加主要压缩之间的用时,并增加一致性的滞后 (如果您使用只读副本)。在某些情况下,使用较大的文件块大小 (但小于 5 GB) 触发 EMRFS 中的 Amazon S3 分段上传功能也许能够获得更佳性能。此外,当需要压缩的存储文件较少时,HBase 压缩和区域服务器的性能可能会最佳。

由于需要对大量目录进行重命名,因此从 Amazon S3 中删除表需要花费大量时间。请考虑禁用表而不是删除表。

有一个清理旧 WAL 文件和存储文件的 HBase 清理器过程。在运行巨大工作负载时,清理器操作会影响查询性能;因此,我们建议您只在非高峰时间启用清理器。清理器具有以下 HBase 外壳命令:

  • cleaner_enabled 查询是否已启用清理器。

  • cleaner_run 手动运行清理器以删除文件。

  • cleaner_switch 启用或禁用清理器并返回清理器的之前状态。例如,cleaner-switch true 启用清理器。

用于 HBase on Amazon S3 性能优化的属性

使用 HBase on Amazon S3 时,可调整以下参数来优化工作负载的性能。

配置属性 默认值 说明

hbase.bucketcache.size

8192

区域服务器 Amazon EC2 实例存储和 BucketCache 存储的 EBS 卷上预留的磁盘空间量 (以 MB 为单位)。此设置应用于所有区域服务器实例。更大的 BucketCache 大小通常会对应更高的性能

hbase.hregion.memstore.flush.size

134217728

触发对 Amazon S3 的 memstore 刷新的数据限制 (以字节为单位)。

hbase.hregion.memstore.block.multiplier

4

一个确定 MemStore 上限的倍数,达到此上限时将阻止更新。如果 MemStore 超出 hbase.hregion.memstore.flush.size 与此值的乘积,将阻止更新。可能会执行 MemStore 刷新和压缩以取消阻止更新。

hbase.hstore.blockingStoreFiles

10

更新受阻前,存储中可存在的存储文件的最大数目。

hbase.hregion.max.filesize

10737418240

拆分区域前的最大区域大小。

关闭并恢复集群而不丢失数据

要关闭 Amazon EMR 集群而不丢失尚未写入 Amazon S3 的数据,MemStore 缓存需要刷新到 Amazon S3 以写入新存储文件。为此,您可以运行 EMR 集群上提供的外壳脚本。您可以将它作为步骤添加,也可以使用集群中 CLI 直接运行它。此脚本会禁用所有 HBase 表,这会导致每个区域服务器上的 MemStore 刷新到 Amazon S3。如果此脚本成功完成,数据将保留在 Amazon S3 中,并且可以终止集群。

在向集群添加步骤时,可使用以下步骤配置。有关更多信息,请参阅 Amazon EMR 管理指南 中的使用 CLI 和控制台执行步骤

Name="Disable all tables",Jar="command-runner.jar",Args=["/bin/bash","/usr/lib/hbase/bin/disable_all_tables.sh"]

您也可以直接运行以下 bash 命令。

bash /usr/lib/hbase/bin/disable_all_tables.sh

要使用相同 HBase 数据重新启动集群,可在 AWS Management Console中或使用 hbase.rootdir 配置属性指定与上一个集群相同的 Amazon S3 位置。