HBase在亚马逊 S3(亚马逊 S3 存储模式)上 - Amazon EMR

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

HBase在亚马逊 S3(亚马逊 S3 存储模式)上

当您在亚马逊EMR版本 5.2.0 或更高版本HBase上运行时,可以HBase在 Amazon S3 上启用,它具有以下优势:

  • HBase根目录存储在 Amazon S3 中,包括HBase存储文件和表元数据。这些数据在集群之外是永久性的,可在各个 Amazon EC2 可用区域中使用,您无需使用快照或其他方法进行恢复。

  • 通过在 Amazon S3 中存储文件,您可以根据自己的计算需求而不是数据要求调整亚马逊EMR集群的大小,同时还有 3 倍的HDFS复制量。

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

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

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

HBase在亚马逊 S3 架构上。

HBase在 Amazon S3 上启用

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

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

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

使用只读副本集群

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

主集群和只读副本集群的设置方式相同,但有一个重要差异。两者都指向相同的 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" } }

添加数据时同步只读副本

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

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

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

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

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

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

将数据与只读副本HBase同步

持续HFile跟踪

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

注意

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

禁用持续HFile跟踪

从 Amazon 6.2.0 EMR 版本开始,永久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 将写入的数据存储在内存中,并使用预写日志在数据写入 HBase StoreFiles Amazon S3 HDFS 之前存储写入的数据。集群的读取性能与可从内存中或磁盘缓存中读取记录的频率有关。缓存失误会导致从 Amazon S3 中读取记录,与从 StoreFile 中读取相比,Amazon S3 的延迟和标准差明显更高HDFS。此外,Amazon S3 的最大请求速率低于可从本地缓存中检索内容的速率,因此对于需要进行大量读取操作的工作负载来说,缓存数据可能非常重要。有关 Amazon S3 性能的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的性能优化

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

对于写入, MemStore 刷新频率以及小规模和主要压缩期间的 StoreFiles 存在次数可以显著增加区域服务器的响应时间。为了获得最佳性能,请考虑增加MemStore 刷新和HRegion块乘数的大小,这会增加主要压缩之间的间隔时间,但如果您使用只读副本,也会增加一致性的延迟。在某些情况下,使用更大的文件块大小(但小于 5 GB)触发 Amazon S3 分段上传功能可能会获得更好的性能。EMRFS亚马逊EMR的区块大小默认为 128 MB。有关更多信息,请参阅 HDFS配置。在通过刷新和压缩来衡量性能时,我们很少看到有客户的数据块大小超过 1GB。此外,当 StoreFiles 需要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 目录WALs下要清理的线程数。

在 Amazon EMR 5.17.0 及更早版本中,在运行繁重的工作负载时,清理操作可能会影响查询性能,因此我们建议您仅在非高峰时段启用清理器。清理器有以下 HBase shell 命令:

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

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

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

HBase在 Amazon S3 上进行性能调整的属性

当您在 Amazon S3 HBase 上使用时,可以调整以下参数以调整工作负载的性能。

配置属性 默认值 描述

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 S3 的数据的情况下关闭 Amazon EMR 集群,您应该将 MemStore 缓存刷新到 Amazon S3 以写入新的存储文件。首先,您需要禁用所有表格。在向集群添加步骤时,可使用以下步骤配置。有关更多信息,请参阅 Amazon EMR 管理指南中的使用 AWS 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 shell 和以下命令刷新hbase:meta表。

flush 'hbase:meta'

然后,您可以运行 Amazon EMR 集群上提供的 shell 脚本来刷新MemStore 缓存。您可以将它作为步骤添加,也可以使用集群中 AWS CLI直接运行它。该脚本会禁用所有HBase表,这会导致每个区域 MemStore的服务器刷新到 Amazon S3。如果此脚本成功完成,数据将保留在 Amazon S3 中,并且可以终止集群。

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