Amazon S3 上的 HBase(Amazon S3 存储模式) - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 上的 HBase(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 中。如果主群集变得不可用,您可以访问只读副本群集中的数据以同时执行读取操作。

  • 在亚马逊 EMR 6.2.0 版及更高版本中,持久性 H文件跟踪使用名为hbase:storefile直接跟踪用于读取操作的 HFile 路径。默认情况下,此功能处于启用状态,不需要执行手动迁移。

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


							HBase Amazon S3 架构。

启用 Amazon S3 上的 HBase

您可以使用 Amazon S3 EMR 控制台、Amazon CLI或亚马逊 EMR API。该配置是群集创建期间的一个选项。当您使用控制台时,您可以使用高级选项。在使用 Amazon CLI 时,使用 --configurations 选项提供 JSON 配置对象。配置对象的属性指定 Amazon S3 中的存储模式和根目录位置。您指定的 Amazon S3 位置应位于 Amazon EMR 群集所在的区域内。一次仅一个活动集群可使用 Amazon S3 中的相同 HBase 根目录。有关控制台步骤和使用 Amazon 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 存储桶作为rootdir对于 HBase,您必须在 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 StoreFiles 和元数据,因此,只读副本仅与 Amazon S3 数据存储一样新。在写入数据时,以下指导信息可帮助您最大程度地缩短主群集和只读副本之间的滞后时间。

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

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

  • 如果压缩可能会自动运行,请运行手动压缩以避免触发压缩时出现不一致。

  • 在只读副本群集上,当任何元数据发生更改时(例如,当 HBase 区域拆分或压缩时,或者添加或删除表时)运行refresh_meta命令。

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


					将数据与 HBase 只读副本同步

持久性 HFile 跟踪

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

注意

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

禁用持久 H文件跟踪

默认情况下,从 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 集群时,必须更新所有实例组。

手动同步存储文件表

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

同步联机区域中的存储文件表:

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

同步脱机区域中的存储文件表:

  • 删除存储文件表 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>'

缩放存储文件表

默认情况下,存储文件表被拆分为四个区域。如果存储文件表仍处于沉重的写入负载状态,则可以手动进一步拆分该表。

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

hbase cli> split '<region name>'

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

hbase cli> split 'hbase:storefile'

操作注意事项

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

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

对于写入,MemStore 刷新的频率以及次要和主要压缩期间存在的 StoreFiles 数量可能会显著增加区域服务器响应时间。要获得最佳性能,请考虑增大 MemStore 刷新和 HRegion 块倍数的大小,这将增加主要压缩之间的用时,并增加一致性的滞后 (如果您使用只读副本)。在某些情况下,使用较大的文件块大小 (但小于 5 GB) 触发 EMRFS 中的 Amazon S3 分段上传功能也许能够获得更佳性能。亚马逊 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

要清理 OldWals 目录下的 WAL 的线程的数量。

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

  • cleaner_chore_enabled查询是否启用清理程序。

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

  • cleaner_chore_switch启用或禁用清理程序并返回清理程序的先前状态。例如,cleaner_chore_switch true启用清洁程序。

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

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

配置属性 默认值 描述

hbase.bucketcache.size

8192

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

hbase.hregion.memstore.flush.size

134217728

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

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 群集上提供的外壳脚本。您可以将它作为步骤添加,也可以使用群集中 CLI 直接运行它。此脚本会禁用所有 HBase 表,这会导致每个区域服务器上的 MemStore 刷新到 Amazon S3。如果此脚本成功完成,数据将保留在 Amazon S3 中,并且可以终止群集。

在向群集添加步骤时,可使用以下步骤配置。有关更多信息,请参阅 。使用 CLI 和控制台处理步骤中的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 Web Services Management Console或使用hbase.rootdir配置属性。