DLA的查询默认是同步执行的,也就是说客户端到DLA的连接会一直等待服务端,直到返回查询结果。但是对于一些大规模的ETL,比如 INSERT INTO SELECT FROM这类语句,如果数据量大的话,它的执行时间很长。如果服务端长时间不返回任何数据给客户端,连接可能会中断,因此就有了异步执行的概念。异步执行的场景下,用户提交一个SQL,服务端马上返回一个ID,后续用户可以根据这个ID来查询SQL的执行情况。

语法结构

​mysql -h<end_point_host> -P<end_point_port>  -u<user_name> -p<password> -c -A
……………………
mysql> use public_dataset_tpch_1x_text;
Database changed
mysql> /*+ run-async=true */select count(*) from customer;
+--------------------------------+
| ASYNC_TASK_ID                  |
+--------------------------------+
| q202006161430hz89aab7ef0245339 |
+--------------------------------+
1 row in set (0.04 sec)

MySQL 5.7.7及以下版本的MySQL client默认发送到服务器的SQL statements中删除 comments(包括优化器提示)。如果您使用低于MySQL 5.7.7的版本,需要使用 -c 选项支持添加comments(包括优化器提示) 提示。

通用类

run-async

  • 含义: 是否异步执行。
  • 取值范围: true, false, 默认false。

max-running-time-sec

  • 含义: 查询最大执行的时间,单位是秒。
  • 取值范围: 大于0的整数,时间不要超过6个小时。

这个hint可以控制SQL执行的时间,如果超过这个时间,SQL就被系统自动终止掉。

join-distribution-type

  • 含义: 表在JOIN的时候使用的数据分发类型。
  • 取值范围: AUTOMATIC/BROADCAST/PARTITIONED
  • 默认值: AUTOMATIC

如果右表比较小能够放进内存,采用BROADCAST会极大的提高查询的性能。而PARTITIONED没有这个限制,所以可以支持更大的JOIN,但是对于小表JOIN性能较差。

cluster

  • 含义: 指定查询要发送到的资源池。
  • 取值范围: -

OSS

insert-overwrite-ignore-conflict

  • 含义: 执行insert overwrite时,如果写入的目标目录已经存在,是否强制覆盖。如果指定为false,则只会覆盖元数据中有记录的目标记录。如果为true,则无论如何都会覆盖。
  • 取值范围: true/false
  • 默认值: false

JDBC

jdbc-scan-splits

  • 含义: 控制在查询JDBC类数据源时,拆分多少个split来获取数据
  • 取值范围: 1 - 500
  • 默认值: 1

jdbc-split-column

  • 含义: 查询JDBC类数据源时,选择哪一列作为切分列,注意,切分列的类型只支持INT/BIGINT和带索引的CHAR/VARCHAR类型,如果选择的切分列不属于上述类型,执行引擎会自动忽略这个参数。
  • 取值范围: 列名
  • 默认值: 无

ots-query-version

  • 含义: 是否启动V2新版本协议来查询
  • 取值范围: 1, 2
  • 默认值: 2

ots-filter-version

  • 含义: 是否启动V2新版本的filter来查询
  • 取值范围: 1, 2
  • 默认值: 2

ots-split-unit-mb

  • 含义: split默认的切分单位
  • 取值范围: 1, 2
  • 默认值: 2

ots-fetch-size

  • 含义:每次请求 TableStore 返回的数据行数
  • 取值范围:100,100000
  • 默认值:10000

ots-start-version

  • 含义:数据版本起点,是一个时间戳(millisecond),为了快速过滤掉大量的多版本数据
  • 默认值: -1

ots-end-version

  • 含义:数据版本终点,是一个时间戳(millisecond),为了快速过滤掉大量的多版本数据
  • 默认值: -1

ots-split-optimize

  • 含义: 是否启动split的分组重排等优化逻辑
  • 取值范围: true/false
  • 默认值: false

ots-split-size-ratio

  • 含义: 启动split的分组重排等优化逻辑之后,希望split的数量
  • 取值范围: 0.0001 - 1.0
  • 默认值: 0.5

ots-partition-prune

  • 含义: 是否启动split的范围再做裁剪优化,加快性能
  • 取值范围: true/false
  • 默认值: true

ots-insert-as-update

  • 含义: 是否使用update功能来替换insert
  • 取值范围: true/false
  • 默认值: false

ots-loose-cast

  • 含义: 是否允许使用宽松的cast(比如long值到double,double到long)
  • 取值范围: true/false
  • 默认值: false

ots-index-first

  • 含义: 是否对于某些满足条件的表做索引优先查询。
  • 取值范围
    • auto: 会寻找与表相关的索引,只要有满足条件的索引,就会强制使用
    • custom: 根据用户选择表列表,来自动选择满足条件的索引。其中tbl1不需要显示指定库名,是因为当前连接上已经绑定了一个库(比如use xxx)。如下case中,只有tbl1和tbl2会走索引,而tbl3则不会:
​/*+ ots-index-first=[tbl1, dla_schema2.tbl2, ...] */ select * from tbl1 
join dla_schema2.tbl2 join dla_schema3.tbl3 where ...​
  • threshold: 根据当前条件匹配的数据量来动态决策,如果找到一个索引,其匹配的数据量小于一定的行数或者一定比例,那就会自动选择。threshold:200表示where条件匹配的行数不超过200行才会使用,而threshold:5%则表示匹配的比例不超过5%才会使用(至于200和5%,DLA内部会调用Table Store的count接口做快速测试并预估判断)
​/*+ ots-index-first=threshold:200 */ select * from tbl1 where ...
/*+ ots-index-first=threshold:5% */ select * from tbl1 where ...​
  • 默认值: 不使用索引

ots-index-parallel-scan-mode

  • 含义:是否使用 TableStore 的并发导出功能。
  • 取值范围:true, false
  • 默认值:false (默认情况下不使用并发导出功能)

更多详情以及注意事项请参见:https://developer.aliyun.com/article/776638?groupCode=datalakanalytics

消息通知

DLA支持对SQL在执行完成之后进行异步通知,目前支持两种通知渠道,对应的hint组合如下:

ONS

​/*+ run-async=true, mq-notify-by=ons, mq-topic=${您的ons的topic}, 
mq-producer-id=${您的group Id}, mq-endpoint=${您的某个endpoint,与DLA所在region相同} */​
  • mq-notify-by: 消息渠道的名称
  • mq-topic: ons的topic
  • mq-producer-id: ons的group Id
  • mq-endpoint: ons的endpoint

MNS

/*+ run_async=true, mq-notify-by=mns, mq-queue=${您的mns队列} */
  • mq-notify-by: 消息渠道的名称
  • mq-queue: 您的mns队列

异步查询结果导出

当你使用异步执行的时候,执行的结果会被导出到OSS上,默认保存的CSV格式的,我们也提供了一些hint可以对保存的格式进行调整:

​/*+ force-persist-result=true, result-file-format=csv, result-col-del=[,], 
result-row-del=\r\n, result-meta-included=true */ 
select * from tbl1 ...​

异步导出到OSS是写入到OSS是单线程执行,如果数据量较大,执行速度会很慢。如果导出大量数据,建议新建一个OSS的表,再写入。

  • result-file-format: 目前支持csv/json。
  • result-col-del: 列分隔符(只有在格式为CSV的时候才有作用)
  • result-row-del: 行分隔符(只有在格式为CSV的时候才有作用)
  • result-meta-included: 是否要在第一行输出列名称(默认是不包含的)
  • result-oss-location: 结果文件的OSS目录。

很多客户希望用’,’而不是’|’作为分隔符,因为’,’本身有特殊语义,目前通过[,]来转义,比如result-col-del=[,], result-row-del=\r\n

有时候我们使用同步查询的时候也想把结果保存一份到OSS上,可以用这个hint:

  • force-persist-result=true