目录
一、Hologres
1.1 产品定义
1.2 产品架构
1.3 Hologres基本概念
1.4 最佳实践 - Hologres分区表
1.5 最佳实践 - 分区字段设置
1.6 最佳实践 - 设置字段类型
1.7 最佳实践 - 存储属性设置
1.8 最佳实践 - 分布键设置
1.9 最佳实践 - 聚簇键设置
1.10 最佳实践 - 分段键设置
1.11 最佳实践 - 数据生命周期管理
1.12 最佳实践总结
二、Flink
2.1 产品定义
2.2 Flink架构
2.3 技术架构
2.4 功能架构
2.5 Flink任务自动调优
2.6 最佳实践 - Flink+Hologress实时数仓
2.7 最佳实践 - Flink任务反压
2.8 最佳实践 - Flink任务数据正确性问题处理
2.8.1 场景一:去重
2.8.2 场景二:filter
2.8.3 场景三:结果表主键Update结果不符合预期
2.8.4 场景四:维表JOIN
总结
一、Hologres
1.1 产品定义
阿里云Hologres是一款实时数仓产品,它融合了OLAP和OLTP的能力,能够支持用户进行实时的分析处理。
1.2 产品架构
- Frontend:认证、解析、优化
- Worker Node:计算资源
- HOS:轻量级调度框架
- Shard:数据分片
- Cache:分层精细化缓存
- Resource:容器资源管理
- Store:元数据管理
1.3 Hologres基本概念
名词 | 定义 |
实例 | 在Hologres中,实例(Instance)是您使用和管理数据库存储服务的实体,一个实例可以看作是多个数据库的合集,您对数据库的操作都是在该实例下完成。 |
数据库 | 一个模式的合集,用户所有的操作,包括表、函数等都是在数据库里完成。系统会在用户完成实例申请后默认创建一个“postgres”的数据库,该DB仅用于运维管理,实际业务需要新建DB |
SCHEMA | schema为数据库对象的集合,类似一个文件系统中的目录,实例内的对象如表、函数等都存放于各个schema下,创建数据库成功后,会默认创建一个名叫public的schema |
表 | 表是数据存储单元,分为内部表和外部表 |
内部表 | 指数据存储在Hologres中的表,表中的数据类型可以是Hologres支持的任意一种类型。 |
外部表 | 指在Hologres不存储数据只做字段映射的表,外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引 |
分区表 | 被分割的表称为分区表,表通过明确列出每个分区中出现的键值进行分区,可以理解为分类,通过分类把不同类型的数据放在不同目录。 |
1.4 最佳实践 - Hologres分区表
- 父表按分区键(Partition Key)的值划分为不同的子表,子表对外可见。
- 分区表在使用时,需要提前创建子表。
- 分区表的不同分区子表采用不同的文件存储,查询时带上分区条件,指定所需查询的分区,避免全表扫描,快速定位存储文件,提高处理效率。通常将事实表按照日期划分为不同的分区表。
1.5 最佳实践 - 分区字段设置
使用建议:
- 单表的数据总量较⼤(超过1亿条)时,就需要考虑使用分区表
- 子表下的数据量要适中,通常在3亿~ 10亿条记录之间
- 整个集群的子表总数控制在10万个以内
- 如果您需要经常对某日数据进行整体替换,执行truncate操作,建议使用分区表
使用说明:
- 分区表的创建依然兼容Postgres语法,分区表方便用户管理数据,并能通过分区裁剪加快数据的查找。
- 不能向父表插入任何数据。
- 只有 TEXT/VARCHAR/INT 类型才能作为分区键。如果按天/小时分区要把日期存为TEXT格式。
- partition by 类型仅支持 list,切分 partition list 只能有一个值。
- 分区父表和子表必须要在同一个Schema。
- 若是表有主键,分区键必须是主键的一个子集。
- 分区表的数据不会自动删除,需要用户自己管理生命周期。
- 分区表太小,查询加速效果不明显,可以选择较大粒度的分区。
1.6 最佳实践 - 设置字段类型
- 尽量选用存储空间小的类型。
- 优先使用INT类型,而不是BIGINT类型。
- DECIMAL的精度尽量小。
- Group By的列不建议使用Float类型。
- 优先使用TEXT,而不是VARCHAR(n)和CHAR(n),n的取值尽量小。
- 日期类型使用TIMESTAMPTZ、DATE,避免使用TEXT。
- 使用一致的数据类型。
- 进行多表关联时,不同列尽量使用相同的数据类型。避免Hologres将不同类型的列进行隐示类型转换,造成额外的开销。
- UNION或Group By等操作使用DECIMAL类型。
- UNION或Group By等操作暂不支持DOUBLE PRECISION和FLOAT数据类型,需要使用DECIMAL类型。
1.7 最佳实践 - 存储属性设置
- 在Hologres中表默认为列存(column store)形式。列存对于OLAP场景较为友好,适合各种复杂查询、数据关联、扫描、过滤、统计。
- 行存对于key-value场景比较友好,适合基于primary key的点查和扫描scan。
- 列存会默认创建更多的索引,包括对字符串类型创建bitmap索引,这些索引可以显著加速查询过滤和统计,因此列比较多的表,会占用更多的存储空间,您可以通过关闭这些默认创建的索引,释放空间。
- 行存默认仅对主键创建索引,仅支持主键的快速查询,因此使用的存储空间更少,但使用场景也受到限制。
- 从HologresV1.1版本开始支持行列共存的格式。行列共存是同时具备了上述的能力,即支持高效点查也支持OLAP分析,