跳到主要内容
版本:2.5

SHOW LOAD

功能

查看数据库中指定导入作业的相关信息,包括 Broker LoadSpark LoadINSERT 。您还可以使用 curl 命令查看这些导入作业的相关信息。详请参见从 HDFS 或外部云存储系统导入数据使用 Apache Spark™ 批量导入通过 INSERT 语句导入数据

除了以上三种导入方式, StarRocks 还支持 Stream Load 和 Routine Load,其中 Stream Load 是同步操作,会直接返回结果,不会通过 SHOW LOAD 展示。Routine Load 可通过 SHOW ROUTINE LOAD 查看导入作业的相关信息。

语法

SHOW LOAD [ FROM db_name ]
[
WHERE [ LABEL { = "label_name" | LIKE "label_matcher" } ]
[ [AND] STATE = { "PENDING" | "ETL" | "LOADING" | "FINISHED" | "CANCELLED" } ]
]
[ ORDER BY field_name [ ASC | DESC ] ]
[ LIMIT { [offset, ] limit | limit OFFSET offset } ]

说明

返回结果中的字段较多,可使用\G分行,如 SHOW LOAD WHERE LABEL = "label1"\G;。详情参见示例一

参数说明

参数必选说明
db_name数据库名称。如不指定该参数,则默认查看当前数据库的导入作业。
LABEL = "label_name"导入作业标签。
LABEL LIKE "label_matcher"查看标签中包含 label_matcher 的导入作业。
AND
  • 如果只使用其中一个过滤条件,则不需要指定该关键字。例如 WHERE STATE = "PENDING"
  • 如使用其中任意两个或三个过滤条件,则需要指定该关键字。例如 WHERE LABEL = "label_name" AND STATE = "PENDING"
STATE导入作业的状态。不同的导入方式有不同的导入作业状态,具体如下:
  • Broker Load
    • PENDING:导入作业已创建。
    • QUEUEING:导入作业正在等待执行中。
    • LOADING:导入作业正在执行中。
    • PREPARED:事务已提交。
    • FINISHED:导入作业成功。
    • CANCELLED:导入作业失败。
  • Spark Load
    • PENDING:准备 ETL 任务的相关配置并提交 ETL 任务到 Apache Spark™ 集群。
    • ETL:Spark 集群执行 ETL 任务,并将结果数据写入 Spark 的 HDFS 中。
    • LOADING:正在将 HDFS 源数据导入到 StarRocks 的目标表中。
    • PREPARED:事务已提交。
    • FINISHED:导入作业成功。
    • CANCELLED:导入作业失败。
  • INSERT
    • FINISHED:导入作业成功。
    • CANCELLED:导入作业失败。
如不指定 STATE 参数,则默认显示所有状态的导入作业;如指定,则显示指定状态的导入作业。例如 STATE = "PENDING" 会显示状态为 PENDING 的导入作业。
ORDER BY field_name [ASC | DESC]将返回结果按照指定字段升序或降序排列,当前支持的排序字段(field_name)包括 JobIdLabelStateProgressTypeEtlInfoTaskInfoErrorMsgCreateTimeEtlStartTimeEtlFinishTimeLoadStartTimeLoadFinishTimeURLJobDetails
  • 如要升序排列,指定 ORDER BY field_name ASC
  • 如要降序排列,指定 ORDER BY field_name DESC
如既不指定排序字段也不指定排列顺序,则默认按照 JobId 升序排列。
LIMIT limit查看指定数量的作业。如不指定该参数,则默认显示所有符合筛选条件的作业;如指定,则显示指定数量的作业。例如 LIMIT 10 会显示 10 个符合筛选条件的作业。
OFFSET offsetoffset 定义了返回结果中跳过的导入作业的数量,其默认值为 0。例如 OFFSET 5 表示跳过前 5 个导入作业,返回剩下的结果。

返回结果说明

+-------+-------+-------+----------+------+---------+----------+----------+------------+--------------+---------------+---------------+----------------+-----+------------+
| JobId | Label | State | Progress | Type | Priority | EtlInfo | TaskInfo | ErrorMsg | CreateTime | EtlStartTime | EtlFinishTime | LoadStartTime | LoadFinishTime | URL | JobDetails |
+-------+-------+-------+----------+------+---------+----------+----------+------------+--------------+---------------+---------------+----------------+-----+------------+

导入方式不同,返回结果中的字段取值也有差异,具体如下。

字段Broker LoadSpark LoadINSERT
JobId导入作业的全局唯一 ID,由 StarRocks 自动生成。同 Broker Load。同 Broker Load。
Label导入作业的标签。每个数据库中的导入作业都一个唯一的标签,不同数据库的导入作业标签可以重复。同 Broker Load。同 Broker Load。
State导入作业的状态,包括:
  • PENDING:导入作业已创建。
  • QUEUEING:导入作业正在等待执行中。
  • LOADING:导入作业正在执行中。
  • PREPARED:事务已提交。
  • FINISHED:导入作业成功。
  • CANCELLED:导入作业失败。
导入作业的状态,包括:
  • PENDING:准备 ETL 任务的相关配置并提交 ETL 任务到 Spark 集群。
  • ETL:Spark 集群执行 ETL 任务,并将结果写入 Spark 的 HDFS 中。
  • LOADING:正在将 HDFS 源数据导入到 StarRocks 的目标表中。
  • PREPARED:事务已提交。
  • FINISHED:导入作业成功。
  • CANCELLED:导入作业失败。
导入作业的状态,包括:
  • FINISHED:导入作业成功。
  • CANCELLED:导入作业失败。
Progress导入作业所处的阶段。Broker Load 导入作业只有 LOAD 阶段,对应导入作业状态中的 LOADINGLOAD 进度为 0~100%。Broker Load 没有 ETL 阶段,所以 ETL 对应的取值并无实际意义。
说明
  • LOAD 进度的计算公式为:完成数据导入的目标表的个数/导入作业中要进行数据导入的目标表的个数 * 100%。
  • 当数据导入到所有目标表中时,LOAD 进度显示为 99%, 此时,导入进入最后的生效阶段。当整个导入流程完成后,LOAD 进度才会显示为 100%。
  • 导入进度并不是线性的。如果一段时间内进度没有变化,并不代表导入没有在继续执行。
导入作业所处的阶段。Spark Load 导入作业,包括 ETLLOAD 两种阶段,分别对应导入作业状态中的 ETLLOADINGETLLOAD 进度均为 0~100%。
说明同 Broker Load。
导入作业所处的阶段。INSERT 导入作业只有 LOAD 阶段,没有 ETL 阶段,所以 ETL 对应的取值并无实际意义。LOAD 进度为 0~100%。
说明同 Broker Load。
Type导入方式,取值为 BROKER导入方式,取值为 SPARK导入方式, 取值为 INSERT
Priority导入作业的执行优先级,包括:LOWEST、LOW、NORMAL、HIGH 和 HIGHEST。--
EtlInfoETL 信息,包括以下 3 个指标:
  • unselected.rows:通过 WHERE 子句指定的条件而过滤掉的行数。
  • dpp.abnorm.ALL:因数据质量不合格而过滤掉的行数。数据质量不合格是指源表中数据类型或列数等和目标表不匹配的数据行。
  • dpp.norm.ALL:实际导入的行数。
以上三个指标之和就是数据源的总行数。您可以根据这三个指标计算当前导入作业数据质量不合格的比例是否超过 max-filter-ratio,计算公式为:dpp.abnorm.ALL/(unselected.rows + dpp.abnorm.ALL + dpp.norm.ALL)。
同 Broker Load。ETL 信息。由于 INSERT 没有 ETL 阶段,所以该参数值为 NULL
TaskInfo创建导入作业时指定的参数,包括:
  • resource:该参数在 Broker Load 导入作业中无实际意义。
  • timeout:导入作业的超时时间。单位:秒。
  • max-filter-ratio:导入作业的最大容忍率,即导入作业能够容忍的因数据不规范等原因而过滤掉的数据行所占的最大比例。
有关以上参数的详细信息,参见 BROKER LOAD
创建导入作业时指定的参数,包括:
  • resource:资源名称。
  • timeout:导入作业的超时时间。单位:秒。
  • max-filter-ratio:导入作业的最大容忍率,即导入作业能够容忍的因数据不规范等原因而过滤掉的数据行所占的最大比例。
有关以上参数的详细信息,参见 SPARK LOAD
创建导入作业时指定的参数,包括:
  • resource:该参数在 INSERT 导入作业中无实际意义。
  • timeout:导入作业的超时时间。单位:秒。
  • max-filter-ratio:该参数在 INSERT 导入作业中无实际意义。
详细信息,参见 INSERT
ErrorMsg导入作业的失败原因。当导入作业的状态为 PENDINGLOADINGFINISHED 时,该参数值为 NULL。当导入作业的状态为 CANCELLED 时,该参数值包括 typemsg 两部分:
  • type 包括如下取值:
    • USER_CANCEL:导入作业被手动取消。
    • ETL_SUBMIT_FAIL:导入任务提交失败。
    • ETL_QUALITY_UNSATISFIED:数据质量不合格,即导入作业的错误数据率超过了 max-filter-ratio
    • LOAD_RUN_FAIL:导入作业在 LOAD 阶段失败。
    • TIMEOUT:导入作业未在允许的超时时间内完成。
    • UNKNOWN:未知的导入错误。
  • msg显示有关失败原因的详细信息。
导入作业的失败原因。当导入作业的状态为 PENDINGETLLOADINGFINISHED 时,该参数值为 NULL。当导入作业的状态为 CANCELLED 时,该参数值包括 typemsg 两部分:
  • type 包括如下取值:
    • USER_CANCEL:导入作业被手动取消。
    • ETL_SUBMIT_FAIL:ETL 提交失败。
    • ETL_RUN_FAIL: ETL 执行失败。
    • ETL_QUALITY_UNSATISFIED:数据质量不合格,即导入作业的错误数据率超过了 max-filter-ratio
    • LOAD_RUN_FAIL:导入作业在 LOAD 阶段失败。
    • TIMEOUT:导入作业未在允许的超时时间内完成。
    • UNKNOWN:未知的导入错误。
  • msg显示有关失败原因的详细信息。
导入作业的失败原因。当导入作业的状态为 FINISHED 时,该参数值为 NULL。当导入作业的状态为 CANCELLED 时,该参数值包括 typemsg 两部分:
  • type 包括如下取值:
    • USER_CANCEL:导入作业被手动取消。
    • ETL_SUBMIT_FAIL:导入作业提交失败。
    • ETL_RUN_FAIL:导入作业执行失败。
    • ETL_QUALITY_UNSATISFIED:数据质量不合格,导入作业失败。
    • LOAD_RUN_FAIL:导入作业在 LOAD 阶段失败。
    • TIMEOUT:导入作业未在允许的超时时间内完成。
    • UNKNOWN:未知的导入错误。
    • TXN_UNKNOWN:事务状态未知,导入作业失败。
  • msg 显示有关失败原因的详细信息。
CreateTime导入作业创建的时间。同 Broker Load。同 Broker Load。
EtlStartTime由于 Broker Load 导入没有 ETL 阶段,所以该参数值和 LoadStartTime 相同。ETL 阶段开始的时间。由于 INSERT 导入没有 ETL 阶段,所以该参数取值和 LoadStartTime 相同。
EtlFinishTime由于 Broker Load 导入没有 ETL 阶段,所以该参数值和 LoadStartTime 相同。ETL 阶段完成的时间。由于 INSERT 导入没有 ETL 阶段,所以该参数取值和 LoadStartTime 相同。
LoadStartTimeLOAD 阶段开始的时间。同 Broker Load。同 Broker Load。
LoadFinishTime导入作业完成的时间。同 Broker Load。同 Broker Load。
URL导入作业中质量不合格数据的访问地址。您可以使用 curlwget 命令打开该地址。如果导入作业不存在质量不合格数据,该参数值为 NULL同 Broker Load。同 Broker Load。
JobDetails导入作业的其他信息,包括:
  • Unfinished backends:未完成导入的 BE 节点 ID。
  • ScannedRows:实际处理的行数,包括导入的行数以及过滤掉的行数。
  • TaskNumber:子作业个数。
  • All backends:正在运行子作业的 BE 节点的 ID。
  • FileNumber:源文件的个数。
  • FileSize:所有源文件的总数据量,单位:字节。
同 Broker Load。同 Broker Load。

注意事项

  • 导入作业相关信息具有时效性。默认自一个导入作业的完成时间 (LoadFinishTime) 起 3 天内可以查看到该导入作业的相关信息;3 天后,信息会失效,无法查到。您可以通过 FE 参数 label_keep_max_second 修改默认有效时间(单位:秒),操作如下:

    ADMIN SET FRONTEND CONFIG ("label_keep_max_second" = "value");
  • 若导入作业的 LoadStartTime 长时间为 N/A,说明导入作业堆积严重,可降低作业创建的频率。

  • 导入作业所消耗的总时长 = LoadFinishTime - CreateTime

  • LOAD 阶段所消耗的时长 = LoadFinishTime - LoadStartTime

示例

示例一:查看当前数据库中的所有导入作业。

SHOW LOAD\G;
*************************** 1. row ***************************
JobId: 976331
Label: duplicate_table_with_null
State: FINISHED
Progress: ETL:100%; LOAD:100%
Type: BROKER
Priority: NORMAL
EtlInfo: unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546
TaskInfo: resource:N/A; timeout(s):300; max_filter_ratio:0.0
ErrorMsg: NULL
CreateTime: 2022-10-17 19:35:00
EtlStartTime: 2022-10-17 19:35:04
EtlFinishTime: 2022-10-17 19:35:04
LoadStartTime: 2022-10-17 19:35:04
LoadFinishTime: 2022-10-17 19:35:06
URL: NULL
JobDetails: {"Unfinished backends":{"b90a703c-6e5a-4fcb-a8e1-94eca5be0b8f":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"b90a703c-6e5a-4fcb-a8e1-94eca5be0b8f":[10004]},"FileNumber":1,"FileSize":548622}

示例二:查看当前数据库中的导入作业。导入作业的标签中需包含字符串 null,且仅展示 2 个作业。

SHOW LOAD 
WHERE LABEL LIKE "null"
LIMIT 2;

+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JobId | Label | State | Progress | Type | EtlInfo | TaskInfo | ErrorMsg | CreateTime | EtlStartTime | EtlFinishTime | LoadStartTime | LoadFinishTime | URL | JobDetails |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10082 | duplicate_table_with_null | FINISHED | ETL:100%; LOAD:100% | BROKER | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:N/A; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:53:27 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:31 | NULL | {"Unfinished backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[10002]},"FileNumber":1,"FileSize":548622} |
| 10103 | unique_table_with_null | FINISHED | ETL:100%; LOAD:100% | SPARK | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:test_spark_resource_07af473a_1230_11ed_b483_00163e0e550b; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:56:06 | 2022-08-02 14:56:19 | 2022-08-02 14:56:41 | 2022-08-02 14:56:41 | 2022-08-02 14:56:44 | http://emr-header-1.cluster-49091:20888/proxy/application_1655710334658_26391/ | {"Unfinished backends":{"00000000-0000-0000-0000-000000000000":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"00000000-0000-0000-0000-000000000000":[-1]},"FileNumber":1,"FileSize":8790855} |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

示例三: 查看数据库 example_db 中的导入作业。导入作业的标签中需包含字符串 table,且按 LoadStartTime 降序排序。

SHOW LOAD FROM example_db 
WHERE LABEL Like "table"
ORDER BY LoadStartTime DESC;

+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JobId | Label | State | Progress | Type | EtlInfo | TaskInfo | ErrorMsg | CreateTime | EtlStartTime | EtlFinishTime | LoadStartTime | LoadFinishTime | URL | JobDetails |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10103 | unique_table_with_null | FINISHED | ETL:100%; LOAD:100% | SPARK | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:test_spark_resource_07af473a_1230_11ed_b483_00163e0e550b; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:56:06 | 2022-08-02 14:56:19 | 2022-08-02 14:56:41 | 2022-08-02 14:56:41 | 2022-08-02 14:56:44 | http://emr-header-1.cluster-49091:20888/proxy/application_1655710334658_26391/ | {"Unfinished backends":{"00000000-0000-0000-0000-000000000000":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"00000000-0000-0000-0000-000000000000":[-1]},"FileNumber":1,"FileSize":8790855} |
| 10082 | duplicate_table_with_null | FINISHED | ETL:100%; LOAD:100% | BROKER | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:N/A; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:53:27 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:31 | NULL | {"Unfinished backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[10002]},"FileNumber":1,"FileSize":548622} |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

示例四:查看数据库 example_db 中的导入作业。导入作业的标签需为 duplicate_table_with_null,状态需为 FINISHED

SHOW LOAD FROM example_db 
WHERE LABEL = "duplicate_table_with_null" AND STATE = "FINISHED";

+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+----------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JobId | Label | State | Progress | Type | EtlInfo | TaskInfo | ErrorMsg | CreateTime | EtlStartTime | EtlFinishTime | LoadStartTime | LoadFinishTime | URL | JobDetails |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+----------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10082 | duplicate_table_with_null | FINISHED | ETL:100%; LOAD:100% | BROKER | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:N/A; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:53:27 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:30 | 2022-08-02 14:53:31 | NULL | {"Unfinished backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"4393c992-5da1-4e9f-8b03-895dc0c96dbc":[10002]},"FileNumber":1,"FileSize":548622} |
+-------+---------------------------+----------+---------------------+--------+---------------------------------------------------------+----------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

示例五:查看数据库 example_db 中的导入作业。导入作业需按 CreateTime 升序排序,并从偏移量 1 开始显示 2 条查询结果。

SHOW LOAD FROM example_db 
ORDER BY CreateTime ASC
LIMIT 2 OFFSET 1;

SHOW LOAD FROM example_db 
ORDER BY CreateTime ASC
LIMIT 1,2;

返回结果如下:

+-------+---------------------------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| JobId | Label | State | Progress | Type | EtlInfo | TaskInfo | ErrorMsg | CreateTime | EtlStartTime | EtlFinishTime | LoadStartTime | LoadFinishTime | URL | JobDetails |
+-------+---------------------------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10103 | unique_table_with_null | FINISHED | ETL:100%; LOAD:100% | SPARK | unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=65546 | resource:test_spark_resource_07af473a_1230_11ed_b483_00163e0e550b; timeout(s):300; max_filter_ratio:0.0 | NULL | 2022-08-02 14:56:06 | 2022-08-02 14:56:19 | 2022-08-02 14:56:41 | 2022-08-02 14:56:41 | 2022-08-02 14:56:44 | http://emr-header-1.cluster-49091:20888/proxy/application_1655710334658_26391/ | {"Unfinished backends":{"00000000-0000-0000-0000-000000000000":[]},"ScannedRows":65546,"TaskNumber":1,"All backends":{"00000000-0000-0000-0000-000000000000":[-1]},"FileNumber":1,"FileSize":8790855} |
| 10120 | insert_3a57b595-1230-11ed-b075-00163e14c85e | FINISHED | ETL:100%; LOAD:100% | INSERT | NULL | resource:N/A; timeout(s):3600; max_filter_ratio:0.0 | NULL | 2022-08-02 14:56:26 | 2022-08-02 14:56:26 | 2022-08-02 14:56:26 | 2022-08-02 14:56:26 | 2022-08-02 14:56:26 | | {"Unfinished backends":{},"ScannedRows":0,"TaskNumber":0,"All backends":{},"FileNumber":0,"FileSize":0} |
+-------+---------------------------------------------+----------+---------------------+--------+---------------------------------------------------------+---------------------------------------------------------------------------------------------------------+----------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+