MPP 分析型数据库产品。
基于Doris 0.15 -1.0
MPP Massively Parallel Processing 大规模并行处理。
简介特性 安装部署
海量数据分析
高性能架构背后原理
Doris 企业实战 应用。
核心 特性
列式存储
基于MPP大规模并行处理 架构的分析型数据库。
PB级数据 毫秒/秒级响应
支持标准SQL语言 兼容MySQL协议
高效的聚合表技术,新型预聚合 技术RollUp
高性能高可用 高可靠
极简运维弹性伸缩。
2008 Doris 1–2012–2009- 2012-2013Palo1.0
OLAP / OLTP
OLTP: 面向 业务 面向 应用支撑业务。
OLAP 多维分析,支持管理决策。
OLAP 引擎分类:
MOLAP:基于多维数组 的存储模型 预计算Cube。Kylin Druid
ROLAP:基于关系型数据库 存储数据 Doris
HTAP:混合模型 细节以ROLAP 存放,聚合数据以MOLAP存放 相对灵活。 TIDB。
Hybrid Transactional(混合事务)/Analytical Processing(分析处理)的简称
分类总结:
Doris 灵活多维分析。明细+聚合 主键更新。
不同类型OALP的引擎对比
FE BE
Tablet:一张表实际的物理存储单元,一张表按照分区和分桶后在BE构成分布式存储层中以Tablet为单位进行存储,每个Tablet 包括元信息 及若干连续的RowSet
RowSet: Tablet 中一次数据变更的数据集合,数据变更包括数据导入,删除更新等RowSet 按照版本信息进行记录,每次变更会生成一个版本。
Version : Start +End 两个属性。 维护数据变更的记录信息。表示RowSet 的版本范围 一次新导入后生成一个Start。End相等的RowSet。在Compaction后生成一个带范围的RowSet版本。
Segment:
表示RowSet 中数据的分段 多个Segment构成一个RowSet
Compaction: 连续版本RowSet 合并的过程称为Compaction 合并过程会对数据进行压缩。
架构
Doris =Google Mesa + Impala +ORC 列式存储。
Mesa:
Aggregate Data Model。Versioned Data Management
Predix Index Online Schema Change
Impala
Query Engine
ORC: 存储格式 编码和压缩
Data Region
Index Region
Footer
Mesa: 满足存储 需求 但是本身不提供SQL查询引擎
Impala: MPP SQL查询引擎 缺少分布式存储
自研列式存储:存储目录按照分同组织,分桶目录下存放具体的Tablet 按照tablet_id 命名子目录。
极简架构: FE。BE
编译部署Docker
安装Docker,编译实现,
安装FE BE Broker 。
元数据 结构:
Doris 采用Paxos 协议 以及Memory+Checkpoint+Journel机制来保证元数据的高性能及高可靠。
首先写入磁盘的日志文件中。
然后再写到内存中
最后定义checkpoint到本地磁盘
数据分发:
多副本存储 自动数据迁移 副本均衡
BE节点要先在FE中添加才能启动
BE的扩容和缩容:
扩容:Doris 会根据负载情况,进行数据均衡,期间不能使用
缩容:DROP 和DECOMMISION。
DROP BACKEND 会直接删除BE 并且其上的数据将不能再恢复
DECOMMISION:删除节点之前会进行数据迁移。完成后再进行节点移除。
不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于 isDecommission 为 true 的状态。
Broker 是访问外部数据源的进程。
Broker 扩容缩容:
Broker 是无状态进程 可以随意启停,停止后 上面运行的作业会失败,重试即可。
进程是BrokerBootStrap
broker 也需要添加。
生产环境所有进程 都用的是守护进程。
安装Observer :Leader+Follower。
####Doris 数据分析实战
创建用户和数据库。 并赋权限 读写权限。
创建表
tablet partition
建表语法和数据类型
单分区 和符合分区
单分区 即数据不进行分区 只做HASH分布 就是分桶。
复合分区:
第一级成为Partition 即分区, 只支持整型和事件类型的列。
第二级为Distribution 即分桶
数据模型 聚合模型https://github.com/apache/doris/wiki/Data-Model,-Rollup-&-Prefix-Index
Partition 是逻辑上最小的管理单元,Tablet 是数据移动复制等操作的最小物理存储单元。
单分区
agggregate key ~ distributed by hash(~) buckets
properties( “~” = "')
数据导入:
streamLoad HTTP协议请求并携带原始数据创建导入 主要用于快速将本地文件或数据流中的数据导入到Doris
导入命令同步返回结果。
Insert
Insert into select
insert into values。
所有导入方式都支持 csv 数据格式,Broker load 还支持parquet 和orc
curl :
复合分区
RANGE 分区左闭右开。
应用场景:
有时间维度或类似带有有序值的维度
历史数据删除要求保留最近N天的数据
解决数据倾斜的问题:每个分区可以单独指定分桶的数量
数据导入Broker Load
导入外部数据源系统的数据。
DUPLICATE KEY()
broker load csv ----->>>>
导入HDFS–导入数据的失误率 不能超过max_filter_ratio
routine Load
数据导入Kafka 数据例行导入。 前置操作安装ZK。
一边生产 一边消费。
停止作业属性 。
INSERT INTO with label 标签
单分区 不用加 分区条件。 多分区 必须加where条件数据
高级功能:表结构变更
增加列 删除列。固定位置增加列。
可以取消alter 的操作。
高级功能: Rollup
创建Rollup 需要搬移数据。
物理上独立存储。base 表 修改 RollUp会级联。 查询列 命中RollUp会采用Rollup 表、
查看执行计划可以 看到是否用到了RollUp
取消RollUp :cancel ~
高级设置
增大内存。
修改 查询超时时间 300s。Query timeout
broadcast 和Shuffle join
数据太大广播不出去 可以进行 hash 分区之后进行Join
手动指定 shuffle Join
Aggregate 模型
SUM Replace
保存聚合数据 不保存明细数据。
加入时间戳 会保留明细数据。
Uniq 模型
Duplicate 模型
冗余模型。 指定列 排序。
数据模型总结。
aggregate 对count(*) 没有什么帮助 统计所有列有多少行。
Uniq 主键唯一 新的替换 旧的
Duplicate 模型
数据模型在 建表时 就已经确定 无法修改。
索引:
Doris 自建的索引: 前缀索引和ZoneMap 索引
用户建的索引: bloom filter 和bitmap 索引。
前缀索引:一行数据的前36个字节 为前缀索引 遇到varchar 直接截断。出现or 不匹配。
ROLLUP 调整 前缀索引。
物化视图
查询语句 会匹配最优的物化视图。 包含了Roll-Up的所有功能 还有扩展 。
自动匹配:
删除,视图状态
局限性:
聚合的列 只支持单列 ,不支持表达式。
删除语句的条件列 在物化视图中 不存在,不能进行删除操作 一定要删除数据 则 先删除物化视图。
单表过多物化视图 影响导入效率 。物化视图和base 表同步更新 物化视图超过10个 很慢
相同列 不同聚合函数 在同一个物化视图中不支持 比如 同时 min a 和 sum a
物化视图 Unique Key 数据模型 只能改变列的顺序,不能起到聚合作用,所以在Unique Key模型上不能通过创建物化视图的方式对数据进行 粒度聚合操作。
动态分区
支持Range 分区
分区偏移; 默认不删除历史分区。
dynamic_partition_enable=true. dynamic_partition_check_interval_seconds =5s.
可以创建当前时间 往后几天的分区数据,可以设定,超出这个时间会报错。
show partitions from table_name ;
设置参数 :
以周为参数 自动删除两周前的数据。
可以指定从第几天开始。
Doris 数据导出
export .
Colacation Join
减少数据在节点中的传输。 不需要跨主机进行操作。
Join 直接计算相邻的数据。 两表分桶列 和数量完全一致 而且桶的个数 也需要一致,副本数 两张表所有的分区和副本数也一致。
同一个组 中。
root 用户可以查看 Group 属性 可以修改 表group 的属性。
查询演示---->>>>
日期函数:
convert_tz
curdate() current_timestamp
current_time() date_add() date_sub() date_format() day dayOfMonth dayname dayofweek
now() str_to_date() weekofyear()
地理函数
ST_asText 几何对象转化。WKT 格式字符串
ST_circle …
ST_asText(ST_GeometryFromText…)
ST_PolyGen() …
字符串函数
append_trailing_char_if_absent(str,char) 如果str 不以char 结尾 则将 char 放到结尾 char 只包含一个字符,如果包含多个字符,则返回NULL。
ascii
char_length()
concat 其中有一个是null 结果就是null
concat_ws
ends_with
find_in_set
get_json_double get_json_int get_json_string
group_concat 一列值进行拼接。 instr
lcase。rcase left length 字节数 locate 定位 lpad ltrim money_format null_or_empty regexp_extract regexp_replace
repeat. reverse right .rpad
split_part 切割返回第几部分
starts_with strleft strright
> 聚合函数
APPROX_COUNT_DISTINCT 近似聚合函数。AVG。 BITMAP_UNION ~
bitmap_count
bitmap 函数
bitmap_empty()
bitmap_and()
bitmap_contains(). bitmap_has_any() bitmap_hash()
bitmap_or() bitmap_to_string bitmap_from_string
案例背景介绍:
实时行为数据—>>>Flume 实时采集
Kafka —>>Doris --FineBI.
实时订单数据—>>>Cannel 实时采集
flume : Source ----Channel -----Sink 基本架构单元Agent + 传输数据单元event
canel :8089
FineBI 帆软软件。 报表展示分析制作。
FineBI 连接Doris —>>> 数据源管理
数据 大屏 大屏实时刷新。 修改Jar 包中的 代码 加上自动刷新功能。
2022-08-27