延庆上海网站建设网络规划设计师备考心得
目录
一、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分析,
 
