我正在使用通过cloudera部署的apachehbase(版本1.0.0)和phoenix(版本4.6)。由于使用GROUPBY查询进行聚合的速度很慢,因此我想尝试禁用特定hbase表的块缓存。我试过几种方法,但都没有成功。我正在通过hbase shell-description'my\u table'命令验证是否启用/禁用了块缓存。
将cloudera控制台中的“hfile.block.cache.size”属性设置为0 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'}
会出什么问题?有什么建议吗?
谢谢您。
2条答案
按热度按时间bvpmtnay1#
最小值
phoenix.query.maxGlobalMemoryPercentage
以及phoenix.query.maxGlobalMemorySize
在执行分组聚合时,控制中间结果的最大内存。修改此限制(默认值为15%)可以提高聚合性能。pxy2qtax2#
我现在更明白这个问题了。phoenix在hbase中实现协处理器,以便在hbase服务器上并行执行查询。
如果查询计划只包含一个表扫描,则可能不需要缓存(
maxGlobalMemory
缓存)。但Phoenix目前不支持ROLLUP
. 为了一个GROUP BY
,phoenix将中间Map(由协处理器返回)存储在内存中或溢出到磁盘(行为由phoenix.query.maxGlobalMemory
)在产生最终结果之前。最好把它记在记忆里。hbase块缓存设置在协处理器在每个hbase节点上执行时生效(因为您只希望读取此表一次,所以有必要为这些列族禁用块缓存,以减少垃圾收集开销和有用块的逐出)。因此,这两种设置是互补的。您可能希望在调整时禁用hbase块缓存
maxGlobalMemory
隐藏物。关于未生效的设置,http://hbase.apache.org/book.html#config.files
目前,这里的更改需要重新启动集群,hbase才能注意到更改。