我们回顾下,Hologres是一款实时HSAP产品,隶属阿里自研大数据品牌MaxCompute,兼容 PostgreSQL 生态、支持MaxCompute数据直接查询,支持实时写入实时查询,实时离线联邦分析,低成本、高时效、快速构筑企业实时数据仓库(Real-Time Data Warehouse)。具备如下优势:
说明 |
|
分析服务一体化 |
|
以实时为中心设计 |
|
计算存储分离 |
|
丰富生态 |
|
接下来,我们介绍下Hologres的使用。
支持如下方式:
1、DataWorks数仓开发
2、HoloWeb
3、PSQL客户端
4、JDBC
5、Python(使用psycopg2模块访问Hologres)
6、其他工具(Navicat、DBeaver、DataGrip等)
基于Dataworks开发,参考:如何在DataWorks上使用Hologres、如何绑定Hologres引擎,细节:
DataWorks绑定hologres引擎 ==> 独享资源组、依赖独享调度资源组。
Dataworks绑定后,即可在DataStudio开发相关任务流程,详情请参见绑定Hologres实例。如下:
功能介绍:
1、DI离线同步:数据源数据 <--> Holo
2、RI实时同步:数据源数据 <--> Holo
3、Hologres SQL
4、一键MaxCompute表结构同步:批量创建Hologres外部表
5、一键MaxCompute数据同步:导入MaxCompute数据至Hologres
其他:dataworks可以连接hologres,并操作hologres外表方法:
1、holo创建内部表
2、mc创建外部表 关联DataWorks
问题:大数据计算MaxCompute的计算资源还是holo的?
在MaxCompute中创建Hologres外部表,在MaxCompute中做计算,用的是MaxCompute计算资源。
功能介绍:
1、元数据管理:数据管理模块提供对Hologres引擎对象(包括实例、数据库、schema、表、视图等)的管理功能
2、SQL编辑器:提供标准SQL开发界面。
3、诊断与优化:提供实例级别的运维管控能力。
4、数据方案:提供数据接入能力。
5、安全中心:提供用户管理、DB管理、资源组管理
属于同一网络可以连通。
参考:如何通过YonghongBI工具连接Hologres并进行数据分析
1、数据地图(Beta)集成,参考:如何在数据地图中配置Hologres元数据采集器
2、数据血缘,参考:如何在DataWorks的数据地图中查看数据血缘信息
参考:Hologres开发规范
hologres兼容PostgreSQL生态,因此也有模式相关概念如下图所示:
Hologres的Schema功能:
如何理解Schema?
使用模式的优势:
提示:
1、可以用于 OLAP表权限管理
如果其他用户想访问某个schema下的对象,则该schema的owner必须赋予其他用户的usage权限,如果需要做其他操作也需要赋予相应的权限在默认情况下,所有人都拥有在public模式上的CREATE和USAGE权限。
2、业务线隔离
3、数仓分层隔离
begin;
create table [if not exists] [schema_name.]table_name ([
{
column_name column_type [column_constraints, [...]]
| table_constraints
[, ...]
}
]);
call set_table_property('', property, value);
comment on column is 'value';
comment on table is 'value';
commit;
-- 给表增加注释
COMMENT ON TABLE table_name IS 'my comments on table table_name.';
-- 给列增加注释
COMMENT ON COLUMN table_name.col1 IS 'This my first col1';
-- 给外部表增加注释
COMMENT ON FOREIGN TABLE foreign_table IS ' comments on my foreign table';
设置默认值
smallint_col smallint DEFAULT 0,
内部表数据存储在Hologres数据库中,支持设置:
相关语法:
-- 建表时开启
call set_table_property('test_message_src', 'binlog.level', 'replica');--设置表属性开启Binlog功能
call set_table_property('test_message_src', 'binlog.ttl', '86400');--binlog.ttl,Binlog的TTL,单位为秒
查询binlog
select hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* from test_message_src;
场景:各类高性能要求的OLAP分析、点查询、实时链路
Hologres的分区表必须提前创建好分区,不能用查询语句的值动态生成分区表。
Partition Table,也叫分区表。父表按分区键(Partition Key)的值划分为不同的子表,子表对外可见。
语法:
使用:
性能:
场景:
支持创建MaxCompute、OSS、DLF、Hologres类型的外部表,使用限制如下:
语法:
场景:
Hologres支持三种表存储格式,分别为:行存、列存和行列共存。通过如下进行设置:
call set_table_property('', 'orientation', '[column | row | row,column]');
建表时默认为列存(column storage)形式。
使用建议:
各类存储格式总结:
1、列存(OLAP查询场景)
2、行存(点查询)
说明:
1、行存,数据按照Key有序分块压缩存储,并且通过Block Index、Bloom Filter等索引,以及后台Compaction机制对文件进行整理,优化点查查询效率。
2、行存表非常适用于基于PK的点查场景,能够实现高QPS的点查。同时建表时建议只设置PK,系统会自动将PK设置为Distribution Key和Clustering Key,以提升查询性能。不建议将PK和Clustering Key设置为不同的字段,设置为不同的字段会有一定的性能牺牲。
3、行列共存(同时用于主键点查、OLAP查询)
time_to_live_in_seconds
指定了表数据的生存时间,单位为秒,必须是非负数字类型
表数据的TTL并不是精确的时间,当超过设置的 TTL 后,系统会在某一个时间自动删除表数据,所以业务逻辑不能强依赖 TTL
begin;
create table tbl ( a int not null,b text not null) ;
call set_table_property( 'tbl', 'time_to_live_in_seconds ', '3.14159');commit;
主键Primary Key(简称PK)与传统数据库主键特性一致,是表中记录的唯一标识,代表了表数据的唯一性。语法:
PRIMARY KEY (id,age)
原理:
总结:
1、主键用于文件间或内数据记录排序(行表、行列表)。
2、行存表必须设置主键,行列共存表必须设置主键,列存表不要求有主键。场景:
3、尽量选择含有实际业务意义的字段,不建议将Serial类型的字段设置为主键,因为Serial类型在写入的时候是表锁,导致写入性能有损失,且随着数据的增长,长度容易溢出。
Distribution Key属性指定了表数据的分布策略,系统会保证Distribution Key相同的记录被分配到同一个Shard上。
call set_table_property('', 'distribution_key', '[[,...]]');
原理:
总结:
1、分布键作用于文件数据分配。
2、如何设置使用:
3、要求:
4、技巧:
Event Time Column -- Segment Key 指定文件排序,语法如下:
call set_table_property('', 'event_time_column', '[ [,...]]');
原理:设置了Event_time_column(Segment Key),系统将文件基于Segment Key范围排序后,选择Segment Key范围相邻的文件进行合并,减少文件之间的重叠,这样就使得查询时能够过滤掉尽可能多的文件,从而提升查询效率。
总结:
1、作用于文件排序(列表)
2、如何设置使用:
3、对以下场景进行加速:
Hologres会按照聚簇索引在文件内对数据进行排序,建立聚簇索引能够加速在索引列上的范围和过滤查询,语法:
call set_table_property('', 'clustering_key', '[{:asc} [,...]]');
对于行存表,Clustering Key默认为主键
总结:
1、作用于文件内的数据排序(列表)
2、场景:
适用于点查以及范围查询的场景,对于过滤操作有比较好的性能提升,如where a = 1或者where a > 1 and a < 5的场景加速效果比较好
3、如何设置使用:
3、技巧:
在Hologres中,bitmap_columns属性指定位图索引,是数据存储之外的独立索引结构,以位图向量结构加速等值比较场景,能够对文件块内的数据进行快速的等值过滤,适用于等值过滤查询的场景。语法:
call set_table_property('', 'bitmap_columns', '[{:[on|off]}[,...]]');
原理:
系统会将列对应的数值生成一个二进制字符串,用于表示取值所在位置的Bitmap,当查询命中Bitmap时,会快速定位到数据所在的行号(Row Number),从而快速过滤出数据,对于以下场景需要注意事项如下:
总结:
1、作用于文件内定位(行列共存表)
2、场景:
适用于等值过滤查询的场景
3、如何设置使用:
4、技巧:
执行计划结果中有Bitmap Filter算子,说明命中Bitmap索引。
5、Bitmap和Clustering Key的区别:
字典编码可以将字符串的比较转成数字的比较,加速Group By、Filter等查询。语法
call set_table_property('', 'dictionary_encoding_columns', '[{:[on|off|auto]}[,...]]');
原理:Dictionary Encoding是一种压缩存储的技术,系统会将原始数据编码为数值类型存储,同时也会维护对应的编码表结构,在数据读取时,会根据编码表进行数据解码操作,因此在字符串比较的场景中,尤其是对基数小的列,有加速作用,常用于Group By、Filter等过滤查询场景中。
Hologres V0.9及之后版本中默认取值auto,当表有数据写入时,如果字段里数值的重复度大于等于90%,那么系统就会对该字段开启字典编码
总结:
1、作用于文件内编码存储(列存、行列共存表)
2、场景:
适用于等值过滤查询的场景
3、如何设置使用:
4、技巧:
执行计划结果中有Bitmap Filter算子,说明命中Bitmap索引。
5、Bitmap和Clustering Key的区别:
Hologres是兼容PostgreSQL生态,建表语法与PostgreSQL相同,但是索引与PostgreSQL不同.
索引 |
适用场景 |
示例查询语句 |
Distribution Key |
适合于频繁进行Group By的列或者多表Join时的Join字段设置为Distribution Key,能够减少数据Shuffle,实现Local Join的能力。 |
select * from tbl1 join tbl2 on tbl1.a=tbl2.c; |
Clustering Key |
将范围查询或Filter查询列作为聚簇索引列。索引过滤具备左匹配原则,建议设置聚簇索引列不要超过两列。 |
select sum(a) from tb1 where a > 100 and a < 200; |
Bitmap |
将等值查询列作为Bitmap列。 |
select * from tb1 where a =100; |
Event Time Column(原Segment_Key) |
适用于将日志、流量等和时间强相关的列设置为Segment_Key。 |
select sum(a) from tb1 where ts > '2020-01-01' and a < '2020-03-02'; |
设置判断流程图:
在Hologres中,可以通过set_table_property命令为表设置多种属性,合理的表属性设置可以有助于系统高效地组织和查询数据。与数据存储布局有关的参数需要和建表语句同时执行。
call set_table_property('', property, value);
总结:
orientation、distribution_key、clustering_key、event_time_column属性决定了数据写入后的存储布局,因此建表后不支持更改,如需修改,需要重新建表;bitmap和dictionary属性不影响数据存储布局,可以在建表后按需更改。
1、SELECT语法:
2、insert语法:
3、COPY 文件导入导出
4、DELETE删除数据
5、UPDATE
6、TRUNCATE
7、事务
Hologres支持完整的DDL事务以及部分DML事务,默认支持单条SQL事务。
场景:
8、函数
9、跨库查询
使用 JOIN 操作。可以使用 JOIN 操作将两个或多个 Hologres 库连接起来,并在两个库之间进行数据查询。
使用 UNION 操作。可以使用 UNION 操作将两个或多个 Hologres 库中的表进行合并,并形成一个新的表。
使用 CROSS JOIN 操作。可以使用 CROSS JOIN 操作将两个或多个 Hologres 库中的所有表进行笛卡尔积,并形成一个新的表。
1、通过DataWorks数据集成将SLS数据写入Hologres
如何将SLS数据实时写入至Hologres_实时数仓Hologres-阿里云帮助中心
2、LogHub(SLS)实时ETL同步至Hologres
如何使用LogHubSLS实时同步至Hologres任务_大数据开发治理平台 DataWorks-阿里云帮助中心
支持2种方式:
推荐:数据集成 -> 同步任务
实时读LogHub(SLS),元数据字段
元字段了解:
建表:
BEGIN;
CREATE TABLE dsp_sls_ri (
C_time TEXT,
C_Source TEXT,
C_Recevie_time TEXT NOT NULL,
content TEXT,
dateTime TIMESTAMP NOT NULL,
PRIMARY KEY (content)
);
call set_table_property('dsp_sls_ri', 'orientation', 'column');
call set_table_property('dsp_sls_ri', 'event_time_column', 'dateTime');
-- 存储3天
call set_table_property( 'dsp_sls_ri', 'time_to_live_in_seconds ', '259200');commit;
COMMIT;
提示:
1、不加PRIMARY KEY会报错
2、三个时间的差别:
性能观察:
类别 |
||
数据集成独享资源组 |
资源情况:35% |
|
同步情况 |
偶尔延迟3.75s,同步字节数:77kb/s |
|
Holo资源消耗 |
CPU:22.35%,内存:30% |
重新配置,更新应用设置位点。
虽然,这里的位点没有到毫秒,但是重新启动时,不会重复拉取。
结论:实时不能跨账号,不进行后续测试。
两种方式:
1、通过离线节点完成数据同步
2、通过外部表完成
提示:
1、仅支持单表同步
通过外部表方式:将Holo内部表数据写入 MC内部表
-- 1、MC创建内部表
CREATE TABLE dw_spm_markactivity_detail_di (
...
)PARTITIONED BY (ds STRING)
;
-- 需要提前创建分区,否则会报错
alter table dw_spm_markactivity_detail_di add if not exists partition (ds='20231112');
-- 2、Holo创建内部表
-- 3、Holo创建外部表
BEGIN;
CREATE FOREIGN TABLE public.odps2dw_spm_markactivity_detail_di (
dw_gmt_create timestamp with time zone,
spm_time text,
...
ds text,
)
SERVER odps_server OPTIONS (
project_name 'DSP_DW_DEV',
table_name 'dw_spm_markactivity_detail_di'
);
END;
-- 4、写入MC
INSERT INTO odps2dw_spm_markactivity_detail_di
SELECT *,'20231112' FROM dw_spm_markactivity_detail_di;
注:
1、需要提前创建MC的分区,才可以导入
2、4语句可以使用DataWorks调度
注意:不支持跨账号执行
建议只执行DDL,如果需要执行DML语句,请前往MaxCompute进行操作。
在MaxCompute中,通过外部表访问Hologres的表。
说明:在运行时,MaxCompute会通过JDBC接口,批量拉取Hologres对应表的所有数据到MaxCompute的查询作业中,会占用较多连接和计算资源,应避免在高并发场景使用外表查询。
应用场景:
限制:
案例:
create external table if not exists customer
(
c_custkey bigint NOT NULL,
c_name string NOT NULL,
c_address string NOT NULL
)
stored by 'com.aliyun.odps.jdbc.JdbcStorageHandler'
location 'jdbc:postgresql://hgpostcn-cn-g4t3fc54t007-cn-beijing-internal.hologres.aliyuncs.com:80/holo_tutorial?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=customer/'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
'odps.federation.jdbc.colmapping'='c_custkey:c_custkey,c_name:c_name,c_address:c_address'
);
-- 开启直读模式
set odps.table.api.enable.holo.table=true;
select * from customer limit 10;
-- 案例2:Holo外部表与MC内部表联合查询
set odps.table.api.enable.holo.table=true;
SELECT t1.* ,t2.*
FROM (
select * from customer
)t1
FULL JOIN (
select * from test
) t2
on t1.c_custkey = t2.id
创建方法:
1、HoloWeb -> 元数据管理 -> MaxCompute加速
2、Dataworks -> DataStudio -> Hologres一键表结构导入
3、Dataworks -> Holo Studio -> 一键MaxCompute表结构同步
4、在Holo中执行建表语句
CREATE FOREIGN TABLE public.spm_log_di (
spm_time text,
app_id text,
app_ver text
)
SERVER odps_server OPTIONS (
project_name 'bigdata_spm_produce',
table_name 'spm_log_di'
);
COMMENT ON FOREIGN TABLE public.spm_log_di IS 'ods-埋点日志-天增量表';
COMMENT ON COLUMN public.spm_log_di.spm_time IS '事件触发时间';
COMMENT ON COLUMN public.spm_log_di.app_id IS '产品id';
COMMENT ON COLUMN public.spm_log_di.app_ver IS '产品版本';
-- 清理写入文件
vacuum nation;
-- 收集表的统计信息
analyze nation;
-- 针对非主键的JOIN KEY收集统计信息
analyze lineitem (l_orderkey,l_partkey,l_suppkey);
analyze orders (o_custkey);
规格:32CU, 100g,数据量:1500w条,对hologres的性能消耗变化:
-- 查最近一次Analyze的信息,根据analyze_timestamp排序即可。
SELECT schema_name, -- 表的Schema
table_name, -- 表名称
schema_version, -- 表的版本
statistic_version, -- 最近一次ANALYZE的统计信息版本
total_rows, -- 最近一次ANALYZE的行数
analyze_timestamp -- 最近一次ANALYZE的结束时间
FROM hologres_statistic.hg_table_statistic
WHERE table_name = ''
ORDER BY analyze_timestamp DESC;
Fixed Plan是Hologres独有的执行引擎优化方式,实现SQL执行效率的成倍提升,是支持高吞吐实时写入,高并发查询的关键优化方法
在Hologres中,默认走Fixed Plan的场景如下:
优化器(Query Optimizer,QO)会为每一条SQL生成一个执行计划,执行引擎(Query Engine,QE)会根据该执行计划生成最终的执行计划,然后执行并获取SQL结果。
参考:如何在Hologres中查看Explain和ExplainAnalyze
元仓- 慢Query查询与分析
元仓-表统计信息查看与分析
连接与SQL - Query管理
连接与SQL - 连接数管理
连接与SQL - 锁以及排查锁
连接与SQL - 查看Worker倾斜关系
参考:性能调优
参考:实时数仓Hologres实例规格介绍
Hologres版本升级:标准升级和热升级。 ===> 阿里通知
类别 |
升级支持 |
备注 |
场景 |
普通实例 |
支持标准升级(停服升级)、热升级 |
||
主从实例 |
支持标准升级(停服升级)、热升级 |
主从实例读写分离(共享存储) |
|
共享集群 |
支持标准升级(停服升级) |
Hologres共享集群(湖仓加速版)是原共享集群(MaxCompute BI加速)的升级版本 |
数据存储于MaxCompute 查询数据频率低、延时要求低的场景。 |
实例升配\降配,==> 自主操作
升配计算资源期间实例不可用,通常需要2-5分钟,请您耐心等待。请尽量在业务低峰期执行,建议应用具备重连机制。
使用技巧:
1、Holo版本升级会造成5~10分钟服务不可用,升配与降配,实例不可用,通常需要2-5分钟
2、小版本可配置自动升级 ---> 一般情况下关闭,防止因升级造成5~10分钟不可用
3、实例(升、降),尽量在业务低峰期执行
Hologres用户鉴权流程:
RAM鉴权:
授予阿里云提供的权限管理系统。RAM主要的作用是控制账号系统的权限,您可以通过RAM授权为不同的子账号分配不同的权限,包括实例购买、删除、升配、降配、修改网络类型、查看实例信息等权限,从而达到实例管理的目的。
Hologres鉴权
在使用Hologres实例进行开发之前,会经过如下几个层级的鉴权:
1、账号鉴权:(包括阿里云账号和RAM用户)、JDBC连接需要AccessKey ID及AccessKey Secret
2、用户鉴权:管理员执行了create user "xxx"命令,用户才会被创建进实例
3、实例鉴权:用户被创建进实例后,还需要被授予相关的操作权限,才能在权限范围内进行操作。
DataWorks鉴权
MaxCompute鉴权:
tips: 可通过执行select * from pg_user;命令查看当前实例的Superuser。
当一个阿里云账号连接Hologres时,需要被创建成为Hologres的用户(管理员需要执行create user "xxx",否则会报错role "xxx" does not exist),才能连接成功。用户属于实例级别,所以添加用户和删除用户相当于把用户创建进实例中或者从实例中删除。
有三种:
关于RAM用户授权:
具体参见:主账号如何使用权限模型授予RAM用户权限
建议使用Schema级别的简单权限模型,简单分为:
具体参见:在Hologres中基于Schema级别的简单权限模型
单实例有2种方式:
1、计算组隔离(Beta):通过为不同业务场景分配不同计算组
2、资源组隔离(Beta):通过为不同的用户账号分配不同的计算资源(即CU,包括CPU和内存),限制用户使用计算资源的上限,实现单实例多负载的隔离,保证了用户之间、应用之间作业的互不影响。
其他问题:
1、实时数仓 Hologres实例内的多个数据库,资源是抢占的吗?能隔离吗?
抢占的,实例内的多个数据库共享资源
1、备份与恢复(自动周期性快照、手动快照)
2、数据迁移
3、存储优化(数据分层存储(冷、热),动态管理)
4、单个实例最多可创建64个数据库。
1、支持单指标、多指标组合监控模式
2、报警级别:
3、集成在云监控里面
4、默认建议配置告警:
支持如下指标及必要性分析:
分类 |
指标 |
分析 |
实例 |
主从实例同步延迟(毫秒) |
单实例不需要 |
CPU |
CPU水位 |
需要 |
Work节点CPU使用率 |
32CU有2个work,可以用于调优的告警 建议设置组合(CPU + WorkCPU) |
|
IO |
低频IO读\写 |
不需要 |
IO读\写 |
需要 |
|
内存 |
内存水位 |
需要 |
work节点内存使用率 |
32CU有2个work,可以用于调优的告警 建议设置组合(内存+ WorkCPU) |
|
存储 |
存储已用容量 |
- |
存储水位 |
需要 |
|
连接数 |
连接数 |
需要 |
连接数使用率 |
||
FE连接数 |
需要 |
|
SQL总连接数 |
||
数据写入 |
实时写入RPS |
|
每秒实时写入记录数 |
||
数据查询 |
每秒失败查询数 |
|
正在运行Query持续时长 |
||
Query延迟 |
非必要 -对重要业务进行监控 |
|
DML |
Delete语句QPS |
|
Delete语句响应时间 |
||
Delete语句响应时间 |
慢SQL处理 |
|
每秒Delete记录数 |
||
Insert语句QPS |
||
Insert语句响应时间 |
慢SQL处理 |
|
每秒Insert记录数 |
||
Select语句QPS |
业务并发处理 |
|
Select语句响应时间 |
慢SQL处理 |
|
Update语句QPS |
||
Update语句响应时间 |
||
每秒Update记录数 |
1、CPU水位
规则:CPU水位连续3次>=99% Info(每次间隔5分钟)
2、内存水位
内存水位连续3次>=90% Warning(每次间隔5分钟)
1、连接数使用率
说明:一般连接数在总连接数的95%以下都算安全。
规则:连接数使用率(Info)连续3次>=95就报警
1、P99延迟
SQL语句从提交到返回的过程中,Hologres引擎处理99%查询语句的时间。
响应时间异常性变大反映出系统可能有慢Query的趋势,可能会影响下游业务处理。
例如您是持续服务型应用,平常的正常延迟都在1s以内,那么响应时间突然到5s或10s,就不太正常,需要告警出来,偶尔到1.2s,1.5s,则正常。
例如您是分析性应用,根据不同业务人员的需求,查询的大小、响应时间都不尽相同,那么就需要根据自己的场景进行设置。
2、Query QPS
当QPS突然降到很低,或者为0时,如果不是业务有意停止,那么可能意味着系统有异常。
(推荐)Query QPS明细 |
实例每秒SQL语句执行数。 |
SELECT语句QPS |
实例每秒SELECT语句数。 |
INSERT语句QPS |
实例每秒INSERT语句数。 |
UPDATE语句QPS |
实例每秒UPDATE语句数。 |
DELETE语句QPS |
实例每秒DELETE语句数。 |
规则设置为:QPS连续3次<=(A*0.8) Warning(每次间隔5分钟)
实时写入RPS
有持续的外部数据导入(通过Flink/数据集成等等)时,往往有持续的实时导入RPS(Record Per Second)指标。RPS突然降到很低,或者为0时,如果不是作业有意停止,那么可能意味着系统有异常。
设置告警为:RPS(cmdType=sdk)连续1次<=10 Warning
实例CPU使用率
Worker节点CPU使用率
计算内存:
Hologres把计算内存分为了三块:
实例内存使用率说明:
Worker节点内存使用率