1、如何预切割表
预切割表指通过指定切割值,进而指定每个预分区的region的分割点,有效避免单点过热的问题。
create table test
(id integer primary key,
name varchar,
age integer,
address varchar) split on (10, 20, 30, 40)
#split后为切割点
上面将创建5个region,其rowkey的范围为:
Region 1 : row key 的前两位是 min~10
Region 2 : row key 的前两位是 10~20
Region 3 : row key 的前两位是 20~30
Region 4 : row key 的前两位是 30~40
Region 5 : row key 的前两位是 40~max
2、指定压缩,提升大表性能
create table test
(id integer primary key,
name varchar,
age integer,
address varchar) split on (10, 20, 30, 40),COMPRESSION='GZ'
#split后为切割点
3、应用使用Phoenix JDBC连接池吗?
不建议使用连接池,Phoenix的连接对象不同大部分的JDBC连接,原因在于底层是Hbase的连接。Phoenix连接对象在设计时就是为了更精细便宜的代价去创建。如果Phoenix的连接被再利用,底层的HBase连接可能并不总是由前一个用户保持在健康状态。更好的方式是去创建一个新的Phoenix连接,保证避免潜在的问题。
4、写入优化
当使用upsert 去写入大数据量,以关闭自动提交并以较小批量提交。
try (Connection conn = DriverManager.getConnection(url)) {
conn.setAutoCommit(false);
int batchSize = 0;
int commitSize = 1000; // 每一批提交数.
try (Statement stmt = conn.prepareStatement(upsert)) {
stmt.set ... while (there are records to upsert) {
stmt.executeUpdate();
batchSize++;
if (batchSize % commitSize == 0) {
conn.commit();
}
}
conn.commit(); // commit the last batch of records
注意:通过thin客户端,使用executeBatch()非常重要,因为将最小化客户机和查询服务器的rpc数量
5、减少RPC交互
phoenix在表设计时,有一个表级别的参数UPDATE_CACHE_FREQUENCY ,该值默认是always,表示每次sql查询都会先去请求meta数据,这样增加了请求的压力,对性能有一定的影响。
建议在创建表时指定该参数多久同步一次,如
CREATE TABLE IF NOT EXISTS test_user (
id VARCHAR NOT NULL PRIMARY KEY,
username VARCHAR ,
phoen VARCHAR ,
addr VARCHAR,
times bigint) UPDATE_CACHE_FREQUENCY = 900000;
#客户端应每15分钟检查表或其统计信息的更新
#修改已有表
alter table 表名 set UPDATE_CACHE_FREQUENCY = 时间(毫秒)。