SHOW-LOAD
SHOW LOAD
Description
该语句用于展示导入任务的执行情况。
SHOW LOAD
[FROM db_name]
[
WHERE
[LABEL [ = "your_label" | LIKE "label_matcher"]]
[STATE = ["PENDING"|"LOADING"|"FINISHED"|"CANCELLED"|]]
]
[ORDER BY ...]
[LIMIT limit][OFFSET offset];
-
db_name
查看指定数据库下的导入作业。如不指定,使用当前默认数据库。
-
LABEL
Label 可以通过等值进行精确匹配,也可以通过 Like 进行模糊匹配。
-
STATE
查看指定状态的导入任务。
- PENDING:导入已提交,但未开始执行。
- LOADING:导入正在进行。
- FINISHED:导入结束并且导入成功。
- CANCELLED:导入失败。
-
ORDER BY ... LIMIT [OFFSET]
可以指定对结果的任意列进行排序。
ORDER BY createtime DESC LIMIT 10,20
SHOW LOAD 命令的返回结果如下:
mysql> show load order by createtime desc limit 1\G
*************************** 1. row ***************************
JobId: 76391
Label: label1
State: FINISHED
Progress: ETL:N/A; LOAD:100%
Type: BROKER
EtlInfo: unselected.rows=4; dpp.abnorm.ALL=15; dpp.norm.ALL=28133376
TaskInfo: cluster:N/A; timeout(s):10800; max_filter_ratio:5.0E-5
ErrorMsg: N/A
CreateTime: 2019-07-27 11:46:42
EtlStartTime: 2019-07-27 11:46:44
EtlFinishTime: 2019-07-27 11:46:44
LoadStartTime: 2019-07-27 11:46:44
LoadFinishTime: 2019-07-27 11:50:16
URL: http://192.168.1.1:8040/api/_load_error_log?file=__shard_4/error_log_insert_stmt_4bb00753932c491a-a6da6e2725415317_4bb00753932c491a_a6da6e2725415317
JobDetails: {"Unfinished backends":{"9c3441027ff948a0-8287923329a2b6a7":[10002]},"ScannedRows":2390016,"TaskNumber":1,"All backends":{"9c3441027ff948a0-8287923329a2b6a7":[10002]},"FileNumber":1,"FileSize":1073741824}
下面主要介绍了查看导入命令返回结果集中参数意义:
-
JobId
导入任务的唯一ID,每个导入任务的 JobId 都不同,由系统自动生成。与 Label 不同的是,JobId永远不会相同,而 Label 则可以在导入任务失败后被复用。
-
Label
导入任务的标识。
-
State
导入任务当前所处的阶段。在 Broker load 导入过程中主要会出现 PENDING 和 LOADING 这两个导入中的状态。如果 Broker load 处于 PENDING 状态,则说明当前导入任务正在等待被执行;LOADING 状态则表示正在执行中。
导入任务的最终阶段有两个:CANCELLED 和 FINISHED,当 Load job 处于这两个阶段时,导入完成。其中 CANCELLED 为导入失败,FINISHED 为导入成功。
-
Progress
导入任务的进度描述。分为两种进度:ETL 和 LOAD,对应了导入流程的两个阶段 ETL 和 LOADING。目前 Broker load 由于只有 LOADING 阶段,所以 ETL 则会永远显示为
N/A
LOAD 的进度范围为:0~100%。
LOAD 进度 = 当前完成导入的表个数 / 本次导入任务设计的总表个数 * 100%
如果所有导入表均完成导入,此时 LOAD 的进度为 99% 导入进入到最后生效阶段,整个导入完成后,LOAD 的进度才会改为 100%。
导入进度并不是线性的。所以如果一段时间内进度没有变化,并不代表导入没有在执行。
-
Type
导入任务的类型。Broker load 的 type 取值只有 BROKER。
-
EtlInfo
主要显示了导入的数据量指标
unselected.rows
,dpp.norm.ALL
和dpp.abnorm.ALL
。用户可以根据第一个数值判断 where 条件过滤了多少行,后两个指标验证当前导入任务的错误率是否超过max_filter_ratio
。三个指标之和就是原始数据量的总行数。
-
TaskInfo
主要显示了当前导入任务参数,也就是创建 Broker load 导入任务时用户指定的导入任务参数,包括:
cluster
,timeout
和max_filter_ratio
。 -
ErrorMsg
在导入任务状态为CANCELLED,会显示失败的原因,显示分两部分:type 和 msg,如果导入任务成功则显示
N/A
。type的取值意义:
USER_CANCEL: 用户取消的任务 ETL_RUN_FAIL:在ETL阶段失败的导入任务 ETL_QUALITY_UNSATISFIED:数据质量不合格,也就是错误数据率超过了 max_filter_ratio LOAD_RUN_FAIL:在LOADING阶段失败的导入任务 TIMEOUT:导入任务没在超时时间内完成 UNKNOWN:未知的导入错误
-
CreateTime/EtlStartTime/EtlFinishTime/LoadStartTime/LoadFinishTime
这几个值分别代表导入创建的时间,ETL阶段开始的时间,ETL阶段完成的时间,Loading阶段开始的时间和整个导入任务完成的时间。
Broker load 导入由于没有 ETL 阶段,所以其 EtlStartTime, EtlFinishTime, LoadStartTime 被设置为同一个值。
导入任务长时间停留在 CreateTime,而 LoadStartTime 为 N/A 则说明目前导入任务堆积严重。用户可减少导入提交的频率。
LoadFinishTime - CreateTime = 整个导入任务所消耗时间 LoadFinishTime - LoadStartTime = 整个 Broker load 导入任务执行时间 = 整个导入任务所消耗时间 - 导入任务等待的时间
-
URL
导入任务的错误数据样例,访问 URL 地址既可获取本次导入的错误数据样例。当本次导入不存在错误数据时,URL 字段则为 N/A。
-
JobDetails
显示一些作业的详细运行状态。包括导入文件的个数、总大小(字节)、子任务个数、已处理的原始行数,运行子任务的 BE 节点 Id,未完成的 BE 节点 Id。
{"Unfinished backends":{"9c3441027ff948a0-8287923329a2b6a7":[10002]},"ScannedRows":2390016,"TaskNumber":1,"All backends":{"9c3441027ff948a0-8287923329a2b6a7":[10002]},"FileNumber":1,"FileSize":1073741824}
其中已处理的原始行数,每 5 秒更新一次。该行数仅用于展示当前的进度,不代表最终实际的处理行数。实际处理行数以 EtlInfo 中显示的为准。
Example
-
展示默认 db 的所有导入任务
SHOW LOAD;
-
展示指定 db 的导入任务,label 中包含字符串 "2014_01_02"。
SHOW LOAD FROM example_db WHERE LABEL LIKE "2020_01_02" LIMIT 10;
-
展示指定 db 的导入任务,指定 label 为 "load_example_db_20140102" 并按 LoadStartTime 降序排序。
SHOW LOAD FROM example_db WHERE LABEL = "load_example_db_20200102" ORDER BY LoadStartTime DESC;
-
展示指定 db 的导入任务,指定 label 为 "load_example_db_20140102" ,state 为 "loading", 并按 LoadStartTime 降序排序
SHOW LOAD FROM example_db WHERE LABEL = "load_example_db_20140102" AND STATE = "loading" ORDER BY LoadStartTime DESC;
-
展示指定 db 的导入任务 并按 LoadStartTime 降序排序,并从偏移量5开始显示10条查询结果
SHOW LOAD FROM example_db ORDER BY LoadStartTime DESC limit 5,10; SHOW LOAD FROM example_db ORDER BY LoadStartTime DESC limit 10 offset 5;
Keywords
SHOW, LOAD
最佳实践
-
和 LOAD 命令配合使用
建议用户通过
SHOW LOAD
命令以轮询方式查看提交的导入任务的状态。比如对于一个指定 Label 的导入任务,以10秒或更久的间隔来轮询查看导入的状态,并根据状态进行下一步操作。比如等待上一批提交的导入任务完成后,再进行下一批次的提交,或者对失败的任务进行重试。
-
查询相同 Label 的多个导入任务。
如果一个 Label 对应的导入任务失败,则用户可以继续使用该 Label 重新提交任务。这种情况下,查询该 Label 会返回多个导入作业(包括新提交的和之前失败的)。此时若想查询最新的提交,则可以使用以下命令:
SHOW LOAD WHERE LABEl="my_label" ORDER BY createtime DESC LIMIT 1;
-
查看数据质量问题
如果导入任务失败且错误信息为
ETL_QUALITY_UNSATISFIED
,则说明存在导入质量问题。其实在URL
字段会给出一个连接。可以通过以下命令查看该链接中给出的错误数据信息:SHOW LOAD WARNINGS ON "your_url";
以下列举一些常见的数据质量问题:
-
no partition for this tuple
该行数据在表中没有对应的分区。需检查数据是否落在表的分区范围内。
-
null is not allowed for bitmap column
不允许想 bitmap 类型字段导入 null 值。
-
the length of input is too long than schema
字符串的长度超过了列定义的长度。需考虑增加 VARCHAR 列的定义最大长度。
-
decimal value is not valid for definition
Decimal 类型精度不匹配。
-
Content of HLL type column is invalid
HLL 列对应的数值类型不对。需检查是否使用了 hll_hash 函数对数据进行了转换。
-
null value for not null column
尝试将 null 值导入不允许为 null 的列。
-
Parse json data for JsonDoc failed
解析 Json 数据失败。
-
JSON Root not found
给定的 json_root 未匹配。
-
JSON data is array-object, strip_outer_array must be TRUE.
strip_outer_array
为 false,但是 Json 数据是一个数组。 -
JSON data is not an array-object, strip_outer_array must be FALSE
strip_outer_array
为 true,但是 Json 数据不是一个数组。 -
Json value is null, but the column xx is not nullable
导入 Json 数据时,尝试将 null 导入到不能为 null 的字段。
-
The column xx is not nullable, but it's not found in jsondata.
导入 Json 数据时,没有匹配到字段,且列不能为 null。
-
All fields is null, this is a invalid row.
导入 Json 数据时,一行中的所有字段名都无法匹配到数据。
-
Empty json line
空的 Json 数据。
-
data is not encoded by UTF-8
源数据不是 UTF-8 编码的。
-
actual column number is less than schema column number.
源数据中的列数比表中的列数少。
-
actual column number is more than schema column number.
源数据中的列数比表中的列数多。
-
column xx value is incorrect while strict mode is true
在 严格模式 下,源数据被类型转换成了 null。
-
column xx value is null while columns is not nullable
尝试将 null 值导入不允许为 null 的列。
-
-
查看作业执行进度
因为返回结果中
Progress
字段显示的进度不是线性的。因此通过这个字段查询进度有时不太方便。此时我们还可以通过JobDetails
字段中的ScannedRows
来观察作业是否在运行。正常情况下,运行中的作业,
ScannedRows
会大约每 5 秒更新一次,表示已经读取的数据行数。但有时可能因为数据质量问题,所有的数据行都被过滤了,导致ScannedRows
一直不增长,或者为 0。此时还可以查看All backends
和Unfinished backends
两个字段。前者表示这个参与这个导入任务的所有 BE 节点,后者表示尚未完成的 BE 节点。 -
关于 TaskNumber
JobDetails
中的 TaskNumber 字段不表示导入作业的并发度。这个仅表示 LOAD 语句中DATA INFILE
子句的个数。