Apache Doris学习记录

news2024/11/24 1:59:50

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):存储、维护集群元数据;负责接收、解析查询请求,规划查询计划, 调度查询执行,返回查询结果。主要有三个角色:

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

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

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

数据的可靠性由 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.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调整前缀索引(建表时指定的索引顺序无法改变,可以通过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集合差不多

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python每日一练:最长递增的区间长度(一行代码花样解法)

文章目录 前言一、题目二、一行超人三、分析一下思路 总结 前言 很显然,Python的受众远远大于C,其实笔者本人对Python的理解也是远强于C的,C纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行…

链表(数据结构)

目录 链表 链表的分类 1、单向或者双向 2、带头或者不带头 3、循环或者非循环 总结: 单链表 创建链式结构 创建新节点 尾插 尾删 头插 头删 查找节点 在pos位置后插入 删除pos位置后的节点 销毁 链表 概念: 链表是一种物理结构上非连续的、非顺序的存储结…

c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录 前言关于Aspose PDF使用Aspose.Pdf常用的命名空间和类库1 创建简单的PDF文档2 美化PDF样式2.1 创建测试数据2.2 项目头部样式2.3 全部代码 小结附录参考 前言 项目中需要将数据导出存为PDF格式,试了一下Aspose组件,仅以此记录一下使用感受。 …

设计模式——原型模式(浅拷贝和深拷贝)

是什么? 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象; 结构 抽象原型类:规定了具体原型对象必须实现的Clone()方法; 具体原型类:实现抽象…

Elasticsearch:NLP 和 Elastic:入门

自然语言处理 (Natural Language Processing - NLP) 是人工智能 (AI) 的一个分支,专注于尽可能接近人类解释的理解人类语言,将计算语言学与统计、机器学习和深度学习模型相结合。 AI - Artificial Inteligence 人工智能ML - Machine Learning 机器学习DL…

集线器、网桥、交换机

一.集线器 集线器(HUB),它是工作在物理层的设备, 由于它只是工作在物理层的设备,所以它并不关心也不可能关心OSI上面几层所涉及的,它的工作机制流程是:从一个端口接收到数据包时,会在…

STL基础

目录 一、STL的诞生 二、STL基本概念 三、STL六大组件 大体分为六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器 四、容器、算法与迭代器的认识 容器container:存放数据地方 算法algorithm:解…

中级软件设计师备考---软件工程2

目录 软件测试分类和要求测试用例设计测试阶段McCabe复杂度软件维护软件过程改进---CMMICMM英文版CMM中文版CMMI 软件测试分类和要求 分类: 灰盒测试:多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。…

MySQL:插入,更新与删除、索引

一、学习目标 掌握如何向表中插入数据掌握更新数据的方法熟悉如何删除数据掌握对数据表基本操作的方法和技巧了解什么是索引掌握创建索引的方法和技巧熟悉如何删除索引熟悉掌握索引的常见问题 二、实验内容 创建表books,对数据表进行插入、更新和删除操作&#x…

SkyWalking集成Logback的使用

SkyWalking集成Logback的使用 将微服务的日志框架去集成SkyWalking,我们希望在我们微服务中日志中,能够记录当前调用链路的id,然后我们再根据这个id去SkyWalking的前端界面中进行搜索找到对应的调用链路记录。 因为springboot默认实现的日志…

Ansible 的脚本 之playbook 剧本

目录 第一章.playbooks的组成 1.1playbooks的组成部分 1.2运行playbook 1.3定义、引用变量 1.4.指定远程主机sudo切换用户 1.6.when条件判断 1.7.迭代 第二章.Templates模块 2.1.准备模板 2.2.修改主机清单文件 2.3.编写 playbook 第三章.tags 模块 3.1.yaml文件编…

操作系统原理 —— 线程的概念、实现方式、多线程模型(十)

什么是线程,为什么要引入线程? 有的进程可能需要 “同时” 做很多事情,而传统的进程只能串行的执行一系列的程序,为此,引入了 “线程” ,来增加并发度。 可以把线程理解为 轻量级进程,线程是可…

剧本杀闯关小程序app软件

剧本杀闯关小程序软件是一种结合了角色扮演和解谜游戏元素的互动娱乐产品,目前在市场上越来越受欢迎。以下是剧本杀闯关小程序软件市场行业情况的一些特点: 市场需求增长:随着人们对于线上互动娱乐的需求增加,剧本杀闯关小程序…

maven install的时候报Unable to find main class

目录 问题描述解决办法解决方案一:添加一个主函数解决方案二:将不是web工程的设置跳过解决方案三:打包插件的作用本质上就是将当前项目所依赖的jar打包到一块,这样jar包就可以运行了,我们完全可以把parent的pom.xml的b…

智慧农业物联网平台建设方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 智慧农业物联网系统组网图 2.2.1 智能温室组网说明 该组网图演示的为小面积示范区,每个连栋温室为 1个灌溉区域,1个子系统,该子系统完成…

学习Typescript(第一弹)

Typescript的基础类型 Boolean类型 let bool: boolean true;Number类型 let num: number 222;String类型 let str: string 码上coding;数组Array类型 对数组类型的定义有两种方式: let arr1: number[] [1,2,3]; let arr2: Array<number | string> [1,2,码上co…

Android APK 反编译后重新打包并签名

APKTool&#xff1a; Apktool 是一个逆向android非常有用的工具&#xff0c;可以用来反编译apk文件&#xff0c;并且能在修改部分资源文件后&#xff0c;重新打包成一个新的apk。 下载连接&#xff1a;http://ibotpeaches.github.io/Apktool/install/ 下载之后文件夹非常清爽&…

电力节能设备远程监控系统解决方案

电力节能设备远程监控系统解决方案 一、项目背景 随着城市化进程的发展&#xff0c;对电力设备安全、可靠、经济运行的要求越来越高&#xff0c;由于没有统一专业的用电现代化管理规划&#xff0c;电力设备管理混乱、数据采集不方便、运行智能化程度低&#xff0c;需要实时掌…

复合查询--- MySQL总结(三)

复合查询 文章目录 复合查询多表查询自连接子查询单行查询多行查询多列子查询合并查询 多表查询 前面讲述的关于进行一个表的简单查询和关于时间函数的相关问题&#xff0c;下面要进行复合查询的相关内容。 这里要使用卡笛尔集的概率让两个表融合成为一个表。 需要使用相应的字…

vue项目为例解决element ui 时间选择器 picker使用样式穿透不起作用问题

今天在开发中 需要修改时间选择器弹出的这个组件的样式 但这个东西比较坑爹 首先 不能影响其他组件 就是其他组件用了时间选择器 不能受到我们写的样式的影响 那么 就只好穿透了 但你会发现 这东西是作用与body下的 就很坑 穿透我试了挺久的 不起作用 但官方文档有提供给我们一…