跳到主要内容

最佳实践

本文档主要用于介绍在进行数据导出操作中,如何判断资源利用是否合理,以及如何调整资源利用率已达到更好的数据导出效率。

SELECT INTO OUTFILE

  1. 开启并行导出

    SELECT INTO OUTFILE 返回的行数即代表并行的 Writer 数量。Writer 的数量越多,则导出的并发度越高,但写出的文件数量也会越多。如果发现只有一个 Writer,则可以尝试开启并行导出功能。

    SET enable_parallel_outfile=true

    开启后,SELECT INTO OUTFILE 操作为根据查询的并行度来生成对应数量的 Writer。查询并行度由会话变量 parallel_pipeline_task_num 控制。默认为单 BE CPU 核数的一半。

    比如在一个 3 BE 节点的集群中,每个节点的 CPU 核数为 8。则开启并行导出情况下,会产生(4*3=)12 个 Writer。

    注意,即使开启了并行导出功能,也不是所有查询都能够并行导出。比如查询中包含全局排序、聚合语义时,则是无法并行导出的。如:

    SELECT * FROM table ORDER BY id;

    SELECT SUM(cost) FROM table;
  2. 判断导出速度

    SELECT INTO OUTFILE 返回的每一行结果中,都带有对应的 Writer 的写出时的时间(单位:秒)和速度(单位:KB/s)。

    将同一个节点的多个 Writer 的速度相加,即为单个节点的写出速度。可以用这个速度,和磁盘带宽(比如导出到本地)或网络带宽(比如导出到对象存储)进行比较,看是否已经达到带宽瓶颈。

Export

  1. 根据返回结果判断导出执行情况

    Export 命令本质上是将任务拆分成多个 SELECT INTO OUTFILE 子句进行执行。

    通过 SHOW EXPORT 命令返回的结果中包含一个 Json 字符串,是一个二维数组。第一维代表 Export 并发的线程数,并发多少个线程代表并发发起了多少个 Outfile 语句。第二维代表单个 Outfile 语句的返回结果。示例:

    [
    [
    {
    "fileNumber": "1",
    "totalRows": "640321",
    "fileSize": "350758307",
    "url": "file:///127.0.0.1/mnt/disk2/ftw/tmp/export/exp_59fd917c43874adc-9b1c3e9cd6e655be_*",
    "writeTime": "17.989",
    "writeSpeed": "19041.66"
    },
    {...},
    {...},
    {...}
    ],
    [
    {
    "fileNumber": "1",
    "totalRows": "646609",
    "fileSize": "354228704",
    "url": "file:///127.0.0.1/mnt/disk2/ftw/tmp/export/exp_c75b9d4b59bf4943-92eb94a7b97e46cb_*",
    "writeTime": "17.249",
    "writeSpeed": "20054.64"
    },
    {...},
    {...},
    {...}
    ]
    ]

    上面的示例中,发起了 2 个 Outfile 命令。每个命令有 4 个 Writer 并发写出。

    通过调整 Export 命令属性中的 parallelism 参数,可以控制并发 Outfile 的个数,从而控制并发度。