XIHE BSP SQL开发

云原生数据仓库 AnalyticDB MySQL 版支持通过SQL开发编辑器或JDBC方式提交XIHE BSP SQL作业。本文介绍XIHE BSP SQL作业开发的适用场景、提交方法、常见配置参数及常见问题。

前提条件

  • 已在企业版、基础版或湖仓版集群中创建Job型资源组。具体操作,请参见新建资源组

  • 已创建企业版、基础版或湖仓版集群的数据库账号。

应用场景

XIHE BSP SQL作业由XIHE BSP引擎执行,适用于ETL场景、大查询、突发低优先级查询。关于XIHE BSP引擎的更多内容,请参见计算引擎

ETL场景

典型的ETL流程如下图。

image

从数据源到ADS层的数据清洗、数据转换等操作通常数据量较大,耗时较长。一般不需要关心具体查询的响应时间,只要整体ELT流程能够在特定时间点前完成,对可靠性要求更高,需要支持自动重试等能力。这部分查询可以使用XIHE BSP方式执行,充分利用XIHE BSP吞吐量大、可靠性更高、成本更低的优势。

对于ADS层的查询,通常对查询响应时间更加敏感,常要求秒级甚至毫秒级的响应,这部分查询可以使用XIHE MPP方式执行,以充分利用XIHE MPP引擎速度更快的优势。

XIHE MPP方式无法执行的大查询

由于XIHE MPP执行方式的限制,部分数据量较大的查询可能出现内存报错、查询异常等情况。如果仍要在XIHE MPP方式下执行,需要进行扩容等操作来增加更多的资源,从成本来看并不经济。此时可尝试使用XIHE BSP方式执行,查询会在指定的Job型资源组中执行数据落盘,对于大查询更加友好,且Job型资源组的资源按需申请、按需付费,成本也会更低。

突发的低优先级查询

低优先级查询通常对响应时间不敏感,但由于其突发性,系统资源可能不足,可能影响其他查询的正常执行。此时可尝试将这些低优先级查询放入Job型资源组以XIHE BSP方式执行,缓解系统的资源压力,防止查询之间的互相影响。

使用限制

  • 不支持通过XIHE BSP方式写Hudi表。

  • 不支持通过XIHE BSP方式读写Delta表。

开发XIHE BSP作业

您可以采用以下任意一种方式开发XIHE BSP作业。

使用SQL开发编辑器提交XIHE BSP作业

在SQL开发页面,选择Job型资源组和XIHE引擎,可提交XIHE BSP作业。

操作步骤

  1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

  2. 在左侧导航栏,单击作业开发 > SQL开发

  3. SQLConsole窗口,选择Job型资源组和XIHE引擎。

  4. 输入要执行的SQL语句,并单击执行SQL

  5. 等待SQL执行完成后,下方执行结果页签会显示结果。

    执行记录页签,可单击操作列的结果下载执行结果。

使用JDBC或MySQL客户端同步提交XIHE BSP作业

通过Hint方式,手动指定Job型资源组,可同步提交XIHE BSP作业。

语法

/*+ resource_group=<resource_group_name>*/ <SQL Statement>;
  • resource_group_name:Job型资源组的名称。

  • SQL Statement:SQL语句。每次执行的SQL语句前都需要添加Hint。

示例

/*+ resource_group=bsptest*/SELECT count(*) from test_db.ods_hudi;

使用JDBC或MySQL客户端异步提交XIHE BSP作业

通过Hint方式,手动指定Job型资源组并指定异步提交XIHE BSP作业。

语法

/*+ resource_group=<resource_group_name>, query_submission_type=async*/ <SQL Statement>;
  • resource_group_name:Job型资源组的名称。

  • query_submission_type=async:指定提交方式为异步提交。

  • SQL Statement:SQL语句。每次执行的SQL语句前都需要添加Hint。

示例

/*+ resource_group=bsptest, query_submission_type=async*/SELECT count(*) from test_db.ods_hudi;

异步任务提交后,会立即返回Job_id。待任务运行完成后,您可以使用SHOW job result WHERE job='Job_id';语句查询SQL的执行结果。如何查询异步任务的状态,请参见查询异步任务状态

配置XIHE BSP作业

您可以设置一个XIHE BSP作业可以使用的资源、默认超时时间和优先级。

配置方法

BSP作业的配置,可以仅对单个作业生效,可以对单个Job型资源组执行的所有作业生效,也可以对集群所有的作业生效。

仅对单个作业生效

通过Hint/*+ resource_group=<resource_group_name>,<config_name>*/,使作业配置只对单个作业生效。

其中resource_group_name为资源组名称,config_name配置项列表中的配置项名称。

示例:指定在Job型资源组bsptest中执行作业,该作业最多可使用20 ACU。

/*+ resource_group=bsptest,elastic_job_max_acu=20*/SELECT count(*) from test_db.ods_hudi;

资源组内生效

通过SET adb_config <resource_group_name>.<config_name>,使作业配置对某个Job型资源组内执行的所有作业均生效。

其中resource_group_name为资源组名称,config_name配置项列表中的配置项名称。

示例:在Job型资源组bsptest中执行的所有作业,每个作业最多可使用20 ACU。

SET adb_config bsptest.elastic_job_max_acu=20;

查看配置是否生效

查看资源组的作业配置是否生效,可以使用SHOW ADB_CONFIG KEY=<resource_group_name>.<config_name>

集群内生效

通过SET adb_config <config_name>,使作业配置对集群内执行的所有作业均生效。其中config_name配置项列表中的配置项名称。

示例:在集群中执行的所有作业,每个作业最多可使用20 ACU。

SET adb_config elastic_job_max_acu=20;

查看配置是否生效

查看集群的作业配置是否生效,可以使用SHOW ADB_CONFIG KEY=<config_name>

配置项列表

XIHE BSP作业支持的配置项如下。

分类

配置项名称

说明

默认值

资源

elastic_job_max_acu

单个XIHE BSP作业所使用的最大ACU数(包括AppMaster与计算节点)限制。

取值不能超过资源组的计算最大资源的ACU数。

说明

AppMaster节点是负责单次查询的解析、任务调度与执行的节点。

9

超时时间

batch_query_timeout

BSP作业的超时时间,单位:毫秒(ms)。BSP作业的执行时间大于该配置值时,作业会自动取消。

7200000

优先级

query_priority

BSP作业的优先级。

取值:HIGH、NORMAL、LOW和LOWEST。

关于优先级队列,详情请参见Job型资源组的优先级队列

NORMAL

常见问题

如何查看BSP作业的状态

  • 如果是通过作业编辑器提交的BSP作业,可在作业编辑器 > SQL开发页面下方的执行记录页签查看。

  • 如果不是通过作业编辑器提交的BSP作业,可通过information_schema.kepler_meta_elastic_job_list表查看。查询方法如下:

    SELECT status FROM information_schema.kepler_meta_elastic_job_list WHERE process_id='<job_id>';
    说明

    information_schema.kepler_meta_elastic_job_list表中会保存最近30天提交的BSP任务,最多保存1000个。您可对该表进行聚合等进一步统计分析。以下示例为统计各个状态的BSP作业数量。

    SELECT status,count(*) FROM information_schema.kepler_meta_elastic_job_list GROUP BY status;

如何选择BSP作业的同步提交与异步提交方式

同步提交与异步提交功能上并无差别,区别仅在于客户端是否需要等待查询执行完成。

异步提交会有如下限制:

  • 结果集返回最多10000行。

  • 结果集(包括对应的csv文件下载链接)最多保存30天,最多保存1000个。

建议对执行时间较长、计算量较大,但结果集较小的查询(如INSERT INTO SELECTINSERT OVERWRITE SELECTCREATE TABLE AS SELECT等)使用异步提交。