六、Phoenix常见问题

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 = 时间(毫秒)。

猜你喜欢

转载自blog.csdn.net/lzzyok/article/details/119705101