Azure HDInsight 中的 Apache HBase 建议

本文介绍了几条建议,可帮助你优化 Azure HDInsight 中的 Apache HBase 性能。

优化 HBase 以读取最近写入的数据

如果你的用例涉及读取来自 HBase 的最近写入的数据,则此建议可帮助到你。 对于高性能,最好从 memstore 而不是远程存储提供 HBase 读取。

查询建议指示,对于表中的给定列系列,应大于从 memstore 获取的 75% 的读取量。 此指示器表明,即使 memstore 上发生刷新,也需要访问最近的文件,并且这些文件需要放入缓存中。 首先将数据写入 memstore,系统会在其中访问最近数据。 内部 HBase 刷新线程可能会检测到给定区域已达到 128M(默认)大小,并可能触发刷新。 这种情况甚至发生在 memstore 大小约为 128M 时写入的最近数据上。 因此,稍后读取这些最近的记录可能需要读取文件,而不是从 memstore 读取。 因此最好优化,确保最近刷新的数据也可以驻留在缓存中。

若要优化缓存中的最新数据,请考虑以下配置设置:

  1. hbase.rs.cacheblocksonwrite 设置为 true。 HDInsight HBase 中的此默认配置为 true,因此请检查其是否未被重置为 false

  2. 增加 hbase.hstore.compactionThreshold 值,以避免开始时压缩。 默认情况下,此值为 3。 可以将其更改为一个更大的值,如 10

  3. 如果遵循步骤 2 并设置 compactionThreshold,则将 hbase.hstore.compaction.max 更改为较大的值(例如 100),并将配置 hbase.hstore.blockingStoreFiles 的值更改为更大的值(例如 300)。

  4. 如果确定只需读取最近的数据,请将 hbase.rs.cachecompactedblocksonwrite 配置设置为“启用”。 此配置告知系统,即使发生压缩,数据仍保留在缓存中。 还可以在系列级设置配置。

    在 HBase Shell 中,运行以下命令以设置 hbase.rs.cachecompactedblocksonwrite 配置:

    alter '<TableName>', {NAME => '<FamilyName>', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '300'}}
    
  5. 可以禁用表中给定系列的块缓存。 对于具有最近数据读取的系列,请确保该配置已设置为“启用”。 默认情况下,已为表中的所有系列启用块缓存。 如果已禁用系列的块缓存,并且需要将其启用,可使用 hbase shell 中的 alter 命令。

    这些配置有助于确保数据在缓存中可用,并且最近数据不会进行压缩。 如果你的场景中可以使用 TTL,请考虑使用日期分层压缩。 有关详细信息,请参阅 Apache HBase 参考指南:日期分层压缩

优化刷新队列

此建议指示 HBase 刷新可能需要优化。 刷新处理程序的当前配置可能不够高,无法处理写入流量,这可能会导致刷新速度变慢。

在区域服务器 UI 中,请注意刷新队列是否增长到 100 以上。 此阈值表示刷新速度很慢,建议你调整 hbase.hstore.flusher.count 配置。 默认情况下,该值为 2。 请确保最大刷新线程数不超过 6。

此外,查看是否有区域计数优化方面的建议。 如果有,建议你尝试区域调优,看看这是否有助于提高刷新速度。 否则,请优化刷新线程。

区域计数优化

区域计数优化建议指示 HBase 已阻止更新,并且区域计数可能超过受支持的堆大小上限。 你可以优化堆大小、memstore 大小和区域计数。

下面是一个示例场景:

  • 假设区域服务器的堆大小为 10 GB。 默认情况下,hbase.hregion.memstore.flush.size128Mhbase.regionserver.global.memstore.size 的默认值为 0.4。 这意味着在 10 GB 中,4 GB 分配给 memstore(全局)。

  • 假设所有区域的写入负载分布均匀,并且每个区域只增加到 128 MB,则此设置中的最大区域数为 32 个区域。 如果给定的区域服务器配置为具有 32 个区域,则系统最好避免阻止更新。

  • 设置到位后,区域数为 100。 4 GB 全局 memstore 现在拆分为 100 个区域。 因此,实际上每个区域只能获得 40 MB 的 memstore。 如果写入是统一的,系统会频繁刷新,并且顺序大小更小,小于 40 MB。 增加刷新线程数可以提高刷新速度 hbase.hstore.flusher.count

该建议意味着,可以重新考虑每台服务器的区域数、堆大小和全局 memstore 大小配置以及刷新线程的优化,以避免更新被阻止。

压缩队列优化

如果 HBase 压缩队列增长到 2000 以上并且定期发生,则可将压缩线程数更改为一个更大的值。

如果用于压缩的文件数量过多,可能会导致与文件和 Azure 文件系统的交互方式相关的更多堆占用。 因此,最好尽快完成压缩。 在较旧的群集中,有时与限制相关的压缩配置可能会导致压缩速率变慢。

查看配置 hbase.hstore.compaction.throughput.lower.boundhbase.hstore.compaction.throughput.higher.bound。 如果它们已设置为 50M 和 100M,请保持原样。 但是,如果将这些设置配置为较低的值(较旧的群集就是这种情况),请将限制分别更改为 50M 和 100M。

配置 hbase.regionserver.thread.compaction.smallhbase.regionserver.thread.compaction.large(每个默认值为 1)。 此配置的最大值上限为小于 3。

全表扫描

完整表扫描建议显示,发出的扫描中超过 75% 是完整表/区域扫描。 可重新考虑代码调用扫描的方式,以提高查询性能。 请考虑以下做法:

  • 为每次扫描设置正确的开始和停止行。

  • 使用 MultiRowRangeFilter API,以便你可以在一次扫描调用中查询不同的范围。 有关详细信息,请参阅 MultiRowRangeFilter API 文档

  • 如果需要完整表或区域扫描,请检查是否有可能避免这些查询使用缓存,以便使用缓存的其他查询可能不会逐出热块。 为确保扫描不使用缓存,需要使用代码中的“setCaching(false)”选项的扫描 API :

    scan#setCaching(false)
    

后续步骤

使用 Ambari 优化 Apache HBase