doris通关之分区分桶调优

doris通关之分区分桶调优

  • 1.名词解释
  • 2.数据分布
    • 2.1.分区列如何选择
    • 2.2.分桶列如何选择
    • 2.3.分桶数如何确定
  • 3.最佳实践
  • 4.分区、分桶常用命令

分区分桶是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能。主要是指分区、分桶上做文章。首先介绍几个常用名词

1.名词解释

  • 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能。

  • 短查询:short-scan query,指扫描数据量不大,单机就能完成扫描的查询。

  • 长查询:long-scan query,指扫描数据量大,多机并行扫描能显著提升性能的查询,OLAP基本属于长查询。

  • 离散系数:离散系数又称变异系数,是统计学当中的常用统计指标。离散系数是测度数据离散程度的相对统计量,其定义为标准差与平均值之比,主要是用于比较不同样本数据的离散程度。离散系数大,说明数据的离散程度也大;离散系数小,说明数据的离散程度也小。

2.数据分布

DorisDB使用先分区后分桶的方式, 可灵活地支持支持二种分布方式:

  • Hash分布: 不采用分区方式, 整个table作为一个分区, 指定分桶的数量
  • Range-Hash的组合数据分布: 即指定分区数量, 指定每个分区的分桶数量

2.1.分区列如何选择

分区的主要作用是将整个分区作为管理单位, 选择存储策略, 比如副本数, 冷热策略和存储介质等等。一般选取时间列作为分区键,具体划分的粒度视数据量而定,单个分区原始数据量建议维持在100G以内。通过DorisDB的分区裁剪功能,最大限度地减少扫描数据量,从而提高查询性能。DorisDB支持在一个集群内使用多种存储介质(SATA/SSD)。用户可以将最新数据所在的分区放在SSD上,利用SSD的随机读写性能来提高查询性能。而老的数据可以放在SATA盘上,以节省数据存储的成本。

2.2.分桶列如何选择

DorisDB采用Hash算法作为分桶算法,同一分区内, 分桶键的哈希值相同的数据形成(Tablet)子表, 子表多副本冗余存储, 子表副本在物理上由一个单独的本地存储引擎管理, 数据导入和查询最终都下沉到所涉及的子表副本上, 同时子表也是数据均衡和恢复的基本单位。

2.3.分桶数如何确定

在DorisDB系统中,分桶是实际物理文件组织的单元。数据在写入磁盘后,就会涉及磁盘文件的管理。一般而言,我们不建议分桶数过大或过小,尽量适中会比较妥当。如果单个分桶数过小,则数据的聚合效果不佳,且元数据管理压力大。如果过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)

根据经验而言,一般每个分桶的数据在1-10G,此处的10G指代的是原始数据。考虑到压缩比,压缩后磁盘上每个分桶数据文件大小在4~5G左右。这种模式在多数情况下足以满足业务需求。

建议用户根据集群规模的变化,建表时调整分桶的数量。集群规模变化,主要指节点数目的变化。假设现有100G原始数据,依照上述标准,可以建10个分桶。但是如果用户有20台机器,那么可以缩小每个分桶的数据量,加大分桶数。

3.最佳实践

对于DorisDB而言,分区和分桶的选择是非常关键的。在建表时选择好的分区分桶列,可以有效提高集群整体性能。当然,在使用过程中,也需考虑业务情况,根据业务情况进行调整。分桶列的选择,是在 查询吞吐和查询并发之间的一种权衡。

以下是针对特殊应用场景下,对分区和分桶选择的一些建议:

  • 短查询:指扫描数据量不大,单机就能完成扫描的查询,此时使用筛选条件作为分桶列,可以减少机器间的数据交换,此时doris的功能类似于单机mysql

  • 长查询:指扫描数据量大,多机并行扫描能显著提升性能,此时尽量使用多列甚至随机数作为分桶列,目的是把数据尽量打散,利用多机器并发。

4.分区、分桶常用命令

分区和分桶在建表时就已经指定,无法更改,所以此处仅给出查询命令

  • show data查看表及物化视图(ROLLUP)的数据量和副本量
SHOW DATA; #展示默认 db 的各个 table 的数据量,副本数量,汇总数据量和汇总副本数量,结果除以副本数,即表的数据量。
+-----------+-------------+--------------+
| TableName | Size        | ReplicaCount |
+-----------+-------------+--------------+
| tbl1      | 900.000 B   | 6            |
| tbl2      | 500.000 B   | 3            |
| Total     | 1.400 KB    | 9            |
| Quota     | 1024.000 GB | 1073741824   |
| Left      | 1021.921 GB | 1073741815   |
+-----------+-------------+--------------+

SHOW DATA FROM example_db.test;#展示指定 db 的下指定表的细分数据量、副本数量和统计行数
+-----------+-----------+-----------+--------------+----------+
| TableName | IndexName | Size      | ReplicaCount | RowCount |
+-----------+-----------+-----------+--------------+----------+
| test      | r1        | 10.000MB  | 30           | 10000    |
|           | r2        | 20.000MB  | 30           | 20000    |
|           | test2     | 50.000MB  | 30           | 50000    |
|           | Total     | 80.000    | 90           |          |
+-----------+-----------+-----------+--------------+----------+
  • show partitions查询分区信息
#1.展示指定db下指定表的所有分区信息
SHOW PARTITIONS FROM example_db.table_name; 
#2.展示指定db下指定表的指定分区的信息
SHOW PARTITIONS FROM example_db.table_name WHERE PartitionName = "p1";
#3.展示指定db下指定表的最新分区的信息        
SHOW PARTITIONS FROM example_db.table_name ORDER BY PartitionId DESC LIMIT 1;
  • show tablet查询tablet相关的信息(仅管理员使用)
语法:
    SHOW TABLET
    [FROM [db_name.]table_name | tablet_id] [partiton(partition_name_1, partition_name_1)]
    [where [version=1] [and backendid=10000] [and state="NORMAL|ROLLUP|CLONE|DECOMMISSION"]]
    [order by order_column]
    [limit [offset,]size]

现在show tablet命令支持按照按照以下字段进行过滤:partition, index name, version, backendid,
state,同时支持按照任意字段进行排序,并且提供limit限制返回条数。

你可能感兴趣的:(数据仓库,大数据)