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