Phoenix
date: 2020-06-16 10:03:00
updated: 2020-07-08 11:15:00
Phoenix
1. phoenix-sqlline
退出 !quit
!exit
列出metadata信息 !dbinfo
查看当前库中存在的表 !tables
phoenix中的表信息都存在SYSTEM.CATALOG表中,也可以通过下面的sql语句查看系统的表信息 select * from SYSTEM.CATALOG;
主键信息保存在元数据表的 key_seq 列。可以通过
!set maxWidth 10000
来显示所有的列
如果不加双引号,会自动将小写转为大写
phoenix/hbase对表名、字段名都是大小写敏感,如果直接写小写字母,不加双引号,则默认会被转换成大写字母
删除表 drop table 库.表;
查看表结构 !describe "METRIC_AGGREGATE"
创建表 create table if not exists 库.表(id integer primary key,name varchar(20));
插入&更新 upsert into 库.表(id,name) values(1,'zhangsan');
CREATE TABLE IF NOT EXISTS TEST4PHOENIX.testdata (
tag_id char(10) NOT NULL,
user_id char(10) NOT NULL,
val char(10),
update_time char(30),
CONSTRAINT pk PRIMARY KEY (tag_id, user_id)
);
2. 预分区
HBase 默认分区规则
memstore.flush.size=128MB
max.store.size=10G
分区规则:Min(R^2 * "hbase.hregion.memstore.flush.size", "hbase.hregion.max.filesize")
第一次拆分大小为:min(10G,11128M)=128M // 一开始的时候就一个region,当数据量达到128M时,会一分为二,变成2个region,然后会往第二个region里写数据,但是第一个不会写,处于半满状态 => 之前分裂的region都不会再被写入数据,处于半满状态
第二次拆分大小为:min(10G,33128M)=1152M
第三次拆分大小为:min(10G,55128M)=3200M
第四次拆分大小为:min(10G,77128M)=6272M
第五次拆分大小为:min(10G,99128M)=10G
第五次拆分大小为:min(10G,1111128M)=10G // 最大是10G
phoenix 自定义分区
如果指定了 SALT_BUCKETS=N,那么就会通过 hash(rowkey) % SALT_BUCKETS 划分成 N 个region。SALT_BUCKETS 取值为1到256。实现原理是会在row_key的byte数组的第一个字节位置设定一个系统生成的byte值,byte值 = hash(rowkey) % SALT_BUCKETS,这样就可以划分到不同region里。
如果指定了 SPLIT ON("a","b","c"),就会将rowkey划分到 空——a、a——b、b——c、c——无穷 这四个分区里。
如果同时指定了 SALT_BUCKETS=N 和 SPLIT ON("a","b","c"),会根据N拿到散列值,然后同散列值去SPLIT ON指定的分区规则里查询,放入到对应的分区里。
SALT_BUCKETS + SPLIT ON 通过散列+分区的方式,在 RowKey 的前面拼接通过 hash 生成的随机字符串,可以生成范围比较随机的 RowKey,可以比较均衡分散到不同的 Region 中。
但是可能会存在极限情况:加盐产生的散列数,都集中到某几个分区中,导致热点问题,所以如果要用到 split_on,需要对主键对散列有一个很好的规划