跳至主要內容
在 GitHub 上編輯此頁面

透過 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')

為了提高效能,結果序列化現在使用 MessagePackPyArrow。如果出現任何問題,可以透過在您的 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