Loading

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,需要对主键对散列有一个很好的规划

posted @ 2020-10-22 11:00  猫熊小才天  阅读(179)  评论(0编辑  收藏  举报