Phoenix性能优化常用手段

1. 建表优化

Salting 翻译成中文是加盐的意思,本质是在hbase的rowkey的byte数组的第一个字节位置设定一个系统生成的byte值, 这个byte值是由主键生成rowkey的byte数组做一个哈希算法,计算得来的。Salting之后可以把数据分布到不同的region上,这样有利于phoenix并发的读写操作。

示例:

CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) SALT_BUCKETS=16

Pre-split 这个就是HBase的预分区了,在建phoenix表时,可以精确的指定要根据什么值来做预分区。
示例:

CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) SPLIT ON ('CS','EU','NA')

使用多个列族,在创建phoenix表是可以指定列所在的列族。
示例:

CREATE TABLE TEST (MYKEY VARCHAR NOT NULL PRIMARY KEY, A.COL1 VARCHAR, A.COL2 VARCHAR, B.COL3 VARCHAR)

在数据量大的表上使用压缩算法来提高性能 GZ,lzo等。
示例:

CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) COMPRESSION='GZ'

2. 二级索引

Phoenix的二级索引从2.1版本开始支持可变和不可变(数据插入之后不可更新)数据了,之前的版本只支持不可变的数据,我们现在使用的版本是2.2.2是支持二级索引的,我们可以做一些尝试。

可以通过explain select …来看phoniex在执行sql时是否用上了二级索引。


3. 并行

Phoenix会将一个聚合查询分成多个Scan,然后将这些Scan分配给phoenix自定义的hbase协处理器,这些协处理器可以在服务器端并行执行来提高查询性能。平衡的拆分表是Phoenix获得高效查询的最重要因素之一,这包括将相等大小的分区平均分配到不同的region server上。这个工具 添加链接描述可以帮助我们监控hbase表分区的情况。表中的数据在各个region sever上均匀分布可以保证每一个phoenix线程处理的数据量相当,这样就可以减少查询的等待时间。

在客户端可以通过phoenix.query.targetConcurrencyphoenix.query.maxConcurrency 来控制查询如何来拆分扫描。并行查询最好可以将查询scan的切分和表数据的region切分对齐。如果扫描很不均匀,就需要用多个线程来处理数据量较大的分区扫描。

并行执行扫描时的切分点定义如下,我们假设:
t: 是目标的并发数
m: 是最大的并发数
r: 是我们要扫描的分区数

if r >= t 
        使用表的region边界
Else if r/2 > t
    将每个region都拆分成s份,s满足公式: s = max(x)  x满足 s * x < m
Else
    将每个region拆分成s份,s满足公式:s = max(x)  x满足 s * x < t

可以根据客户端机器的内核数和集群的大小,来调大phoenix.query.threadPoolSize, phoenix.query.queueSize, phoenix.query.maxConcurrency, 和 phoenix.query.targetConcurrency的值,允许更多的线程做并行的查询,来降低延迟。

但是这个方法也并非没有限制,最大的问题是phoenix没有足够的信息来拆分region。 如果查询结果跨越很多region,这没有问题,因为region中总会有一些大小相差不多的region,然而如果查询仅仅涉及到少数几个region,可能就会有问题


转自: http://outofmemory.cn/code-snippet/7879/Phoenix-performance-tuning

猜你喜欢

转载自blog.csdn.net/lijingjingchn/article/details/83014926