Celeryによる非同期クエリ
Celery
大規模な分析データベースでは、数分から数時間かかるクエリを実行することが一般的です。通常のWebリクエストのタイムアウト(30〜60秒)を超える長時間実行されるクエリをサポートするには、Superset用の非同期バックエンドを構成する必要があります。これは以下で構成されます。
- 1つまたは複数のSupersetワーカー(Celeryワーカーとして実装されます)。これは、
celery worker
コマンドで開始でき、関連オプションを表示するにはcelery worker --help
を実行します。 - Celeryブローカー(メッセージキュー)。RedisまたはRabbitMQを使用することをお勧めします。
- ワーカーがクエリ結果を永続化する場所を定義する結果バックエンド
Celeryを構成するには、superset_config.py
でCELERY_CONFIG
を定義する必要があります。ワーカープロセスと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ワーカーを開始するには、次のコマンドを実行します。
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のインスタンスが1つだけ実行されている必要があります。そうしないと、バックグラウンドジョブが複数回スケジュールされ、レポートの重複配信、予想以上の負荷/トラフィックなどの奇妙な動作が発生する可能性があります。
-
SQL Labは、データベース設定([ソース] > [データベース] > [レコードの編集])で非同期クエリ実行を有効にした場合にのみ、クエリを非同期で実行します。
Celery Flower
Flowerは、pipからインストールできるCeleryクラスターを監視するためのWebベースのツールです。
pip install flower
flowerは次を使用して実行できます。
celery --app=superset.tasks.celery_app:app flower