basicdatasource 如何设定update返回行数_DLA如何像MySQL那样管理任务、kill Query等

701e58fe7881ee3fdd3a08477a08e044.png

一、背景介绍

Data Lake Analytics(简称DLA,控制台:https://openanalytics.console.aliyun.com/)作为阿里云上数据湖分析产品,经常需要执行很多长时间运行的任务,有些还是通过异步方式(https://zhuanlan.zhihu.com/p/55068247)来提交的,并且长时间任务经常需要消耗较大的资源和成本,因此管理好这些长任务是必须的。

DLA一直在不断完善过程中,针对任务管理主要有以下几个命令,一一解读。

二、SHOW PROCESSLIST

在MySQL(https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html)中,show processlist是为了查看server端中各个线程(或链接)上的运行情况:

mysql> show processlistG

*************************** 1. row ***************************
       Id: 16777224                            -- 连接id
     User: oa_1xxxxxxxxxx7597c                 -- dla账号 
     Host: 212.20.110.21:7320                  -- 客户端的ip和port
       db: tpch_50x_text                       -- 连接上绑定的schema(use database)
  Command: SELECT                              -- 当前SQL类型
     Time: 1                                   -- SQL执行实现
    State: RUNNING                             -- SQL状态
     Info: select count(*) from lineitem       -- 实际的SQL
ProcessId: q201908070004sh0aa2bf4a0001009      -- ProcessId,用来排查各种问题的
1 row in set (0.08 sec)

因为JDBC/MySQL是BIO模式,且视角都是从连接出发,因此线程==连接。但是,在DLA中,因为支持异步执行,在同一时刻存在多个SQL在同一个连接上执行,所以展示的视角还是从Query出发,未来可以完全对齐MySQL的实现。

三、SHOW QUERY_TASK

在DLA中,show query_task主要查看SQL执行历史(当然,有一定的保存时间)以及其他相关信息,可以有多种方法来使用:

mysql> show query_task limit 1G

*************************** 1. row ***************************
                  id: q201908070004sh0aa2bf4a0001009   -- ProcessId,用来排查各种问题的
        mpp_query_id: 20190807_000457_162_dxdss        -- 内部的执行引擎的id
              status: SUCCESS                          -- SQL执行状态
           task_name: SELECT
        table_schema: tpch_50x_text
          creator_id: oa_1xxxxxxxxxx7597c
         create_time: 2019-08-07 00:04:58.0
         update_time: 2019-08-07 00:05:00.0
       connection_id: 16777224                         -- 所在连接id
             message:                                  -- 出错时信息
           row_count: 1                                -- 返回数据行数
         elapse_time: 2601                             -- 消耗的时间(ms)
   scanned_row_count: 300005316                        -- 扫描行数
  scanned_data_bytes: 39532662007                      -- 扫描数据量(bytes)
result_file_oss_file: NULL                             -- 结果文件存储的oss地址
    cancellable_task: 0
     sub_query_count: 0
             command: select count(*) from lineitem... -- 实际的命令,截断后的SQL
          mq_product: NULL                             -- 如果有消息通知,如下都是消息相关
            mq_model: NULL
            mq_topic: NULL
            mq_queue: NULL
      mq_producer_id: NULL
         mq_endpoint: NULL
           mq_status: NULL
        mq_error_msg: NULL
       mq_message_id: NULL
       mq_total_time: NULL
1 row in set (0.07 sec)

除了上面的用法,还有如下几种写法,方便使用:

-- 查看10条日志(默认按照create time倒排)
show query_task limit 10;  

-- 查看08-07之前的数据
show query_task where create_time < '2019-08-07' limit 1;  

-- 查看完整的SQL信息(谨慎使用)
show full query_task limit 1;  

-- 直接通过一个ProcessId来查询某条记录,快速排查问题
show query_task where id = 'q201908070004sh0aa2bf4a0001009' 

四、SELECT CONNECTION_ID()

如果想在SQL中了解当前connection的id,可以执行:

mysql> select connection_id();

+-----------------+
| connection_id() |
+-----------------+
|        16777234 |
+-----------------+
1 row in set (0.05 sec)

早期DLA还没有实现内部节点全局通信以及全局connection id分配机制,导致连接的id分配有问题,从而又导致各种kill命令不生效。不过最近通过内部的协调机制解决了这个问题,因此目前这个id是在DLA的分布式集群内是唯一的。

五、KILL CONNECTION/QUERY

在近期DLA实现了内部节点全局通信以及全局connection id分配机制之后,DLA的kill命令终于上线了。DLA尽可能靠近MySQL中kill(https://dev.mysql.com/doc/refman/5.7/en/kill.html)的语法和语义来实现,帮助用户快速上手使用。主要有四种用法:

  • kill连接,包括连接上所有运行的同步和异步SQL,以及未来的SQL,同时客户端需要重连
kill [connection] 123456  -- 123456一定是链接的id才行(全数字的)
  • kill连接上的query,包括连接上所有运行的同步和异步SQL,但不包括后续的SQL,客户端也无需重连;
kill query 123456  -- 123456一定是链接的id才行(全数字的)
  • kill某个query,包括连接上所有运行的同步SQL和异步SQL,以及未来的SQL;总之,客户端一定要重连才行;
kill query q201908070025sh0aa2bf4a0003001  -- q2019...一定是Query的id才行
  • 在MySQL-cli等工具中,执行SQL后及时Ctrl+C,会自动发送kill query 命令:
mysql> select count(*) from lineitem join customer on  l_comment = c_comment;
^C^C -- query aborted
ERROR 30101 (HY000): ProcessId=q201908070025sh0aa2bf4a0003001, .... because Query was canceled

mysql> show query_task limit 2G
*************************** 1. row ***************************
                  id: q201908070034sh0aa2bf4a0003540
              status: SUCCESS
           task_name: KILL
             command: KILL QUERY 16777224...                 -- 这个是由MySQL-cli自动发送的命令
*************************** 2. row ***************************
                  id: q201908070025sh0aa2bf4a0003001
              status: CANCELLED                              -- 这个状态改为CANCELLED
           task_name: SELECT
        table_schema: tpch_50x_text
         elapse_time: 2370                                   -- 会正常统计时间
   scanned_row_count: 40467370                               -- 会统计行数,且会计费
  scanned_data_bytes: 5569147189                             -- 会统计行数,且会计费 
             command: select count(*) from lineitem join customer on  l_comment = c_comment...
2 rows in set (0.05 sec)

另外,考虑到整个DLA的SQL引擎是一个分布式系统,有时候因为通信、延迟、调度等各种问题,不能及时kill掉SQL(比如时机太晚了)或者kill出错(比如SQL已经不存在了)时,请您理解。如果有非预期行为请及时反馈给DLA的开发同学。谢谢。

六、其他相关

其他文档:https://zhuanlan.zhihu.com/data-lake-analytics

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值