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