Async-запросы через Celery
Celery
В больших аналитических БД часто бывают запросы, которые выполняются минутами или часами. Чтобы поддерживать долгие запросы, превышающие типичный таймаут веб-запроса (30–60 секунд), нужно настроить асинхронный backend для Liteset:
- один или несколько Liteset-воркеров (реализованы как Celery worker), запускаются командой
celery worker. Для опций —celery worker --help. - celery-брокер (очередь сообщений) — рекомендуется Redis или RabbitMQ.
- results backend, в котором воркер сохраняет результаты запросов.
Для конфигурации Celery нужно задать CELERY_CONFIG в superset_config.py. Воркер и веб-сервер должны использовать одинаковую конфигурацию.
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
Зап уск beat (планировщик периодических задач):
celery --app=superset.tasks.celery_app:app beat
Для results backend нужно передать инстанс класса, унаследованного от flask_caching.backends.base.BaseCache, в RESULTS_BACKEND в superset_config.py. Можно использовать Memcached, Redis, S3 (https://pypi.python.org/pypi/s3werkzeugcache), in-memory или файловую систему (для одиночного сервера или тестов), либо написать свой интерфейс кэша:
# На 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)
# На Redis
from flask_caching.backends.rediscache import RedisCache
RESULTS_BACKEND = RedisCache(
host='localhost', port=6379, key_prefix='superset_results')
Для производительности теперь используется MessagePack и PyArrow для сериализации результатов. При проблемах можно отключить через RESULTS_BACKEND_USE_MSGPACK = False в superset_config.py. При обновлении окружения очистите существующий кэш результатов.
Важное
- Все worker-ноды и веб-серверы в кластере Liteset должны использовать общую БД метаданных. SQLite в этом контексте не работает: у него ограниченная поддержка конкурентности и он обычно лежит на локальной ФС.
- В установке должен быть только один инстанс celery beat. Иначе фоновые задачи будут запланированы несколько раз — двойная доставка отчётов, лишний трафик и т. д.
- SQL Lab выполнит запрос асинхронно только если вы включите Asynchronous Query Execution в настройках БД (Sources → Databases → Edit record).
Celery Flower
Flower — веб-инструмент мониторинга Celery-кластера. Установка:
pip install flower
Запуск:
celery --app=superset.tasks.celery_app:app flower