跳到主要内容

通过 Celery 进行异步查询

Celery

在大型分析数据库上,运行数分钟或数小时的查询是很常见的。为了支持执行时间超出典型 Web 请求超时(30-60 秒)的长运行查询,有必要为 Superset 配置一个异步后端,该后端包括

  • 一个或多个 Superset worker(实现为 Celery worker),可以通过 celery worker 命令启动,运行 celery worker --help 查看相关选项。
  • 一个 Celery 消息代理(消息队列),我们推荐使用 Redis 或 RabbitMQ
  • 一个结果后端,用于定义 worker 将查询结果持久化到何处

配置 Celery 需要在 superset_config.py 中定义 CELERY_CONFIG。Worker 和 Web 服务器进程都应该具有相同的配置。

class CeleryConfig(object):
broker_url = "redis://localhost:6379/0"
imports = (
"superset.sql_lab",
"superset.tasks.scheduler",
)
result_backend = "redis://localhost:6379/0"
worker_prefetch_multiplier = 10
task_acks_late = True
task_annotations = {
"sql_lab.get_sql_results": {
"rate_limit": "100/s",
},
}

CELERY_CONFIG = CeleryConfig

要启动 Celery worker 以利用此配置,请运行以下命令

celery --app=superset.tasks.celery_app:app worker --pool=prefork -O fair -c 4

要启动一个用于调度周期性后台作业的任务,请运行以下命令

celery --app=superset.tasks.celery_app:app beat

要设置结果后端,您需要将 flask_caching.backends.base 中的 BaseCache 派生类实例传递给 superset_config.py 中的 RESULTS_BACKEND 配置键。您可以使用 Memcached、Redis、S3 (https://pypi.python.org/pypi/s3werkzeugcache)、内存或文件系统(在单服务器设置或测试中),或者编写自己的缓存接口。您的 superset_config.py 可能如下所示

# On S3
from s3cache.s3cache import S3Cache
S3_CACHE_BUCKET = 'foobar-superset'
S3_CACHE_KEY_PREFIX = 'sql_lab_result'
RESULTS_BACKEND = S3Cache(S3_CACHE_BUCKET, S3_CACHE_KEY_PREFIX)

# On Redis
from flask_caching.backends.rediscache import RedisCache
RESULTS_BACKEND = RedisCache(
host='localhost', port=6379, key_prefix='superset_results')

为了提高性能,现在使用 MessagePackPyArrow 进行结果序列化。如果出现任何问题,可以在 superset_config.py 中设置 RESULTS_BACKEND_USE_MSGPACK = False 来禁用此功能。升级现有环境时,请清除您现有的结果缓存存储。

重要提示

  • 重要的是,Superset 集群中的所有 worker 节点和 Web 服务器都共享一个通用的元数据数据库。这意味着 SQLite 在此上下文中将无法工作,因为它对并发性的支持有限,并且通常位于本地文件系统上。

  • 在您的整个设置中,应该只运行一个 Celery beat 实例。否则,后台作业可能会被多次调度,导致奇怪的行为,例如报告重复发送、负载/流量高于预期等。

  • SQL Lab 只有在您在数据库设置中(来源 > 数据库 > 编辑记录)启用异步查询执行时才会异步运行您的查询。

Celery Flower

Flower 是一个用于监控 Celery 集群的基于 Web 的工具,您可以通过 pip 安装它

pip install flower

您可以使用以下命令运行 flower

celery --app=superset.tasks.celery_app:app flower