Phoenix on Hbase应用基础

Phoenix直接建表(推荐,直接通过Phoenix建表,不能使用bulkload,后续备份恢复不方便)

CREATE TABLE NFT:T_COLLECTION_TEST (

a_key VARCHAR PRIMARY KEY, a_col VARCHAR) SALT_BUCKETS = 20;

SALT_BUCKETS 预分区字段,为了解决热点的region问题;范围为1-256。

使用预分区的表不能使用hbase api插入数据得使用Phoenix  API,SALT_BUCKETS主要能提升并发读写性能。

Hbase方式(不推荐)适合通过Hbase API来写入,修改,但是存量数据可以用此方式。

第一步 :

Hbase建表

create '表名',{NAME=>'列族',VERSION=>最大版本数(一般设置为1即可),[MIN_VERSIONS=>最小版本数],[TTL=设置版本存活时间以秒计算],BLOOMFILTER='ROW'或'ROWCOL'} 

hbase(main):>create 't1',{NAME =>'f1', COMPRESSION => 'SNAPPY', VERSIONS => 1,  BLOOMFILTER => 'ROW'},{SPLITS => ['00e1fb4fb0674d24e5a6579f8fe32060','1d148c39d210c886dc02e8468f89a539']}

扫描二维码关注公众号,回复: 15095265 查看本文章

//它还支持lzo和snappy等压缩格式,splits为分割点,用于预分区,分区数的设定依据数据规模(行/列)而定,分割点的采集需要考虑作为rowkey的数据

第二步:Phoenix视图,只能查询不能修改

CREATE view "NFT:T_COLLECTION_TEST"(
"ROW_KEY" varchar primary key,
"info"."chain_id" varchar,
"info"."address" varchar,
"info"."created_at" varchar
)COLUMN_ENCODED_BYTES = 0;   --映射Hbase历史数据


第二步的其他选择 Phoenix映射表(删除表会同步删除Hbase数据,谨慎选择 )

CREATE table "NFT:T_COLLECTION_TEST"(
"ROW_KEY" varchar primary key,
"info"."chain_id" varchar,
"info"."address" varchar,
"info"."created_at" varchar
)COLUMN_ENCODED_BYTES = 0;   --映射Hbase历史数据

Tips 查看分区:scan 'hbase:meta',{FILTER=>"PrefixFilter('table_name')"}

索引:(推荐在写入数据前建索引)

比较难区的为本地索引和全局索引:

简单的定义 :数据量小,更新频繁的优先使用本地索引。数据量大,更新频率低的优先使用全局索引;

全局索引,本地索引不同点 和 比较
直白话:全局索引是表,适合重读轻写的场景 ,会单独写个表
               本地索引是列族,适合重写轻读的场景,
1.索引数据

global index单独把索引数据存到一张表里,保证了原始数据的安全,侵入性小
local index把数据写到原始数据里面,侵入性强,原表的数据量=原始数据+索引数据,使原始数据更大
2.性能方面

global index要多写出来一份数据,写的压力就大一点,但读的速度就非常快,索引也需要分区,用HBAE映射的表需要 手动指定分区数量。
local index只用写一份索引数据,节省不少空间,但多了一步通过rowkey查找数据,写的速度非常快,读的速度就没有直接取自己的列族数据快。

在线方式创建索引:

CREATED INDEX IDX_SLUG_RELATION_DISTINCT

ON NFT.T_COLLECTION_SLUG_RELATION_INFO("info"."CHAIN_ID","info"."COLLECTION_ADDRESS","info"."SLUG","info"."EXTERNAL_SLUG")

INCLUDE("info"."CHAIN_ID","info"."COLLECTION_ADDRESS");  -- 可选 

索引指定分区数
(使用Phoenix建表,索引不指定预分区数时,其默认分区数与表保持一致)
CREATE INDEX idx_name ON TebleName(col1,col2) SALT_BUCKETS=20;

离线异步方式创建索引:

1)create index IDX_T_COLLECTION_SLUG_RELATION_INFO_TEST on NFT.T_COLLECTION_SLUG_RELATION_INFO_TEST(col1, col2) async
2)MR任务:hbase org.apache.phoenix.mapreduce.index.IndexTool --schema NFT --data-table T_COLLECTION_SLUG_RELATION_INFO_TEST --index-table IDX_T_COLLECTION_SLUG_RELATION_INFO_TEST --output-path MapReduce任务写出的目标文件存放的hdfs路径

索引字段要求where条件的查询字段写在on里面 ,对于查询结果字段可以写在INCLUDE里面。
 

查看索引状态

SELECT 
TABLE_NAME -- 表名(索引表也是个表) 
,DATA_TABLE_NAME -- 数据表(我们保存数据的表,不包括索引表,虽然他也存数据)
,INDEX_TYPE -- 索引类型
,INDEX_STATE -- 索引状态  a为正常
,INDEX_DISABLE_TIMESTAMP -- disable的时间 
from system.catalog 
where INDEX_TYPE is not NULL
AND DATA_TABLE_NAME IN (
'T_COLLECTION_SLUG_RELATION_INFO',
'T_COLLECTION_ITEM_RARITY',
'T_COLLECTION_ITEM_INFO',
'NFT.T_NFT_LISTING');

遇到失效的索引直接重建

ALTER INDEX IF EXISTS "IDX_SLUG_RELATION_DISTINCT" on "NFT.T_COLLECTION_SLUG_RELATION_INFO" REBUILD;

序列:

CREATE SEQUENCE use_users_sequence CACHE 1000;   --创建序列 

SELECT sequence_schema, sequence_name, start_with, increment_by, cache_size FROM SYSTEM."SEQUENCE";  --查询所有序列

select next value for use_users_sequence;   --  下一个值

select current value for use_users_sequence; -- 当前序列

DROP SEQUENCE use_users_sequence;   -- 删除序列

UPSERT VALUES INTO use_users(autoid, col1, col2)  VALUES( NEXT VALUE FOR use_users_sequence, '11', '22');  -- 使用序列插入

快照:


1.停止表继续插入

 hbase shell>disable 'NFT:T_COLLECTION_ITEM_INFO'

 enable 恢复表 

2.制作快照
hbase shell> snapshot 'NFT:T_COLLECTION_ITEM_INFO', 'T_COLLECTION_ITEM_INFO_1101_Snapshot'

3.克隆快照为新的名字
hbase shell> clone_snapshot 'T_COLLECTION_ITEM_INFO_1101_Snapshot', 'T_COLLECTION_BAK'

4.删除快照
hbase shell> delete_snapshot 'T_COLLECTION_ITEM_INFO_1101_Snapshot'

5.删除原来表

hbase shell> drop 'NFT:T_COLLECTION_ITEM_INFO'

Tips:

-- 统计数据条数

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'NFT:T_COLLECTION_ITEM_INFO'

--SELECT  COUNT (*) FROM  NFT.T_COLLECTION_ITEM_INFO

猜你喜欢

转载自blog.csdn.net/lansye/article/details/127665742