HBase on Amazon S3(Amazon S3 存储模式) - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 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 中。如果主群集变得不可用,您可以访问只读副本群集中的数据以同时执行读取操作。

  • 在 Amazon EMR 版本 6.2.0 及更高版本中,持久性 HFile 跟踪使用名为“hbase:storefile”的 HBase 系统表直接跟踪用于读取操作的 HFile 路径。此功能在默认情况下处于启用状态,无需执行手动迁移。

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


							HBase on Amazon S3 架构。

启用 HBase on Amazon S3

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

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

如果您使用 Amazon S3 存储桶作为 HBase rootdir 的 ,则必须在 Amazon S3 URI 末尾添加一个斜杠。例如,您必须使用 "hbase.rootdir: s3://my-bucket/"而不是 "hbase.rootdir: s3://my-bucket",以避免问题。

使用只读副本群集

在使用 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 只读副本同步

持久性 HFile 跟踪

持久性 HFile 跟踪使用名为“hbase:storefile”的 HBase 系统表直接跟踪用于读取操作的 HFile 路径。在将附加数据添加到 HBase 时,新 HFile 路径将添加到表中。这会在关键写入路径 HBase 操作中将重命名操作作为提交机制删除,并通过从“hbase:storefile”系统表而不是文件系统目录列表中读取来缩短打开 HBase 区域时的恢复时间。默认情况下,在 Amazon EMR 版本 6.2.0 及更高版本上启用此功能,并且不需要任何手动迁移步骤。

注意

使用 HBase storefile 系统表的持久性 HFile 跟踪不支持 HBase 区域复制功能。有关 HBase 区域复制的更多信息,请参阅时间线一致性高可用读取

禁用持久性 HFile 跟踪

默认情况下,从 EMR 版本 6.2.0 开始启用持久性 HFile 跟踪。要禁用持久性 HFile 跟踪,请在启动集群时指定以下配置覆盖:

{ "Classification": "hbase-site", "Properties": { "hbase.storefile.tracking.persist.enabled":"false", "hbase.hstore.engine.class":"org.apache.hadoop.hbase.regionserver.DefaultStoreEngine" } }
注意

在重新配置Amazon EMR集群时,必须更新所有实例组。

手动同步 Storefile 表

在创建新的 HFiles 时,存储文件表将保持最新。但是,如果存储文件表出于任何原因变得与数据文件不同步,可以使用以下命令手动同步数据:

同步在线区域中的 storefile 表:

hbase org.apache.hadoop.hbase.client.example.RefreshHFilesClient <table>

同步离线区域中的 storefile 表:

  • 删除 storefile 表 znode。

    echo "ls /hbase/storefile/loaded" | sudo -u hbase hbase zkcli [<tableName>, hbase:namespace] # The TableName exists in the list echo "delete /hbase/storefile/loaded/<tableName>" | sudo -u hbase hbase zkcli # Delete the Table ZNode echo "ls /hbase/storefile/loaded" | sudo -u hbase hbase zkcli [hbase:namespace]
  • 分配区域(在“hbase shell”中运行)。

    hbase cli> assign '<region name>'
  • 如果分配失败。

    hbase cli> disable '<table name>' hbase cli> enable '<table name>'

扩展 Storefile 表

默认情况下,storefile 表拆分为四个区域。如果 storefile 表仍在繁重写入负载下,则可以进一步手动拆分该表。

要拆分特定的热区域,请使用以下命令(在“hbase shell”中运行)。

hbase cli> split '<region name>'

要拆分表,请使用以下命令(在“hbase shell”中运行)。

hbase cli> split 'hbase:storefile'

操作注意事项

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

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

对于写入MemStore 刷新的频率以及次压缩和主要压缩期间存在的 StoreFiles的数量可大大影响区域服务器响应时间的增加。要获得最佳性能,请考虑增大 MemStore 刷新和 HRegion 块倍数的大小,这将增加主要压缩之间的用时,并增加一致性的滞后 (如果您使用只读副本)。在某些情况下,使用较大的文件块大小(但小于 5 GB)触发 EMRFS 中的Amazon S3分段上传功能可能会获得更好的性能。 Amazon EMR的数据块大小默认值为 128 MB。有关更多信息,请参阅HDFS 配置。我们很少看到客户在通过刷新和压缩来测试性能时超过 1 GB 的数据块大小。此外,当需要压缩的存储文件较少时,HBase 压缩和区域服务器的性能可能会最佳。

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

有一个 HBase 清理器过程,可清理旧 WAL 文件并存储文件。对于 Amazon EMR 版本 5.17.0 及更高版本,全局启用清理器,且以下配置属性可用于控制清理器行为。

配置属性 默认值 描述

hbase.regionserver.hfilecleaner.large.thread.count

1

分配给清除过期大型 HFiles线程数。

hbase.regionserver.hfilecleaner.small.thread.count

1

分配给清理过期小型 HFiles线程数。

hbase.cleaner.scan.dir.concurrent.size

将 设置为所有可用内核的四分之一。

要扫描oldWALs 目录的线程数。

hbase.oldwals.cleaner.thread.size

2

用于清除旧 WALs下的 WAL 的线程数。 oldWALs

对于 Amazon EMR 5.17.0 及更早版本,在运行大量工作负载时,清理器操作会影响查询性能;因此,我们建议您只在非高峰时间启用清理器。清理器具有以下 HBase shell 命令:

  • cleaner_chore_enabled 查询是否启用清理器。

  • cleaner_chore_run 手动运行 清理器来删除文件。

  • cleaner_chore_switch 启用或禁用清理器并返回清理器的先前状态。例如, cleaner_chore_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

阻止更新之前,存储中可存在的StoreFiles的最大数量。

hbase.hregion.max.filesize

10737418240

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

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

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

在向集群添加步骤时,可以使用以下步骤配置。有关更多信息,请参阅 中的使用 CLI https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-work-with-steps.html 和控制台Amazon EMR 管理指南执行步骤。

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 数据重新启动集群,可在 Amazon S3中或使用 AWS 管理控制台 配置属性指定与上一个集群相同的 hbase.rootdir 位置。