Doris之分区分桶

文章目录

      • 分区(Partition)
      • 分桶(Bucket)
      • 最佳实践
        • 关于分桶列的选择
        • 关于 Partition 和 Bucket 的数量和数据量的建议
        • 分区、分桶标准参考(来自官网)
        • 复合分区与单分区
      • 常见问题

为了能高效处理大数据量的存储和计算,Doris 按分治思想对数据进行分割处理。

Doris 支持两层的数据划分。第一层是 Partition(分区),支持 Range (按范围)和 List(按枚举值) 的划分方式。第二层是 Bucket(分桶),仅支持 Hash 的划分方式。分区和分桶都是对数据进行横向分割。

也可以仅使用一层分区。使用一层分区时,只支持 Bucket 划分。以下来自官网


分区(Partition)

分区用于将数据划分成不同区间, 逻辑上可以理解为将原始表划分成了多个子表。可以方便的按分区对数据进行管理,例如,删除数据时更加迅速。

Partition 列可以指定一列或多列,分区列必须为 KEY 列。多列分区的使用方式在后面 多列分区 小结介绍。
不论分区列是什么类型,在写分区值时,都需要加双引号
分区数量理论上没有上限。
当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。
创建分区时不可添加范围重叠的分区。


分桶(Bucket)

根据分桶列的 hash 值将数据划分成不同的 bucket。

  1. 如果使用了 Partition,则 DISTRIBUTED … 语句描述的是数据在各个分区内的划分规则。如果不使用 Partition,则描述的是对整个表的数据的划分规则。
  2. 分桶列可以选择多列,但必须为 Key 列。分桶列可以和 Partition 列相同或不同。
  3. 分桶列的选择,是在 查询吞吐查询并发 之间的一种权衡:
  • 如果选择多个分桶列,则数据分布更均匀。如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发的查询场景
  • 如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各个查询之间的 IO 影响较小(尤其当不同桶分布在不同磁盘上时),所以这种方式适合高并发的点查询场景
    分桶的数量理论上没有上限。

最佳实践

关于分桶列的选择
  1. 建议采用区分度大的列做分桶, 避免出现数据倾斜。
  2. 为方便数据恢复, 建议单个 bucket 的 size 不要太大, 保持在10GB以内, 所以建表或增加 partition 时请合理考虑 bucket 数目, 其中不同 partition 可指定不同的 buckets 数。
关于 Partition 和 Bucket 的数量和数据量的建议
  1. 一个表的 Tablet 总数量等于(Partition num * Bucket num)。
  2. 一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。
  3. 单个 Tablet 的数据量理论上没有上下界,但建议在 1G - 10G 的范围内。如果单个 Tablet 数据量过小,则数据的聚合效果不佳,且元数据管理压力大。如果数据量过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。
  4. 当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则
  5. 在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。
  6. 一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。例如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度
分区、分桶标准参考(来自官网)
  • 分桶:
    假设在有10台 BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个分片。5GB:8-16个分片。50GB:32个分片。

  • 分区:(500G才建议分区)
    500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。

说明:
表的数据量可以通过 SHOW DATA 命令查看,结果除以副本数,即表的数据量。

复合分区与单分区

复合分区

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

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

  1. 历史数据删除需求:如有删除历史数据的需求(例如仅保留最近 N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE 语句进行数据删除。
  2. 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。

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

常见问题

Failed to create partition [xxx] . Timeout

Doris 建表是按照 Partition 粒度依次创建的。当一个 Partition 创建失败时,可能会报这个错误。即使不使用 Partition,当建表出现问题时,也会报 Failed to create partition,因为如前文所述,Doris 会为没有指定 Partition 的表创建一个不可更改的默认的 Partition。
当遇到这个错误是,通常是 BE 在创建数据分片时遇到了问题。可以参照以下步骤排查:

  1. 在 fe.log 中,查找对应时间点的 Failed to create partition 日志。在该日志中,会出现一系列类似 {10001-10010} 字样的数字对。数字对的第一个数字表示 Backend ID,第二个数字表示 Tablet ID。如上这个数字对,表示 ID 为 10001 的 Backend 上,创建 ID 为 10010 的 Tablet 失败了。
  2. 前往对应 Backend 的 be.INFO 日志,查找对应时间段内,tablet id 相关的日志,可以找到错误信息。
  3. 以下罗列一些常见的 tablet 创建失败错误,包括但不限于:
  4. BE 没有收到相关 task,此时无法在 be.INFO 中找到 tablet id 相关日志或者 BE 创建成功,但汇报失败。以上问题,请检查 FE 和 BE 的连通性。
  5. 预分配内存失败。可能是表中一行的字节长度超过了 100KB。
  6. Too many open files。打开的文件句柄数超过了 Linux 系统限制。需修改 Linux 系统的句柄数限制。
    如果创建数据分片时超时,也可以通过在 fe.conf 中设置 tablet_create_timeout_second=xxx 以及 max_create_table_timeout_second=xxx 来延长超时时间。其中 tablet_create_timeout_second 默认是1秒,max_create_table_timeout_second 默认是60秒,总体的超时时间为 min(tablet_create_timeout_second * replication_num, max_create_table_timeout_second),具体参数设置参见 FE 配置项 。

你可能感兴趣的:(Doris,数据库,java,服务器)