参见推荐配置

117.1。改善第 99 百分位数

尝试链接:[hedged_reads]。

117.2。管理压缩

对于较大的系统,管理链接:[compactions 和 splits]可能是您想要考虑的事情。

117.3。 hbase.regionserver.handler.count

[hbase.regionserver.handler.count]

117.4。 hfile.block.cache.size

[hfile.block.cache.size] 。 RegionServer 进程的内存设置。

117.5。 Blockcache 的预取选项

HBASE-9857 添加了一个新选项,用于在打开 BlockCache 时预取 HFile 内容,如果设置了 Column 系列或 RegionServer 属性。此选项适用于 HBase 0.98.3 及更高版本。目的是在打开缓存后,使用内存中的表数据尽可能快地加热 BlockCache,而不将预取计为缓存未命中。这对于快速读取非常有用,但如果要预加载的数据不适合 BlockCache,则不是一个好主意。它可用于调整预取的 IO 影响与所有数据块在缓存中的时间之间的关系。

要在给定列族上启用预取,可以使用 HBase Shell 或使用 API​​。

使用 HBase Shell 启用预取

hbase> create 'MyTable', { NAME => 'myCF', PREFETCH_BLOCKS_ON_OPEN => 'true' } 

示例 38.使用 API​​启用预取

// ...
HTableDescriptor tableDesc = new HTableDescriptor("myTable");
HColumnDescriptor cfDesc = new HColumnDescriptor("myCF");
cfDesc.setPrefetchBlocksOnOpen(true);
tableDesc.addFamily(cfDesc);
// ... 

请参阅 CacheConfig 的 API 文档。

要查看运行中的预取,请在 hbase-2.0 +中的org.apache.hadoop.hbase.io.hfile.HFileReaderImpl或 HBase 的早期版本 hbase-1.x 中的org.apache.hadoop.hbase.io.hfile.HFileReaderV2上启用 TRACE 级别日志记录。

117.6。 hbase.regionserver.global.memstore.size

[hbase.regionserver.global.memstore.size] 。通常根据需要为 RegionServer 进程调整此内存设置。

117.7。 hbase.regionserver.global.memstore.size.lower.limit

[hbase.regionserver.global.memstore.size.lower.limit] 。通常根据需要为 RegionServer 进程调整此内存设置。

117.8。 hbase.hstore.blockingStoreFiles

参见 [hbase.hstore.blockingStoreFiles] 。如果 RegionServer 日志中存在阻塞,则增加此功能会有所帮助。

117.9。 hbase.hregion.memstore.block.multiplier

参见 [hbase.hregion.memstore.block.multiplier] 。如果有足够的 RAM,增加这个可以帮助。

117.10。 hbase.regionserver.checksum.verify

让 HBase 将校验和写入数据块,并保存在您阅读时必须进行校验和搜索。

[hbase.regionserver.checksum.verify][hbase.hstore.bytes.per.checksum][hbase.hstore.checksum.algorithm] 。有关更多信息,请参阅 HBase 块缓存中 HBASE-5074 支持校验和的发行说明。

117.11。调整callQueue选项

HBASE-11355 引入了几种可以提高性能的 callQueue 调整机制。有关基准信息,请参阅 JIRA。

要增加呼叫队列的数量,请将hbase.ipc.server.num.callqueue设置为大于1的值。要将 callqueue 拆分为单独的读写队列,请将hbase.ipc.server.callqueue.read.ratio设置为01之间的值。此因子将队列加权写入(如果低于.5)或读取(如果高于.5)。另一种说法是,该因子决定了拆分队列中有多少百分比用于读取。以下示例说明了一些可能性。请注意,无论您使用何种设置,始终至少有一个写入队列。

  • 0的默认值不会拆分队列。

  • .3使用 30%的队列进行读取,60%用于写入。给定hbase.ipc.server.num.callqueue10值,3 个队列将用于读取,7 个用于写入。

  • .5使用相同数量的读取队列和写入队列。给定hbase.ipc.server.num.callqueue10值,5 个队列将用于读取,5 个用于写入。

  • .6使用 60%的队列进行阅读,30%进行阅读。给定hbase.ipc.server.num.callqueue10值,7 个队列将用于读取,3 个用于写入。

  • 1.0使用一个队列来处理写请求,所有其他队列处理读请求。高于1.0的值与1.0的值具有相同的效果。给定hbase.ipc.server.num.callqueue10值,9 个队列将用于读取,1 个用于写入。

您还可以拆分读取队列,以便通过设置hbase.ipc.server.callqueue.scan.ratio选项将单独的队列用于短读取(来自 Get 操作)和长读取(来自扫描操作)。此选项是介于 0 和 1 之间的因子,它决定了用于获取和扫描的读取队列的比率。如果值低于.5,则将更多队列用于获取;如果值高于.5,则将更多队列用于扫描。无论您使用何种设置,至少有一个读取队列用于 Get 操作。

  • 0不会拆分读取队列。

  • .3使用 60%的读取队列获取,30%用于扫描。给定hbase.ipc.server.num.callqueue20值和hbase.ipc.server.callqueue.read.ratio.5值,将有 10 个队列用于读取,其中 10 个,7 个用于获取,3 个用于扫描。

  • .5使用获取的一半读取队列和扫描的一半。给定hbase.ipc.server.num.callqueue20值和hbase.ipc.server.callqueue.read.ratio.5值,将有 10 个队列用于读取,其中 10 个用于获取,5 个用于扫描。

  • .6使用 30%的读取队列获取,60%用于扫描。给定hbase.ipc.server.num.callqueue20值和hbase.ipc.server.callqueue.read.ratio.5值,将有 10 个队列用于读取,其中 10 个用于获取,3 个用于扫描。

  • 1.0使用除扫描队列之外的所有读取队列。给定hbase.ipc.server.num.callqueue20值和hbase.ipc.server.callqueue.read.ratio.5值,将有 10 个队列用于读取,其中 10 个用于获取,1 个用于扫描。

您可以使用新选项hbase.ipc.server.callqueue.handler.factor以编程方式调整队列数:

  • 0在所有处理程序之间使用单个共享队列。

  • 1为每个处理程序使用单独的队列。

  • 01之间的值会根据处理程序的数量调整队列数。例如,.5的值在每两个处理程序之间共享一个队列。

    拥有更多队列(例如,在每个处理程序中有一个队列的情况下)可以在将任务添加到队列或从队列中选择任务时减少争用。权衡的是,如果你有一些长时间运行任务的队列,处理程序可能最终等待从该队列执行而不是处理另一个具有等待任务的队列。

要使这些值在给定的 RegionServer 上生效,必须重新启动 RegionServer。这些参数仅用于测试目的,应谨慎使用。