Doris 入门(表、数据操作)

394 阅读6分钟

#博学谷IT学习技术支持#

帮助命令:help 【create table】、load、mini load 、delete、alter table

1. 基本概念

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

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 数据划分

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

  • 单分区即数据不进行分区,数据只做HASH分布,也就是分桶

  • 在复合分区中:

    • 第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。
    • 第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。

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

  • 有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等进行评估。
  • 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句进行数据删除。
  • 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。

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

3 数据导入(Load)

为适配不同的数据导入需求,Doris系统提供了五种不同的数据导入方式,每种数据导入方式支持不同的数据源,存在不同的方式(异步,同步)

3.1 Broker Load

Broker load是一个导入的异步方式,不同的数据源需要部署不同的 broker 进程。可以通过 show broker 命令查看已经部署的 broker。

3.1.1 适用场景

  • l 源数据在Broker可以访问的存储系统中,如HDFS
  • l 数据量在几十到几百GB级别

3.1.2 基本原理

用户在递交导入任务后,FE(Doris系统的元数据和调度节点)会生成相应的PLAN(导入执行计划,BE会导入计划将输入导入Doris中)并根据BE(Doris系统的计算和存储节点)的个数和文件的大小,将PLAN分给多个BE执行,每个BE导入一部分数据。BE在执行过程中会从Broker拉取数据,在对数据转换之后导入系统,所有BE均完成导入,由FE最终决定导入是否成功

3.2 Routine Load

例行导入功能为用户提供了一种自动从指定数据源进行数据导入的功能

3.2.1 适用场景

当前仅支持kafka系统进行例行导入。

3.2.2 使用限制

  • 支持无认证的 Kafka 访问,以及通过 SSL 方式认证的 Kafka 集群。
  • 支持的消息格式为 csv 文本格式。每一个 message 为一行,且行尾不包含换行符。

仅支持 Kafka 0.10.0.0(含) 以上版本

3.2.3 基本原理

  • 如上图,Client 向 FE 提交一个例行导入作业。
  • FE 通过 JobScheduler 将一个导入作业拆分成若干个 Task。每个 Task 负责导入指定的一部分数据。Task 被 TaskScheduler 分配到指定的 BE 上执行。
  • 在 BE 上,一个 Task 被视为一个普通的导入任务,通过 Stream Load 的导入机制进行导入。导入完成后,向 FE 汇报。
  • FE 中的 JobScheduler 根据汇报结果,继续生成后续新的 Task,或者对失败的 Task 进行重试。
  • 整个例行导入作业通过不断的产生新的 Task,来完成数据不间断的导入

3.3 Stream Load

Broker load是一个同步的导入方式,用户通过发送HTTP协议将本地文件或者数据流导入到Doris中,Stream Load同步执行导入并返回结果,用户可以通过返回判断导入是否成功

3.3.1 适用场景

Stream load 主要适用于导入本地文件,或通过程序导入数据流中的数据。

3.3.2 基本原理

下图展示了 Stream load 的主要流程,省略了一些导入细节。

Stream load 中,Doris 会选定一个节点作为 Coordinator 节点。该节点负责接数据并分发数据到其他数据节点

用户通过 HTTP 协议提交导入命令。如果提交到 FE,则 FE 会通过 HTTP redirect 指令将请求转发给某一个 BE。用户也可以直接提交导入命令给某一指定 BE。

导入的最终结果由 Coordinator BE 返回给用户

4 删除数据(Delete)

Doris 目前可以通过两种方式删除数据:DELETE FROM 语句和 ALTER TABLE DROP PARTITION 语句。

5 高级功能

5.1 表结构变更

使用alter table 命令, 可进行

  • l 增加列
  • l 删除列
  • l 修改列类型
  • l 改变列顺序

5.2 增大内存

  • 内存不够时, 查询可能会出现'Memory limit exceeded', 这是因为doris对每个用户默认设置内存限制为 2g

    • SHOW VARIABLES LIKE "%mem_limit%";
  • exec_mem_limit 的单位是 byte,可以通过 SET 命令改变 exec_mem_limit 的值。如改为 8GB。 SET exec_mem_limit = 8589934592;

  • 上述设置仅仅在当前session有效, 如果想永久有效, 需要添加 global 参数

    • SET GLOBAL exec_mem_limit = 8589934592;

5.3 修改超时时间

  • doris默认最长查询时间为300s, 如果仍然未完成, 会被cancel掉

    • SHOW VARIABLES LIKE "%query_timeout%";
  • 可以修改为60s SET query_timeout = 60;

  • 同样, 如果需要全局生效需要添加参数 global set global query_timeout = 60;

5.4 doris的高可用方案

当部署多个 FE 节点时,用户可以在多个fe上部署负载均衡实现或者通过mysql connect 自动重连

或者应用可以连接到和应用部署到同一机器上的 MySQL Proxy,通过配置 MySQL Proxy 的 Failover 和 Load Balance 功能来达到目的。