Apache Doris学习记录

1. Doris基础学习

中文官网:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary/

1.1 doris 简介

Apache Doris 是一个现代化的 MPP(Massively Parallel Processing,即大规模并行处理) 分析型数据库产品

亚秒级响应时间即可获得查询结果

可以支持 10PB 以上的超大数据集

满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式 数据分析和探索式数据分析等

1.2 Doris 架构

Doris 的架构很简洁,只设 FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于 外部组件,方便部署和运维,FE、BE 都可线性扩展。

  • FE(Frontend):存储、维护集群元数据;负责接收、解析查询请求,规划查询计划, 调度查询执行,返回查询结果。主要有三个角色:

  1. Leader 和 Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下, 元数据能够实时地在线恢复,而不影响整个服务。

  1. Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力 非常大的情况下,需要去扩展整个查询的能力,那么可以加 observer 的节点。observer 不 参与任何的写入,只参与读取。

  • BE(Backend):负责物理数据的存储和计算;依据 FE 生成的物理计划,分布式地执行查询。

  1. 数据的可靠性由 BE 保证,BE 会对整个数据存储多副本或者是三副本。副本数可根据 需求动态调整。

  • MySQLClient

Doris 借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC 以及 MySQL 的客户

端,都可以直接访问 Doris。

  • Broker

Broker 为一个独立的无状态进程。封装了文件系统接口,提供 Doris 读取远端存储系统 中文件的能力,包括 HDFS,S3,BOS 等。

1.3 基本概念

doris因为是mysql协议所以体验上和mysql很相似

  1. 首先DDL和DML语法上基本和mysql相同

  1. 和 mysql一致,拥有Row & Column & table等概念

不同的是

  1. doris的Column分为 Key 和 Value,key有点类似mysql的索引,同时提供索引的快速查询功能

  1. doris 的 value 可以根据key自动聚合,也就是doris的数据模型

2. doris 讲解

2.1 数据模型

doris字段分为key和value,key有以下几种方式

模型

特点

优势

劣势

建表指定

aggregate模型

按照key进行预聚合

目前有四种聚合方式:

  • sum:求和,多行的value进行累加。

  • replace:替代,下一批数据中的value会替换之前导入过的行中的value。

  • max:保留最大值。

  • min:保留最小值。

降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景

对count()查询很不友好

固定了聚合方式

例:已经设置了max聚合,表取数对该字段min求最小值就会出现不一致问题

不保留明细数据,只有聚合后的数据

解决:key加上时间戳

AGGREGATE KEY(`user_id`, `date`)

uniq模型

唯一Key,同一key数据自动覆盖,本质上是聚合模型的replace

保证 Key 的唯一性

无法利 用 ROLLUP 等预聚合带来的查询优势

UNIQUE KEY(`user_id`, `date`)

duplicate模型

既没有主键,也没有聚合需求时

不受聚合模型的约束,可以发挥列模型的优势

无法利 用 ROLLUP 等预聚合带来的查询优势

DUPLICATE KEY(`user_id`, `date`)

2.2 分区、分桶

doris 也有分区和分桶,但和hive不同

Table是有很多分区Partition的

Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行(不能直接操作Tablet)。

一个 Partition包含多个数据分片Tablet组成,Tablet 包含若干数据行

所以本质上Tablet 是数据移动、复制等操作的最小物理存储单元,一定要设置分桶,可以不设置分区

2.2.1分区

可以设置多列分区,但是分区字段必须为 KEY 列

  1. range分区

#通常为时间列,范围划分分区
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"), 
PARTITION `p201702` VALUES LESS THAN ("2017-03-01"), 
PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
)
#删除分区会出现空洞
p201701: [MIN_VALUE, 2017-02-01) 
p201702: [2017-02-01, 2017-03-01) 
p201704: [2017-04-01, 2017-05-01)
删除p201703: [2017-03-01, 2017-04-01),不会改变已生成的分区,该部分的数据无法导入 
  1. list分区

##直接指定,但是可以命中多个
PARTITION BY LIST(`city`)
(
PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
PARTITION `p_jp` VALUES IN ("Tokyo") )
  1. 不设置分区

其实当不使用partition by建表的时候,系统会自动生成一个和表名同名的,全值范围的partition

  1. 动态分区

createtable student_dynamic_partition1 (
    id int,
    timedate,
    name varchar(50),
    age int
)
duplicate key(id,time)
PARTITIONBYRANGE(time)() 
DISTRIBUTED BY HASH(id) buckets 10 
PROPERTIES( 
    "dynamic_partition.enable" = "true", 
    "dynamic_partition.time_unit" = "DAY", 
    "dynamic_partition.start" = "-7", 
    "dynamic_partition.end" = "3", 
    "dynamic_partition.prefix" = "p", 
    "dynamic_partition.buckets" = "10",
    "replication_num" = "1"
 );
  1. 常用的分区方式

一般都是动态range分区,或者数据较少时直接不分区

2.2.2 分桶

只支持hash分片

分桶列可以是多列,但必须为 Key 列

  1. 一个或少数分桶列

对应的点查询可以仅触发一个分桶扫描,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各 个查询之间的 IO 影响较小,适合 高并发的点查询场景

  1. 多个分桶列

数据分布更均匀,但一个查询条件不包含所有分桶列的等值条件,会触发所有分桶同时扫描,查询吞吐会增加,单个查询的延迟随之降低,适合大吞吐低并发的查询场景

2.2.3 分区分桶数设置

数据较少时,比如聚合后的ads层,可以不分区

单个tablet一般在1-10G内,数据量较小,聚合效果不好,元数据管理压力较大

2.3 ENGINE

一般都是用默认的olap,只有这个 ENGINE 类型是由 Doris 负责数据管理和存储的

ENGINE 类型有mysql、broker、 es 等等,本质上只是对外部其他数据库或系统中的表的映射,以保证 Doris 可以读取这些数据。而 Doris 本身并不创建、管理和存储任何非 olap ENGINE 类型的表和数据

2.4 replication_num

副本机制,一般就用默认的 3

对于一些小,并且更新不频繁的维度表,可以考虑设置更多的副本数。这样在 Join 查询 时,可以有更大的概率进行本地数据 Join

3.4.2 storage_medium & storage_cooldown_time

数据存储目录可以显式的指定为 SSD 或者 HDD,一般也都不怎么在意这个参数

3. doris 进阶语法

3.1 Rollup 上卷

在原表的基础上按照指定粒度预聚合提高查询效率

Rollup 的数据是基于 Base 表产生的,并且是物理独立存储的,所以有存储成本,且rollup设置较多时base表写入效率会降低

还可以用Rollup调整前缀索引(建表时指定的索引顺序无法改变,可以通过Rollup实现)

ALTER TABLE table1 ADD ROLLUP rollup_city(citycode, pv);
SHOW ALTER TABLE ROLLUP;

3.2 视图

和Rollup一样,都是建立在Base表上,会自动同步Base表的数据更新等操作

物化视图覆盖了Rollup的全部功能,相当于Rollup的超集,弥补了Rollup无法对明细数据模型进行预聚合的短板。物化视图支持丰富的聚合函数。

Doris目前只支持物化视图的单表创建,不支持表join的方式创建。

3.3 bitmap数据类型

bitmap是一种数据结构-位图,使用每个位表示某种状态,大大节省存储空间,同时位图采用位运算计算效率也很高

适用场景:需要去重,数据较大

注意事项:在数据稀疏的情况下,效率会变得非常低,另外使用bitmap每次操作的行数不宜太多

除了使用位图外,使用上和set集合差不多

3.3 join

doris除了常见的Broadcast和Shuffleliangzhong join还有一些其他的join:

  1. Broadcast Join (内存 Hash 表)

  1. Shuffle Join(Partitioned Join),按照 Join 的 key 进行 Hash,然后进行分布式的 Join

  1. Colocation Join :减少数据在节点上的传输耗时,加速查询

  1. Bucket Shuffle Join :0.14版本后的新功能。旨在为某些 Join 查询提供本地性优化,来减少数据在节点间的传输耗时,来加速查询

3.3.1 Colocation Join

Colocation Join 功能,在建表时指定colocate_with="group1"(将一组拥有 CGS 的表组成一个 CG) ,保证有相同CG的不同表对应的数据分 片会落在同一个 be 节点上,那么使得两表再进行 join 的时候,可以通过本地数据进行直接 join,减少数据在节点之间的网络传输时间

两个概念:

Colocation Group(CG):一个 CG 中会包含一张及以上的 Table。在同一个 Group 内的 Table 有着相同的 Colocation Group Schema,并且有着相同的数据分片分布

Colocation Group Schema(CGS):一个 CG 中会包含一张及以上的 Table。在同一个 Group 内的 Table 有着相同的 Colocation Group Schema,并且有着相同的数据分片分布

建表语句:

CREATE TABLE `tbl1` (
 `k1` date NOT NULL COMMENT "",
 `k2` int(11) NOT NULL COMMENT "",
 `v1` int(11) SUM NOT NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`k1`, `k2`)
PARTITION BY RANGE(`k1`)
(
 PARTITION p1 VALUES LESS THAN ('2019-05-31'),
 PARTITION p2 VALUES LESS THAN ('2019-06-30')
)
DISTRIBUTED BY HASH(`k2`) BUCKETS 8
PROPERTIES (
 "colocate_with" = "group1"
);
CREATE TABLE `tbl2` (
 `k1` datetime NOT NULL COMMENT "",
 `k2` int(11) NOT NULL COMMENT "",
 `v1` double SUM NOT NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`k1`, `k2`)
DISTRIBUTED BY HASH(`k2`) BUCKETS 8
PROPERTIES (
 "colocate_with" = "group1"
);

使用时需要注意:

  1. 建表时两张表的分桶列的类型和数量需要完全一致,并且桶数一致,才能保证多张表的数据分片能够一一对应的进行分布控制。

  1. 同一个 CG 内所有表的所有分区(Partition)的副本数必须一致。如果不一致,可能出现某一个 Tablet 的某一个副本,在同一个 BE 上没有其他的表分片的副本对应。

  1. 同一个 CG 内的表,分区的个数、范围以及分区列的类型不要求一致

3.3.2 Bucket Shuffle Join

官网描述:https://doris.apache.org/zh-CN/docs/dev/query-acceleration/join-optimization/bucket-shuffle-join

首先当表A join 表B,此时shuffle join 和 broadcast join 开销计算公式如下:

  1. broadcast join :如果表A数据分布有3个执行的HashJoinNode,网络开销为 B * N(A的HashJoinNode)=3B,内存开销也是3B

  1. shuffle join:Shuffle Join 会将 A,B 两张表的数据根据哈希计算分散到集群的节点之中,所以它的网络开销为 A + B,内存开销为 B。

原理:

doris 觉得这两种方式都可以优化,我能不能A表不动,把B表按照左表A的分布,先进行shuffle,再进行join。这样就可以减少跨节点的数据传输。这时网络和内存开销都是B

3.3.3 runtime-filter

官网描述:https://doris.apache.org/zh-CN/docs/dev/query-acceleration/join-optimization/runtime-filter

功能:

0.15 版本才有的功能,主要用于大表join小表的优化

原理:

在运行时动态生成的过滤条件,即在查询运行时解析join on clause确定过滤表达式,并将表达式广播给正在读取左表的ScanNode,从而减少扫描的数据量,进而减少probe hash table的次数,避免不必要的I/O和网络传输

如果大表T1 join 维度表 T2,显而易见对T2扫描数据要远远快于T1,如果我们主动等待一段时间再扫描T1,等T2将扫描的数据记录交给HashJoinNode后,HashJoinNode根据T2的数据计算出一个过滤条件,比如T2数据的最大和最小值,或者构建一个Bloom Filter,接着将这个过滤条件发给等待扫描T1的ScanNode,后者应用这个过滤条件,将过滤后的数据交给HashJoinNode,从而减少probe hash table的次数和网络开销,这个过滤条件就是Runtime Filter

3.3.4 join优化

官网描述:https://doris.apache.org/zh-CN/docs/dev/query-acceleration/join-optimization/doris-join-optimization

有几个用过,官网写的很详细,我一般doris更多用于展示层,较少遇到性能问题

4. 注意事项

除了我遇到的记录的问题,doris官网也总结了很多常见问题:https://doris.apache.org/zh-CN/docs/dev/faq/sql-faq

4.1 动态分区

动态分区使用过程中,如果因为一些意外情况导致 dynamic_partition.start 和dynamic_partition.end 之间的某些分区丢失,那么当前时间与 dynamic_partition.end 之间的丢失分区会被重新创建,dynamic_partition.start 与当前时间之间的丢失分区不会重新创建。

4.2 delete 语句

  1. delete语句只能针对 Partition 级别进行删除。如果一个表有多个 partition 含有需要删除的数据,则需要执行多次针对不同 Partition 的 delete 语句

  1. 如果是没有使用Partition 的表,partition 的名称即表名

  1. delete数据的真正删除是在 BE 进行数据 Compaction 时进行的。所以执行完 delete 命令后,并不会立即释放磁盘空间

  1. 如果 delete 只在多数副本上完成了,也会返回用户成功。但是会在后台生成一个异步的 delete job(Async Delete Job),来继续完成对剩余副本的删除操作

4.3 聚合模型

4.3.1 doris聚合3个阶段

  1. 每一批次数据导入的 ETL 阶段。该阶段会在每一批次导入的数据内部进行聚合

  1. 底层 BE 进行数据 Compaction 的阶段。该阶段,BE 会对已导入的不同批次的数据进行进一步的聚合

  1. 数据查询阶段。在数据查询时,对于查询涉及到的数据,会进行对应的聚合。doris自动聚合所有数据,我们只需关注最终结果即可

4.3.2 聚合模型的一些注意点

  1. Uniq 模型完全可以用聚合模型中的 REPLACE 方式替代。其内部的实现方式和数据存储方式也完全一样

  1. Uniq 模型无法使用 ROLLUP

  1. 聚合模型使用min,max等函数时需特别注意,如果函数与建表模型函数不一致数据易出错

  1. 聚合模型慎用count(),doris必须扫描所有的aggr key,聚合后才能做count,可以用一个值恒为 1 的&聚合类型为 SUM 的列来模拟 count(*)

4.3.3 replace/uniqe 模型批次内数据无序

在同一批导入数据中,出现了 key 相同但 value 不同的数据,而由于doris默认是无序的replace操作,这会导致,不同副本间,因数据覆盖的先后顺序不确定而产生的结果不一致的问题。

可能会导致数据不是最后一条,或者出现多次查询结果不一致的现象

doris提供了Sequence Column功能,可以保证有序

5.doris在数据湖的应用

我们使用的是其他数据湖,目前国内字节doris应用数据湖,doris的特性和支持的外部存储,以及提供其他计算引擎计算的功能,还支持mysql的binlog,确实也是一个不错的选择,但是成本很高

后续如果有需要再补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/17919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

紧急下架,AI以假乱真学明星唱歌;哈佛法学院专家谈AI和版权法

几周前,一首据称由 Drake 和 The Weeknd 创作的新歌登陆 TikTok 和 Spotify,并迅速在互联网上像野火一样传播开来。“我袖子上的心”在嘻哈乐迷中获得了好评如潮和高度兴奋,这不仅是因为该曲目具有感染力的歌词和旋律,而且还因为对…

jieba分词(1):入门案例

1 场景介绍 大数据量的查询问题 假设我们要从商品的表里面查询一个商品 我们的数据库里面肯定有个t_goods的表,我们现在利用商品的名称做模糊查询 1.1 对于数据库的查询的 select * from t_goods where goodsName like “%手机%” ; 问题: 这个查询…

开关电源基础01:电源变换器基础(2)

说在开头:关于德布罗意的电子波(3) 1923年,德布罗意在求出他的相波之前,康普顿刚好用光子说解释了康普顿效应(记性好的胖友们应该还记得:散射波的波长变长问题),从而带领…

SPSS如何进行聚类分析之案例实训?

文章目录 0.引言1.快速聚类分析2.分层聚类分析3.两阶段聚类分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对聚类分析进行阐…

[架构之路-187]-《软考-系统分析师》-5-数据库系统 - 操作型数据库OLTP与分析型数据库OLAP比较

OLAP与OLTP的区别? OLTP(Online transaction processing) 在线/联机事务处理。典型的OLTP类操作都比较简单,主要是对数据库中的数据进行增删改查,操作主体一般是产品的用户。 OLAP(Online analytical processing): 指联机分析处理。通过分…

SPSS如何进行判别分析之案例实训?

文章目录 0.引言1.一般判别分析2.逐步判别分析3.决策树分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对判别分析进行阐述。…

类和对象(上)

文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1声明和定义全部放在类体3.2.声明放在.h,定义放在.cpp 4..类的访问限定符及封装4.1封装4.2访问限定符4.3C中的struct和class 5.类的作用域6.类的实例化6.1引入6.2定义 7.类对象模型7.1类对象的存储方式…

MySQL知识学习06(SQL语句在MySQL中的执行过程)

1、MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。 先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图 连接器: 身份认证和权限相关(登录 MySQL 的时候)。查询缓…

Java设计模式-代理模式

简介 代理模式是一种结构型设计模式,它可以让我们通过一个代理对象来访问一个真实的目标对象,从而实现对目标对象的功能扩展或保护。代理模式的主要角色有三个: 抽象主题(Subject):定义了真实主题和代理主…

【Mybatis】增删改查

1.添加相应的jar包 2.创建持久化类 在src目录下创建一个名为com.mybatis.po的包 创建持久化类MyUser,包含三个属性(uid,uname,usex) package com.mybatis.po; /***springtest数据库中user表的持久化类*/ public class MyUser {private Integer uid;//主键private…

OpenGL(六)——坐标系统

目录 一、前言 二、空间系 2.1 局部空间 2.2 世界空间 2.3 观察空间 2.4裁剪空间 2.5 正射投影 2.6 透视投影 2.7 屏幕空间 三、透视箱子 3.1 创建模型矩阵 3.2 创建观察矩阵 3.3 创建透视投影矩阵 3.4 修改顶点着色器 3.5 传递变换矩阵 四、旋转的箱子 五、好…

[Gitops--10]微服务项目部署流水线编写

微服务项目部署流水线编写 1. 部署环境说明 序号管理地址作用1192.168.31.199GitLab2192.168.31.104Harbor3192.168.31.131kubesphere 1.1 GitLab 1.2 流水线 1.2.1 创建流水线 1.2.2 创建凭证 1.2.3 创建kubeconfig凭证 这里需要注意的是,config中如果使用的是域名,那么需…

BetaFlight统一硬件配置文件研读之serial命令

BetaFlight统一硬件配置文件研读之serial命令 1. 源由2. 代码分析3. 实例分析4. 配置情况5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式,可以将硬件和软件的工作进行解耦。 1. 源由 cli命令中serial是对UART串口的配置,通常情况下BetaFli…

Redo log详解

WAL(Write-Ahead Logging)机制 WAL 的全称是 Write-Ahead Logging,中文称预写式日志(日志先行),是一种数据安全写入机制。就是先写日志,然后再写入磁盘,这样既能提高性能又可以保证数据的安全性。Mysql中的…

基于Python的PROSAIL模型介绍以及使用

1、介绍 PROSAIL是两种模型耦合得到的。 SAIL是冠层尺度的辐射传输模型,把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层,从而模拟入射辐射与均匀介质之间的相互作用,具体还是挺复杂的。而PROSPECT就是叶片尺度的辐射传…

Kafka知识概况

Kafka知识概况 Kafka简介Kafka 生产者Kafka BrokerKafka 消费者Kafka-Eagle 监控Kafka-Kraft 模式集成 SpringBoot Kafka简介 消息队列简介: 目 前企业中比较常见的消息队列产 品主 要有 Kafka、ActiveMQ 、RabbitMQ 、RocketMQ 等。在大数据场景主要采用 Kafka 作…

vmware虚拟机安装k8s(之前已经安装过docker)

1、安装开始 先执行:curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add 再执行更改源:echo "deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" >> /etc/apt/sources.list …

redis分布式锁

文章目录 锁的种类一个靠谱分布式锁需要具备的条件和刚需独占性高可用防死锁不乱抢重入性 如何一步一步实现一个完备的分布式锁单机版加锁Redis分布式锁setnx宕机与过期 防死锁防止误删key的问题lua脚本保证原子性 hsetnx 可重入锁简单工厂模式RedisDistributeLockDistributed…

阿里云服务器购买教程(新手入门指南)

阿里云服务器ECS选购指南,阿里云百科分享2023阿里云服务器新手选择流程,选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置…

mac下用git客户端生成ssh秘钥并配置到souretree进行使用

一、使用git 生成 ssh 密钥 1、Mac 安装 git 客户端 打开终端,执行命令: $ brew install git2、执行命令 $ git config --global user.name "xxx" 你自己的名字 $ git config --global user.email "xxxxxx.com&q…