我使用的是通过cloudera部署的apachehbase(版本1.0.0)和phoenix(版本4.6)。由于我使用按查询分组的聚合速度较慢,我想尝试禁用特定hbase表的块缓存。我尝试了几种方法,但都没能成功。我正在通过hbase shell-descripte"my_table"命令验证是否启用/禁用了块缓存。
- 将cloudera控制台中的"hfile.block.cache.size"属性设置为0
alter 'myTable', CONFIGURATION => {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}
即使经过以上两个步骤,我在描述的命令输出中也得到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'}
可能出了什么问题?有什么建议吗?
谢谢。
而不是
alter 'myTable', CONFIGURATION => {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}
尝试做:
alter 'myTable', {NAME => 'myColumnFamily', BLOCKCACHE => 'false'}
按聚合分组时,phoenix.query.maxGlobalMemoryPercentage
和phoenix.query.maxGlobalMemorySize
的最小值控制中间结果的最大内存。修改此限制(默认为15%)可以提高聚合性能。
我现在更清楚地理解了这个问题。Phoenix在HBase中实现协处理器,以便在HBase服务器上并行执行查询。
如果查询计划仅由单个表扫描组成,则可能不需要缓存(maxGlobalMemory
缓存)。但Phoenix目前不支持ROLLUP
。对于GROUP BY
,Phoenix将在产生最终结果之前将中间Map(由协处理器返回)存储在内存中或溢出到磁盘(由phoenix.query.maxGlobalMemory
定义的行为)。最好把它记在心里。HBase块缓存设置在协处理器在每个HBase节点上执行时生效(由于您只希望读取此表一次,因此禁用这些列族的块缓存以减少垃圾收集开销和有用块的逐出是有意义的)。
因此,这两种设置是互补的。您可能希望在调整maxGlobalMemory
缓存时禁用HBase块缓存。
关于未生效的设置,http://hbase.apache.org/book.html#config.files
目前,这里的更改需要重新启动集群,HBase才能注意到更改。