禁用HBase块缓存

禁用HBase块缓存,hbase,cloudera-cdh,phoenix,Hbase,Cloudera Cdh,Phoenix,我使用的是通过cloudera部署的apache hbase(版本1.0.0)和phoenix(版本4.6)。由于使用GROUPBY查询进行聚合的速度较慢,因此我想尝试禁用特定hbase表的块缓存。我尝试了两种方法,但都没有成功。我正在通过hbase shell-description'my_table'命令验证是否启用/禁用了块缓存 将cloudera控制台中的“hfile.block.cache.size”属性设置为0 alter'myTable',CONFIGURATION=>{NAME=

我使用的是通过cloudera部署的apache hbase(版本1.0.0)和phoenix(版本4.6)。由于使用GROUPBY查询进行聚合的速度较慢,因此我想尝试禁用特定hbase表的块缓存。我尝试了两种方法,但都没有成功。我正在通过hbase shell-description'my_table'命令验证是否启用/禁用了块缓存

  • 将cloudera控制台中的“hfile.block.cache.size”属性设置为0
  • alter'myTable',CONFIGURATION=>{NAME=>'myColumnFamily',BLOCKCACHE=>'false'}
  • 即使在上述两个步骤之后,我在descripe命令输出中也会得到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'}
    
    出了什么问题?有什么建议吗


    谢谢。

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

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

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

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

    关于未生效的设置

    目前,此处的更改需要重新启动群集,以便HBase注意到更改


    理论上,为聚合和分组查询启用块缓存有意义吗?假设这会导致全表扫描,我认为如果启用块缓存,会影响性能。考虑一个汇总查询,如来自国家的事务组的选择SUM(UNITSUAD)、SUM(TooTySurm);你觉得怎么样?我找到了阻止缓存的方法。通过在phoenix中执行alter table查询,我能够做到这一点。我尝试了maxGlobalMemory设置,但这对查询计时没有任何影响。顺便说一句,您提到了ROLLUP,支持ROLLUP子句与此查询“按T_国家/地区从交易组中选择SUM(单位销售额)、SUM(总销售额)”有多大不同。这个查询是按国家汇总销售额的,对吗?我误解了你先前提到的汇总。可能存在生成与ROLLUP语句相同的查询/执行计划的查询,但Phoenix不支持查询中的关键字ROLLUP,这正是我所指的。但我同意,禁用块缓存似乎是合适的。在这种情况下,它是否提高了性能?