透過 Celery 進行非同步查詢
Celery
在大型分析資料庫上,執行數分鐘或數小時的查詢是很常見的。為了支援超過一般 Web 請求逾時(30-60 秒)的長時間查詢,必須為 Superset 設定一個非同步後端,其中包含:
- 一個或多個 Superset 工作者(實作為 Celery 工作者),可以使用
celery worker
指令啟動,執行celery worker --help
來檢視相關選項。 - 一個 Celery 代理程式(訊息佇列),我們建議使用 Redis 或 RabbitMQ。
- 一個結果後端,用於定義工作者將儲存查詢結果的位置。
設定 Celery 需要在您的 superset_config.py
中定義 CELERY_CONFIG
。工作者和 Web 伺服器程序應具有相同的設定。
class CeleryConfig(object):
broker_url = "redis://127.0.0.1:6379/0"
imports = (
"superset.sql_lab",
"superset.tasks.scheduler",
)
result_backend = "redis://127.0.0.1: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 工作者以利用此設定,請執行以下指令
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')
為了提高效能,結果序列化現在使用 MessagePack 和 PyArrow。如果出現任何問題,可以透過在您的 superset_config.py
中設定 RESULTS_BACKEND_USE_MSGPACK = False
來停用此功能。升級現有環境時,請清除現有的結果快取儲存區。
重要注意事項
-
重要的是,Superset 叢集中的所有工作者節點和 Web 伺服器 *共享一個通用中繼資料資料庫*。這表示 SQLite 在這種情況下將無法運作,因為它對並行性支援有限,並且通常位於本機檔案系統上。
-
在您的整個設定中,*只能有一個正在執行的 celery beat 執行個體*。否則,背景工作可能會被多次排程,導致諸如重複傳遞報表、高於預期的負載/流量等奇怪行為。
-
如果您在資料庫設定(來源 > 資料庫 > 編輯記錄)中啟用 **非同步查詢執行**,SQL Lab *才會非同步執行您的查詢*。
Celery Flower
Flower 是一個基於 Web 的工具,用於監控 Celery 叢集,您可以從 pip 安裝
pip install flower
您可以使用以下方式執行 Flower
celery --app=superset.tasks.celery_app:app flower