phoenix的元数据一般存在哪里_phoenix 常见问题与总结(一)

1. 配置环境

使用phoenix,需要修改hbase-site.xml文件,再把phoenix-4.14.1-HBase-1.3-client.jar、phoenix-4.14.1-HBase-1.3-server.jar 放在HBase安装目录的 lib下面(注意版本),重启HBase服务。

Hbase-site文件phoenix 相关修改项如下,仅供参考:

hbase.regionserver.wal.codec

org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec

hbase.master.loadbalancer.class

org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer

hbase.coprocessor.master.classes

org.apache.phoenix.hbase.index.master.IndexMasterObserver

hbase.rpc.timeout

3600000

hbase.client.operation.timeout

600000

hbase.client.scanner.timeout.period

600000

hbase.regionserver.lease.period

600000

phoenix.query.timeoutMs

3600000

phoenix.query.keepAliveMs

600000

hbase.client.ipc.pool.type

RoundRobinPool

hbase.client.ipc.pool.size

10

2. 如何添加二级索引

1) 不加排序:Create INDEX 索引名 ON 表名(列名A,列表B***)

2) 加排序:Create INDEX 索引名 ON 表名(列名A DESC,列表B***)

举例如下:

create INDEX id_idx on tower_info("tower_id" ASC ,"create_time" DESC ,"system","sub_system")

3. 判断某表是否存在

DatabaseMetaData connMetaData = conn.getMetaData();

String[] type = {"TABLE"};

ResultSet rs = connMetaData.getTables(null, null, null, type);

boolean testFlag = false;

while (rs.next()){

String tt=rs.getString("TABLE_NAME");

if(tt.equals("TEST")){

testFlag = true;

}

String tp=rs.getString("TABLE_TYPE");

System.out.println(" 表的名称 "+tt+" 表的类型 "+tp);

}

4. 判断索引是否存在

DatabaseMetaData connMetaData = conn.getMetaData();

ResultSet index = connMetaData.getIndexInfo(null, null,

“表名”, false, true);

boolean toweridIdxFlag = false;

while (index.next()){

String name=index.getString("INDEX_NAME");

if(name.equals("TOWERID_IDX")){

toweridIdxFlag =true;

}

System.out.println(" 索引的名称 "+name);

}

5. 如何加自增主键

a. 创建一张test的表

create table test ("id" BIGINT not null primary key,"tower_id" integer(11));

b. 接着创建自增序列 test_sequence

CREATE SEQUENCE test_sequence START WITH 10000 INCREMENT BY 1 CACHE 1000;

# 创建自增序列说明如下:

CREATE SEQUENCE [IF NOT EXISTS] SCHEMA.SEQUENCE_NAME

[START WITH number]

[INCREMENT BY number]

[MINVALUE number]

[MAXVALUE number]

[CYCLE]

[CACHE number]

参数说明:

sqe_name:序列名

increment:可选子句,表示序列的增量,正数表示生成一个递增的序列,负数表示生成一个递减的序列,其默认值是1.

minvalue:可选子句,决定序列生成的最小值

maxvalue:可选子句,决定序列生成的最大值

start:可选子句,指定序列的开始位置,默认递增序列的起始值为minvalue,递减序列的起始值为maxvalue.

cache:可选子句,决定是否产生序列号预分配并存储在内存中。

cycle:可选关键字,当序列达到最大值或者最小值时,可以继续复位下去;如果是递增系列达到maxvalue,它将又从minvalue继续递增,如果是递减系列达到minvalue,它将从maxvalue继续递减。如果忽略该关键,当其他达到最大值或者最小时仍继续递增/减时将会返回一个错误。

c. 通过自增序列,写入数据信息

upsert into test ("id", "tower_id") values (NEXT VALUE FOR test_sequence,100)

注意事项:

删除test表时,最好连带删除 test_sequence。

# 常用删除

drop TABLE if EXISTS TOWER_INFO(表名)

drop index TOWER_IDX(索引名) ON TOWER_INFO(表名);

DROP SEQUENCE IF EXISTS test_sequence

6. 无缘无故表被 disable, Phoenix 无法查也无法删除

先用HBase命令行启用表,然后再进行删除,或者查询。

enable ‘tablename’

7. Date类型日期,条件判断

select * from test where "create_time" >= TO_DATE(TO_CHAR(?,'yyyy-MM-dd HH:mm:ss'))

7. 其他问题汇总

a. phoenix 使用rowkey模糊查询效率特别低

b. Phoenix中建立hbase的映射表不只是加载元数据,还会为HBase 中每一条数据增加一空列标识,如果数据量太大,可能导致超时中断。建议先建立好Phoenix映射表,然后加载数据或增加服务端配置,延长服务端超时时间。

c. 异步方式构建索引过程中,出现问题:不识别Phoenix中小写字母表,不知是不是版本低的问题。

d. 创建Phoenix二级索引后,只能通过Phoenix接口加载数据,直接操作hbase无效的,也就是说只能通过jdbc和加载CSV文件方式加载数据。

e. 为已有数据phoenix表补建索引,亦可能导致超时中断。建议建立phoenix-HBase表时即建好索引,再接数据。

如有有误之处,请大家积极指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值