定时查询加速(Scheduled Query Acceleration)

定时查询加速(SQA,Scheduled Query Acceleration)旨在优化直接从 UDB-SX 发送到外部数据源(例如 Amazon Simple Storage Service(Amazon S3))的查询。它通过自动化来解决管理和刷新索引、视图及数据时常见的问题。

查询加速通过二级索引来实现,例如 跳过索引覆盖索引物化视图。当运行查询时,会使用这些索引而不是直接查询 Amazon S3。

二级索引需要定期刷新以保持与 Amazon S3 数据同步。此刷新操作可以使用内部调度器(在 Spark 内部)或外部调度器来安排。

SQA 提供以下好处:

  • 通过优化资源使用降低成本:SQA 降低了 driver 节点的运行负载,从而减少维持索引和视图自动刷新的相关成本。

  • 增强刷新操作的可观测性:SQA 提供索引状态和刷新时序的可见性,便于洞察数据处理和当前系统状态。

  • 更好地控制刷新计划:SQA 支持灵活的刷新间隔调度,帮助根据具体需求管理资源使用和刷新频率。

  • 简化索引管理:SQA 支持通过单个查询更新索引设置(例如刷新间隔),简化工作流。

前提条件

在配置 SQA 之前,请确认满足以下要求:

  • 确保你运行的是 UDB-SX 2.17 或更高版本。

  • 确保已安装 SQL 插件。SQL 插件包含在大多数 UDB-SX 发行版中。

  • 确保已配置数据源(例如 Amazon S3):已配置跳过索引、覆盖索引或物化视图。这些二级数据结构通过优化发往外部数据源(例如 Amazon S3)的查询来提升查询性能。

  • 配置 Amazon EMR Serverless(用于访问 Apache Spark)。

配置 SQA 设置

如果你想覆盖默认配置值,请更改以下集群设置:

  • 启用异步查询执行:将 plugins.query.executionengine.async_query.enabled 设置为 true(默认值):

    PUT /_cluster/settings
    {
      "transient": {
        "plugins.query.executionengine.async_query.enabled": "true"
      }
    }
    
  • 为异步查询配置外部调度器间隔:此设置定义外部调度器检查任务的频率,允许自定义刷新频率。该设置没有默认值:如果为空,则默认由 udbsx-spark 提供,默认为 5 minutes。根据工作负载量调整间隔有助于优化资源并控制成本:

    PUT /_cluster/settings
    {
      "transient": {
        "plugins.query.executionengine.async_query.external_scheduler.interval": "10 minutes"
      }
    }
    

运行加速查询

你可以在 查询工作台 中运行加速查询。要运行加速查询,请使用以下语法:

CREATE SKIPPING INDEX example_index
WITH (
    auto_refresh = true,
    refresh_interval = '15 minutes'
);

默认情况下,查询使用外部调度器。要使用内部调度器,请将 scheduler_mode 设置为 internal

CREATE SKIPPING INDEX example_index
WITH (
    auto_refresh = true,
    refresh_interval = '15 minutes',
    scheduler_mode = 'internal'
);

参数

在使用加速查询创建索引时,你可以在 WITH 子句中指定以下参数来控制刷新行为、调度和时间。

Parameter Description
auto_refresh 启用索引的自动刷新。如果为 true,索引会在指定间隔内自动刷新。如果为 false,必须使用 REFRESH 语句手动触发刷新。默认值为 false
refresh_interval 定义索引刷新操作之间的时间间隔,决定将新数据摄取到索引的频率。仅在 auto_refresh 启用时适用。间隔可以用如 1 minute10 seconds 的格式指定。有关有效时间单位,请参阅 Time units
scheduler_mode 指定自动刷新使用的调度模式(internal 或 external)。外部调度器需要 checkpoint_location(刷新作业检查点的路径)用于状态管理。有关更多信息,请参阅 Starting streaming queries。有效值为 internalexternal

有关更多信息及其他可用参数,请参阅 Flint index refresh(文档请联系售前工作人员获取)。

时间单位

在定义时间间隔时,你可以使用以下时间单位:

  • 毫秒:msmillisecondmilliseconds

  • 秒:ssecondseconds

  • 分钟:mminuteminutes

  • 小时:hhourhours

  • 天:ddaydays

监控索引状态

要监控索引状态,请使用以下语句:

SHOW FLINT INDEXES IN spark_catalog.default;

管理计划任务

使用以下命令管理计划任务。

禁用任务

要禁用使用内部或外部调度器的自动刷新,请将 auto_refresh 设置为 false

ALTER MATERIALIZED VIEW myglue_test.default.count_by_status_v9 WITH (auto_refresh = false);

更新计划

要更新计划并修改刷新设置,请在 WITH 子句中指定 refresh_interval

ALTER INDEX example_index
WITH (refresh_interval = '30 minutes');

切换调度器模式

要切换调度器模式,请在 WITH 子句中指定 scheduler_mode

ALTER MATERIALIZED VIEW myglue_test.default.count_by_status_v9 WITH (scheduler_mode = 'internal');

检查调度器元数据

要检查调度器元数据,请使用以下请求:

GET /.async-query-scheduler/_search

最佳实践

在使用 SQA 时,建议遵循以下最佳实践。

性能优化

  • 推荐刷新间隔:选择合适的刷新间隔对于在资源使用和系统性能之间取得平衡至关重要。设置间隔时请考虑你的工作负载需求和数据的新鲜度要求。

  • 并发作业限制:限制并发运行的作业数量以避免过载系统资源。监控系统容量并相应调整作业限制以确保最佳性能。

  • 资源使用:有效的资源分配是最大化性能的关键。根据工作负载和查询类型合理分配内存、CPU 和 I/O。

成本管理

  • 使用外部调度器:外部调度器可将刷新操作卸载出去,从而降低对核心 driver 节点的需求。

  • 为用例配置刷新间隔:较长的刷新间隔会降低成本,但可能影响数据新鲜度。

  • 优化刷新计划:根据工作负载模式调整刷新间隔以减少不必要的刷新操作。

  • 监控成本:定期监控与计划查询和刷新操作相关的成本。使用可观测性工具可以帮助你随时间获取资源使用和成本的洞察。

验证设置

你可以通过运行测试查询并验证调度器配置来验证设置是否有效:

SHOW FLINT INDEXES EXTENDED

有关更多信息,请参阅 UDB-SX Spark 文档(该文档可联系售前工作人员获取)。

故障排除

如果刷新操作未按预期触发,请确保已启用 auto_refresh 设置并正确配置了刷新间隔。