大规模并行处理架构Doris入门操作

news2024/9/28 21:23:21

目录

  • 1 基本概念
    • 1.1 Row & Column
    • 1.2 Tablet & Partition
  • 2 创建用户
    • 2.1 创建数据库并赋予权限
    • 2.2 Doris 建表、数据导入与删除
  • 3 建表(Create Table)
    • 3.1 字段类型
    • 3.2 数据划分
    • 3.3 关于 Partition 和 Bucket 的数量和数据量的建议
    • 3.4 演示单分区和复合分区
      • 3.4.1 单分区
      • 3.4.2 复合分区


1 基本概念

在这里插入图片描述

在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述。

Doris 采用 MySQL 协议进行通信,用户可通过 MySQL client 或者 MySQL JDBC连接到 Doris 集群。选择 MySQL client 版本时建议采用5.1 之后的版本,因为 5.1 之前不能支持长度超过 16 个字符的用户名。

1.1 Row & Column

一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。

Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列。从聚合模型的角度来说,Key 列相同的行,会聚合成一行。其中 Value 列的聚合方式由用户在建表时指定。关于更多聚合模型的介绍,可以参阅 Doris 数据模型

1.2 Tablet & Partition

在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(*Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。

多个 Tablet 在逻辑上归属于不同的分区(Partition)。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。因为 Tablet 在物理上是独立存储的,所以可以视为 Partition 在物理上也是独立。Tablet 是数据移动、复制等操作的最小物理存储单元。

若干个 Partition 组成一个 Table。Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行。

2 创建用户

◆ Root 用户登录与密码修改

Doris 内置 root 和 admin 用户,密码默认都为空。启动完 Doris 程序之后,可以通过 root 或 admin 用户连接到 Doris 集群。 使用下面命令即可登录 Doris:

mysql -h node1 -P9030 -uroot

登陆后,可以通过以下命令修改 root 密码

SET PASSWORD FOR ‘root’ = PASSWORD(‘your_password’);

◆ 创建新用户

通过下面的命令创建一个普通用户

CREATE USER ‘test’ IDENTIFIED BY ‘test_passwd’;

后续登录时就可以通过下列连接命令登录。

mysql -h node1 -P9030 -utest -ptest_passwd

*注意:

Ø 新创建的普通用户默认没有任何权限。权限授予可以参考后面的权限授予。

2.1 创建数据库并赋予权限

◆ 创建数据库

初始可以通过 root 或 admin 用户创建数据库:

CREATE DATABASE test_db;

注意:

Ø 所有命令都可以使用 ‘HELP command;’ 查看到详细的语法帮助。如:HELP CREATE DATABASE;Ø 如果不清楚命令的全名,可以使用 “help 命令某一字段” 进行模糊查询。如键入 ‘HELP CREATE’,可以匹配到 CREATE DATABASE, CREATE TABLE, CREATE USER 等命令。
在这里插入图片描述

数据库创建完成之后,可以通过 SHOW DATABASES; 查看数据库信息。

show databases;
在这里插入图片描述

information_schema是为了兼容MySQL协议而存在,实际中信息可能不是很准确,所以关于具体数据库的信息建议通过直接查询相应数据库而获得。

◆ 权限赋予

test_db 创建完成之后,可以通过 root/admin 账户将 test_db 读写权限授权给普通账户,如 test。授权之后采用 test 账户登录就可以操作 test_db 数据库了。

GRANT AL◆ ON test_db TO test;

2.2 Doris 建表、数据导入与删除

可以通过在 mysql-client 中执行以下 help 命令获得更多帮助:

◆ help create table

◆ help load

◆ help mini load

◆ help delete

◆ help alter table

3 建表(Create Table)

使用 CREATE TABLE 命令建立一个表(Table)。更多详细参数可以查看:

HELP CREATE TABLE;

首先切换数据库:

USE test_db;

Doris 的建表是一个同步命令,命令返回成功,即表示建表成功。

可以通过 *HELP CREATE TABLE; 查看更多帮助。

CREATE TABLE IF NOT EXISTS test_db.table0( user_id LARGEINT NOT NUL◆ COMMENT “用户id”, date DATE NOT NULL COMMENT “数据灌入日期时间”, timestamp DATETIME NOT NUL◆ COMMENT “数据灌入的时间戳”, city VARCHAR(20) COMMENT “用户所在城市”, age SMALLINT COMMENT “用户年龄”, sex TINYINT COMMENT “用户性别”, last_visit_date DATETIME REPLACE DEFAULT “1970-01-01 00:00:00” COMMENT “用户最后一次访问时间”, cost BIGINT SUM DEFAULT “0” COMMENT “用户总消费”, max_dwell_time INT MAX DEFAULT “0” COMMENT “用户最大停留时间”, min_dwell_time INT MIN DEFAULT “99999” COMMENT “用户最小停留时间”)ENGINE=olapAGGREGATE KEY(user_id, date, timestamp, city, age, sex)PARTITION BY RANGE(date)( PARTITION p202001 VALUES LESS THAN (“2020-02-01”), PARTITION p202002 VALUES LESS THAN (“2020-03-01”), PARTITION p202003 VALUES LESS THAN (“2020-04-01”))DISTRIBUTED BY HASH(user_id) BUCKETS 16PROPERTIES( “replication_num” = “3”, “storage_medium” = “SSD”, “storage_cooldown_time” = “2021-05-01 12:00:00”);

3.1 字段类型

在这里插入图片描述

◆ TINYINT数据类型

长度: 长度为1个字节的有符号整型。

范围: [-128, 127]

转换: Doris可以自动将该类型转换成更大的整型或者浮点类型。使用CAST()函数可以将其转换成CHAR。

举例:

select cast(100 as char);
在这里插入图片描述

◆ SMALLINT数据类型

长度: 长度为2个字节的有符号整型。

范围: [-32768, 32767]

转换: Doris可以自动将该类型转换成更大的整型或者浮点类型。使用CAST()函数可以将其转换成TINYINT,CHAR。

举例:

select cast(10000 as char);
在这里插入图片描述
select cast(10000 as tinyint);
在这里插入图片描述

◆ INT数据类型

长度: 长度为4个字节的有符号整型。

范围: [-2147483648, 2147483647]

转换: Doris可以自动将该类型转换成更大的整型或者浮点类型。使用CAST()函数可以将其转换成TINYINT,SMALLINT,CHAR

举例:

select cast(111111111 as char);
在这里插入图片描述

◆ BIGINT数据类型

长度: 长度为8个字节的有符号整型。

范围: [-9223372036854775808, 9223372036854775807]

转换: Doris可以自动将该类型转换成更大的整型或者浮点类型。使用CAST()函数可以将其转换成TINYINT,SMALLINT,INT,CHAR

举例:

select cast(9223372036854775807 as char);
在这里插入图片描述

◆ LARGEINT数据类型

长度: 长度为16个字节的有符号整型。

范围: [-2^127, 2^127-1]

转换: Doris可以自动将该类型转换成浮点类型。使用CAST()函数可以将其转换成TINYINT,SMALLINT,INT,BIGINT,CHAR

举例:

select cast(922337203685477582342342 as double);
在这里插入图片描述

◆ FLOAT数据类型

长度: 长度为4字节的浮点类型。

范围: -3.40E+38 ~ +3.40E+38。

转换: Doris会自动将FLOAT类型转换成DOUBLE类型。用户可以使用CAST()将其转换成TINYINT, SMALLINT, INT, BIGINT, STRING, TIMESTAMP。

◆ DOUBLE数据类型

长度: 长度为8字节的浮点类型。

范围: -1.79E+308 ~ +1.79E+308。

转换: Doris不会自动将DOUBLE类型转换成其他类型。用户可以使用CAST()将其转换成TINYINT, SMALLINT, INT, BIGINT, STRING, TIMESTAMP。用户可以使用指数符号来描述DOUBLE 类型,或通过STRING转换获得。

◆ DECIMAL数据类型

DECIMAL[M, D]

保证精度的小数类型。M代表一共有多少个有效数字,D代表小数点后最多有多少数字。M的范围是[1,27],D的范围是[1,9],另外,M必须要大于等于D的取值。默认取值为decimal[10,0]。

precision: 1 ~ 27

scale: 0 ~ 9

◆ DATE数据类型

范围: [0000-01-01~9999-12-31]。默认的打印形式是’YYYY-MM-DD’。

◆ DATETIME数据类型

范围: [0000-01-01 00:00:00~9999-12-31 23:59:59]。默认的打印形式是’YYYY-MM-DD HH:MM:SS’。

◆ CHAR数据类型

范围: char[(length)],定长字符串,长度length范围1~255,默认为1。

转换:用户可以通过CAST函数将CHAR类型转换成TINYINT,,SMALLINT,INT,BIGINT,LARGEINT,DOUBLE,DATE或者DATETIME类型。

示例:

select cast(1234 as bigint);
在这里插入图片描述

◆ VARCHAR数据类型

范围: char(length),变长字符串,长度length范围1~65535。

转换:用户可以通过CAST函数将CHAR类型转换成TINYINT,,SMALLINT,INT,BIGINT,LARGEINT,DOUBLE,DATE或者DATETIME类型。

示例:

select cast(‘2011-01-01’ as date);
在这里插入图片描述
select cast(‘2011-01-01’ as datetime);
在这里插入图片描述
select cast(3423 as bigint);
在这里插入图片描述

◆ HLL数据类型

范围:char(length),长度length范围1~16385。用户不需要指定长度和默认值、长度根据数据的聚合程度系统内控制,并且HLL列只能通过配套的hll_union_agg、hll_cardinality、hll_hash进行查询或使用

3.2 数据划分

Doris支持单分区和复合分区两种建表方式。

在复合分区中:

◆ 第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(*当前只支持整型和时间类型的列),并指定每个分区的取值范围。

◆ 第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。

以下场景推荐使用复合分区

◆ 有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等进行评估。

◆ 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句进行数据删除。

◆ 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。

用户也可以不使用复合分区,即使用单分区。则数据只做 HASH 分布。

下面以聚合模型为例,分别演示两种分区的建表语句。

◆ Partition

在这里插入图片描述

◆ Bucket

在这里插入图片描述

◆ PROPERTIES

在这里插入图片描述

◆ ENGINE

在这里插入图片描述

3.3 关于 Partition 和 Bucket 的数量和数据量的建议

◆ 一个表的 Tablet 总数量等于 (Partition num * Bucket num)。

◆ 一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。

◆ 单个 Tablet 的数据量理论上没有上下界,但建议在 1G - 10G 的范围内。如果单个 Tablet 数据量过小,则数据的聚合效果不佳,且元数据管理压力大。如果数据量过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。

◆ 当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则。

◆ 在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。

◆ 一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。

◆ 举一些例子:假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个分片。5GB:8-16个。50GB:32个。500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。

注:表的数据量可以通过 show data 命令查看,结果除以副本数,即表的数据量。

3.4 演示单分区和复合分区

3.4.1 单分区

建立一个名字为 table1 的逻辑表。分桶列为 siteid,桶数为 10。

这个表的 schema 如下:

◆ siteid:类型是INT(4字节), 默认值为10

◆ citycode:类型是SMALLINT(2字节)

◆ username:类型是VARCHAR, 最大长度为32, 默认值为空字符串

◆ pv:类型是BIGINT(8字节), 默认值是0; 这是一个指标列, Doris内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM)

建表语句如下:

CREATE TABLE table1( siteid INT DEFAULT ‘10’, citycode SMALLINT, username VARCHAR(32) DEFAULT ‘’, pv BIGINT SUM DEFAULT ‘0’)AGGREGATE KEY(siteid, citycode, username)DISTRIBUTED BY HASH(siteid) BUCKETS 10PROPERTIES(“replication_num” = “1”);
在这里插入图片描述
将 table1_data 导入 table1 中:vim table1_data
10,101,jim,211,101,grace,212,102,tom,213,102,bush,314,103,helen,3
curl --location-trusted -u root:123456 -H “label:table1_20210210” -H “column_separator:,” -T table1_data http://node1:8030/api/test_db/table1/_stream_load
在这里插入图片描述
select * from table1;
在这里插入图片描述

3.4.2 复合分区

建立一个名字为 table2 的逻辑表。

这个表的 schema 如下:

◆ event_day:类型是DATE,无默认值

◆ siteid:类型是INT(4字节), 默认值为10

◆ citycode:类型是SMALLINT(2字节)

◆ username:类型是VARCHAR, 最大长度为32, 默认值为空字符串

◆ pv:类型是BIGINT(8字节), 默认值是0; 这是一个指标列, Doris 内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM)

我们使用 event_day 列作为分区列,建立3个分区: p202006, p202007, p202008

◆ p202006:范围为 [最小值, 2020-07-01)

◆ p202007:范围为 [2020-07-01, 2020-08-01)

◆ p202008:范围为 [2020-08-01, 2020-09-01)

Ø 注意区间为左闭右开。

每个分区使用 siteid 进行哈希分桶,桶数为10

建表语句如下:

CREATE TABLE table2( event_day DATE, siteid INT DEFAULT ‘10’, citycode SMALLINT, username VARCHAR(32) DEFAULT ‘’, pv BIGINT SUM DEFAULT ‘0’)AGGREGATE KEY(event_day, siteid, citycode, username)PARTITION BY RANGE(event_day)( PARTITION p202006 VALUES LESS THAN (‘2020-07-01’), PARTITION p202007 VALUES LESS THAN (‘2020-08-01’), PARTITION p202008 VALUES LESS THAN (‘2020-09-01’))DISTRIBUTED BY HASH(siteid) BUCKETS 10PROPERTIES(“replication_num” = “1”);
在这里插入图片描述
将 table2_data 导入 table2 中:vim table2_data
2020-07-03
cur◆ --location-trusted -u root:123456 -H “label:table2_20200707” -H "column_separator:
在这里插入图片描述
select * from table2;
在这里插入图片描述

*注意事项:

Ø 上述表通过设置 replication_num 建的都是单副本的表,Doris建议用户采用默认的 3 副本设置,以保证高可用。Ø 可以对复合分区表动态的增删分区。详见 HELP ALTER TABLE 中 Partition 相关部分。Ø 数据导入可以导入指定的 Partition。详见 HELP LOAD。Ø 可以动态修改表的 Schema。Ø 可以对 Table 增加上卷表(Rollup)以提高查询性能,这部分可以参见高级使用指南关于 Rollup 的描述。Ø 表的列的Null属性默认为true,会对查询性能有一定的影响。

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

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

相关文章

UML状态图详解

上篇文章,介绍了UML的基础知识,并详细介绍了UML中类图的知识点与画法。 本篇,来继续介绍UML中的另一种图——状态图。 1 UML状态图简介 状态图,显示一个状态机,属于UML活动图。 UML具有许多不同类型的图表&#xff…

<代码分享> 分支定界算法的 Python 代码框架

本文以求解整数规划模型为例,提供分支定界算法的 Python 代码框架,期待完善、指正和交流。 文件结构 具体代码 problem.py 定义问题的格式: from typing import Listclass Problem(object):"""problem"""de…

OneAPI 编译cp2k 9.1和cp2k 2023.1

环境信息: Rocky Linux 8.6 Linux server 4.18.0-425.19.2.el8_7.x86_64 gcc version 8.5.0 20210514 (Red Hat 8.5.0-16) (GCC) OneAPI 2023 Intel(R) oneAPI DPC/C Compiler 2023.0.0 (2023.0.0.20221201) ifort version 2021.8.0 一、编译cp2k 9.1 这里用的…

linux系统下常用软件的安装与操作实现

本文来介绍下如何在 Linux 上安装 Windows 上常用的软件,桌面更多的用的是 Ubuntu ,下面就以 Ubuntu 为例。 目录 一、安装环境 二、安装步骤 三、总结 一、安装环境 本文使用的安装环境,如下所示: linuxylinuxy:~$ cat /proc…

【Python】【进阶篇】25、Django for标签详解

目录 25、Django for标签详解1. for标签的使用2. for标签嵌套使用3. forloop变量详解 25、Django for标签详解 通过上一节的《Django if标签详解》的讲解,我相信大家对于模板标签已经不再陌生,在本节我们再给大家隆重介绍一位最熟悉的陌生人&#xff0c…

如何熟练的使用trtexec

目录 如何熟练的使用trtexec前言1. 参数解释1.1 Model Options1.2 Build Options1.3 Inference Options1.4 Reporting Options1.5 System Options1.6 完整的参数 如何熟练的使用trtexec 前言 杜老师推出的 trtexec 工具的使用课程,链接。记录下个人学习笔记&#x…

禁止Windows更新自动安装驱动程序

禁止Windows更新自动安装驱动程序 问题解决方案方案1:修改系统设置方案2:修改组策略方案3:修改注册表方案4:回退驱动 问题 Windows更新时,会自动更新驱动程序,甚至有时会将驱动程序反向更新,替…

使用 webdriver API 编写自动化脚本的基本语法

文章目录 1. 打开和关闭浏览器1)打开浏览器并访问 URL2)关闭浏览器窗口 2. 元素的定位1)以 id 定位元素2)以 name 定位元素3)以 tag name 定位元素4)以 class name 定位元素5)以 xpath 定位元素…

第九章 控制单元的功能课后习题

指令周期有四个阶段:取值 间址 执行 中断 ,控制单元为了完成不同指令会发出不同的操作命令,这些操作信号控制着计算机所有部件有次序的完成不同的操作,以达到执行程序的目的。 控制单元的外特性 9.2控制单元的功能是什么?其输入…

【Java+GS】GeoServer——使用Java发布图层(SHP文件和DB数据库),附自用工具类

文章目录 SHP文件发布逻辑 1、获取到geoserver的manager对象2、调用createWorkArea方法,参入manager,创建空间空间 workArea3、调用createShpDataPool方法,创建数据存储4、发布样式Style.5、发布图层 调用业务层库发布shp文件图层业务逻辑如下…

【致敬未来的攻城狮计划】— 连续打卡第二十五天:RA2E1的 DTC传输模式

系列文章目录 由于一些特殊原因: 系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章) 24.RA2E1的 DMAC——数据传输 文章目录 系列文章目录 前言 一、DTC是什么? 二、DTC内部寄存…

Springboot——集成Elastic Job实现任务调度

目录 1.任务调度 2.Elastic Job 3.springboot集成Elastic Job 1.任务调度 什么是任务调度? 任务调度就是指系统为了自动地完成特定任务,在指定的时刻去执行任务的过程,其目的是为了让系统自动且精确地完成任务从而解放人力资源。 如&am…

WX小程序 - 1

视图层:WXML,WXSS 逻辑层:JS 响应数据绑定,事件绑定 勾选这个其实就是解决跨域问题(仅限本地开发阶段)。 上线需要去合法域名添加。 app.json 文件创建和删除,保持一致,否则报错…

二叉树的层序遍历思想模板

分为两种&#xff1a; 1.第一种是直接将遍历的数据保存到列表里&#xff1b; 2.第二种是将每一层的数据以列表形式保存在列表&#xff1b;&#xff08;今天要讲述的内容&#xff09; 代码如下&#xff0c;思想在后 class Solution {public List<List<Integer>> …

全新 – Amazon EC2 R6a 实例由第三代 AMD EPYC 处理器提供支持,适用于内存密集型工作负载

我们在 Amazon re:Invent 2021 上推出了通用型 Amazon EC2 M6a 实例&#xff0c;并于今年 2 月推出了计算密集型 C6a 实例。这些实例由运行频率高达 3.6 GHz 的第三代 AMD EPYC 处理器提供支持&#xff0c;与上一代实例相比&#xff0c;性价比提高多达 35%。 如今&#xff0c;…

不断联的从Google Drive下载超大文件

不断联的从Google Drive下载超大文件 最近在研究OWOD代码&#xff0c;需要从google drive 下载超大文件&#xff0c;普通方式下载&#xff0c;首先得有个上外网的工具&#xff0c;其次下载过程中总是会断开&#xff0c;所以看了一些博客&#xff0c;总结如下&#xff1a; 安…

基于TINY4412的Andorid开发-------简单的LED灯控制【转】

基于TINY4412的Andorid开发-------简单的LED灯控制 阅读目录(Content) 一、编写驱动程序二、编写代码测试驱动程序三、编写HAL代码四、编写Framework代码五、编写JNI代码六、编写App 参考资料&#xff1a; 《Andriod系统源代码情景分析》 《嵌入式Linux系统开发完全手册_基…

实时语义分割PIDNet算法TensorRT转换

[PIDNet](GitHub - XuJiacong/PIDNet: This is the official repository for our recent work: PIDNet) 是22年新开源的实时语义分割算法&#xff0c;和DDRNet一样具有不错的性能 网络结构如下&#xff1a; 网络分为三个分支&#xff0c;如上图&#xff0c;整体结构和DDRNet比…

shell 脚本中的函数

目录 一. shell 函数作用&#xff1a;二. shell 函数的定义格式&#xff1a;三.函数返回值&#xff1a;四.函数传参&#xff1a;扩展&#xff1a; 六. 函数变量的作用范围:七 . 递归7.1阶乘 八. 函数库 一. shell 函数作用&#xff1a; 使用函数可以避免代码的重复 使用函数可以…

OJ刷题 第十五篇(递推较多,奥赛篇)

31005 - 昆虫繁殖&#xff08;难度非常大&#xff0c;信息奥赛题&#xff09; 时间限制 : 1 秒 内存限制 : 128 MB 科学家在热带森林中发现了一种特殊的昆虫&#xff0c;这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵&#xff0c;每对卵要过两个月长成成虫。假设每个成虫…