【问题标题】:Disabling HBase Block Cache禁用 HBase 块缓存
【发布时间】:2016-03-25 06:54:56
【问题描述】:

我正在使用通过 cloudera 部署的 apache hbase(1.0.0 版)和 phoenix(4.6 版)。由于我的 group by 查询聚合很慢,我想尝试禁用特定 hbase 表的块缓存。我尝试了几种方法,但都没有成功。我正在验证是否通过 hbase shell 启用/禁用了块缓存 - describe 'my_table' 命令。

  1. 将 cloudera 控制台中的 'hfile.block.cache.size' 属性设置为 0
  2. alter 'myTable', CONFIGURATION => {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}

即使经过上述两个步骤,我在 describe 命令输出中得到 BLOCKCACHE => 'true'

COLUMN FAMILIES DESCRIPTION
{NAME => '0', DATA_BLOCK_ENCODING => 'FAST_DIFF', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => 'NONE', VERSIONS => '1', MIN_VERSIONS => '0', TTL => 'FOREVER',
KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}

可能出了什么问题?有什么建议吗?

谢谢。

【问题讨论】:

    标签: hbase cloudera-cdh phoenix


    【解决方案1】:

    而不是

    alter 'myTable', CONFIGURATION => {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}
    

    尝试做:

    alter 'myTable', {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}
    

    【讨论】:

      【解决方案2】:

      phoenix.query.maxGlobalMemoryPercentagephoenix.query.maxGlobalMemorySize 的最小值控制进行分组聚合时中间结果的最大内存。修改此限制(默认 15%)可能会提高聚合性能。

      【讨论】:

      • 理论上,为聚合和分组查询启用块缓存是否有意义?假设它会导致全表扫描,我认为如果启用块缓存会影响性能。考虑一个汇总查询,例如 - SELECT SUM(UNIT_SOLD), SUM(TOTAL_SALES) FROM TRANSACTIONS GROUP BY COUNTRY;你怎么看?
      【解决方案3】:

      我现在更清楚地理解了这个问题。 Phoenix 在 HBase 中实现协处理器以在 HBase 服务器上并行执行查询。

      如果查询计划仅包含单个表扫描,则可能不需要缓存(maxGlobalMemory缓存)。但是凤凰目前不支持ROLLUP。对于GROUP BY,Phoenix 将在生成最终结果之前将中间映射(由协处理器返回)存储在内存中或溢出到磁盘(行为由phoenix.query.maxGlobalMemory 定义)。最好把它放在内存中。 HBase 块缓存设置在协处理器在每个 HBase 节点上执行时生效(因为您只希望读取此表一次,因此禁用这些列族的块缓存以减少垃圾收集开销和驱逐有用块是有意义的)。

      因此,这两种设置是互补的。您可能希望在调整 maxGlobalMemory 缓存时禁用 HBase 块缓存。

      关于设置不生效,http://hbase.apache.org/book.html#config.files

      目前,此处的更改需要重新启动集群才能让 HBase 注意到更改。

      【讨论】:

      • 我找到了禁用阻止缓存的方法。通过在 phoenix 中执行 alter table 查询,我能够做到这一点。我尝试了 maxGlobalMemory 设置,但这对查询时间没有任何影响。顺便说一句,您提到 ROLLUP,支持 ROLLUP 子句与此查询“SELECT SUM(UNIT_CNT_SOLD), SUM(TOTAL_SALES) FROM TRANSACTIONS GROUP BY T_COUNTRY;”有何不同.此查询是按国家/地区汇总销售额吗?
      • 我误解了您之前提到的 ROLLUP。可能有查询会生成与 ROLLUP 语句相同的查询/执行计划,但是 Phoenix 不支持查询中的关键字 ROLLUP,这就是我所指的。但我同意,禁用块缓存似乎是合适的。在这种情况下它是否提高了性能?
      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      相关资源
      最近更新 更多